Seguridad OAuth2: autenticación y autorización

GeoNode interactúa con GeoServer a través de un mecanismo de seguridad avanzado basado en el protocolo OAuth2 y GeoFence.Esta sección es un recorrido por la configuración y configuración de GeoNode y GeoServer Advanced Security.

Lo que veremos en este apartado es:

  • Introducción

  • GeoNode (Backend de seguridad):

    1. Autenticación Django

    2. Instalación y configuración del kit de herramientas Django OAuth

    3. Detalles sobre la configuración de seguridad settings.py

  • GeoServer (backend de seguridad):

    1. Subsistema de seguridad GeoServer

    2. Introducción al complemento de seguridad GeoServer OAuth2

    3. Configuración del Servicio de rol REST de GeoNode

    4. Configuración del Filtro de autenticación GeoNode OAuth2

    5. Las cadenas de filtros de autenticación de GeoServer

    6. Introducción al complemento GeoFence, el marco de seguridad avanzado para GeoServer

  • Solución de problemas y funciones avanzadas:

    1. Problemas comunes y soluciones

    2. Cómo configurar puntos finales seguros HTTPS

    3. Funciones avanzadas de GeoFence

Introducción

GeoServer, es decir, el servidor backend geoespacial de GeoNode, es un servidor espacial que necesita usuarios autenticados para acceder a recursos protegidos o funciones de administración.

GeoServer admite varios tipos de mecanismos de autenticación y autorización.Esos sistemas son conectables y GeoServer puede usarlos al mismo tiempo mediante el uso de una Cadena de filtros.Brevemente, este mecanismo permite a GeoServer verificar diferentes protocolos A&A uno por uno.GeoServer utiliza la primera coincidencia para autorizar a los usuarios.

La autenticación GeoNode se basa de forma predeterminada en el subsistema de seguridad Django.La autenticación de Django permite a GeoNode administrar sus usuarios, grupos, roles y sesiones internos.

GeoNode tiene algunos componentes externos, como GeoServer o QGis Server, que son servicios conectables e independientes, dedicados a la gestión de datos geoespaciales.Esos servicios externos tienen sus propios mecanismos de autenticación y autorización que deben sincronizarse de alguna manera con el de GeoNode.Además, esos servicios externos mantienen, en la mayoría de los casos y a menos que una configuración específica no lo desactive, un acceso de seguridad alternativo que, por ejemplo, permite a GeoNode modificar el catálogo geoespacial bajo el capó, o que un administrador del sistema tenga acceso independiente y privilegiado a los servidores.

Antes de profundizar en cómo funciona GeoServer/GeoNode A&A y cómo se puede configurar para que funcione correctamente con GeoNode, aclaremos rápidamente la diferencia entre los conceptos de Autenticación y Autorización.

Autenticación

La autenticación es el proceso de verificar la identidad de alguien mediante el uso de algún tipo de credenciales y un protocolo de protocolo de enlace.Si las credenciales son válidas, se inicia el proceso de autorización.El proceso de autenticación siempre continúa con el proceso de autorización (aunque a menudo pueden parecer combinados).Los dos términos se utilizan a menudo como sinónimos, pero son dos procesos diferentes.

Para obtener más detalles y explicaciones sobre los conceptos de autenticación, consulte aquí.

Autorización

La autorización es el proceso de permitir que los usuarios autenticados accedan a recursos protegidos verificando sus roles y derechos con algún tipo de mecanismo o protocolo de reglas de seguridad.En otras palabras, permite controlar los derechos de acceso otorgando o denegando permisos específicos a usuarios autorizados específicos.

Backend de seguridad de GeoNode

Autenticación de DJango

El sistema de autenticación de Django maneja tanto la autenticación como la autorización.

El sistema de autenticación consta de:

  1. Usuarios

  2. Permisos: indicadores binarios (sí/no) que designan si un usuario puede realizar una determinada tarea.

  3. Grupos: una forma genérica de aplicar etiquetas y permisos a más de un usuario.

  4. Un sistema de hash de contraseñas configurable

  5. Formularios y herramientas de visualización para iniciar sesión como usuario o restringir contenido

  6. Un sistema backend conectable

El sistema de autenticación en Django pretende ser muy genérico y no proporciona algunas características que se encuentran comúnmente en los sistemas de autenticación web.Se han implementado soluciones para algunos de estos problemas comunes en paquetes de terceros:

  1. Comprobación de seguridad de la contraseña

  2. Limitación de intentos de inicio de sesión

  3. Autenticación frente a terceros (OAuth, por ejemplo)

Nota

Para obtener más detalles sobre la instalación y configuración del sistema de autenticación Django, consulte la guía oficial https://docs.djangoproject.com/en/3.2/topics/auth/.

GeoNode se comunica con GeoServer a través de Autenticación Básica interna, para poder configurar los datos y el catálogo de GeoServer.

Para hacer esto, debe asegurarse de que GeoNode conozca el usuario administrador interno y la contraseña de GeoServer.

Advertencia

Debe ser un usuario interno de GeoServer con derechos de administrador, no uno de GeoNode.

Asegúrese de que las credenciales estén configuradas correctamente en el archivo settings.py

SERVIDOR_OGC

Asegúrese de que la configuración de OGC_SERVER esté configurada correctamente.

Observe que las dos propiedades LOGIN_ENDPOINT y LOGOUT_ENDPOINT deben especificar los puntos finales de GeoServer OAuth2 (consulte los detalles a continuación).Los valores predeterminados 'j_spring_oauth2_geonode_login' y 'j_spring_oauth2_geonode_logout' funcionan en la mayoría de los casos, a menos que necesites algún punto final específico diferente al anterior.En cualquier caso, esos valores deben ser coherentes con la configuración del complemento GeoServer OAuth2.

En caso de duda, utilice los valores predeterminados que aparecen a continuación.

Los valores predeterminados son:

...
# OGC (WMS/WFS/WCS) Server Settings
# OGC (WMS/WFS/WCS) Server Settings
OGC_SERVER = {
    'default': {
        'BACKEND': 'geonode.geoserver',
        'LOCATION': GEOSERVER_LOCATION,
        'LOGIN_ENDPOINT': 'j_spring_oauth2_geonode_login',
        'LOGOUT_ENDPOINT': 'j_spring_oauth2_geonode_logout',
        # PUBLIC_LOCATION needs to be kept like this because in dev mode
        # the proxy won't work and the integration tests will fail
        # the entire block has to be overridden in the local_settings
        'PUBLIC_LOCATION': GEOSERVER_PUBLIC_LOCATION,
        'USER': 'admin',
        'PASSWORD': 'geoserver',
        'MAPFISH_PRINT_ENABLED': True,
        'PRINT_NG_ENABLED': True,
        'GEONODE_SECURITY_ENABLED': True,
        'WMST_ENABLED': False,
        'BACKEND_WRITE_ENABLED': True,
        'WPS_ENABLED': False,
        'LOG_FILE': '%s/geoserver/data/logs/geoserver.log' % os.path.abspath(os.path.join(PROJECT_ROOT, os.pardir)),
        # Set to name of database in DATABASES dictionary to enable
        'DATASTORE': '',  # 'datastore',
        'TIMEOUT': 10  # number of seconds to allow for HTTP requests
    }
}
...

Interacción GeoNode y GeoServer A&A

La instancia de GeoServer utilizada por GeoNode tiene una configuración particular que permite que los dos marcos interactúen e intercambien correctamente información sobre las credenciales y permisos de los usuarios.

En particular, GeoServer está configurado con una Cadena de filtros para autorización que hace uso de los dos protocolos siguientes:

  1. Autenticación básica;este es el mecanismo de autenticación de GeoServer predeterminado.Esto hace uso de rfc2617 - Autenticación de acceso básico y implícito para verificar las credenciales del usuario.

    En otras palabras, GeoServer toma un nombre de usuario y una contraseña codificada en Base64 en los encabezados de solicitud HTTP y los compara con su base de datos interna (que de forma predeterminada es un archivo XML cifrado en el directorio de datos de GeoServer).Si las credenciales del usuario coinciden, entonces GeoServer verifica la autorización a través de sus Servicios de rol (veremos esos servicios en detalle en la sección GeoServer (Backend de seguridad) a continuación).

    Nota

    GeoServer se envía de forma predeterminada con admin y geoserver como nombre de usuario y contraseña de administrador predeterminados.Antes de poner en línea el GeoServer es imperativo cambiar al menos la contraseña del administrador.

  2. Autenticación OAuth2;este módulo permite a GeoServer autenticarse contra el Protocolo OAuth2.Si la autenticación básica falla, GeoServer recurre a ella utilizando GeoNode como proveedor OAuth2 de forma predeterminada.

Nota

Se pueden encontrar más detalles directamente en la documentación oficial de GeoServer en la sección «Cadena de autenticación»

Desde el lado del backend (servidor) de GeoNode, el servidor utilizará la Autenticación básica con credenciales de administrador para configurar el catálogo de GeoServer.GeoNode debe poder acceder a GeoServer, por supuesto, y GeoNode debe conocer las credenciales de administrador internas de GeoServer.

Desde el lado del frontend de GeoNode (navegador y GUI), el objetivo de Autenticación es permitir que GeoServer reconozca como válido a un usuario que ya ha iniciado sesión en GeoNode, proporcionando una especie de mecanismo SSO entre las dos aplicaciones.

GeoServer debe conocer y poder acceder a GeoNode a través de HTTP/HTTPS.En otras palabras, un usuario externo conectado a GeoNode debe autenticarse en GeoServer con los mismos permisos.Esto es posible a través del protocolo Autenticación OAuth2.

Mecanismo de autenticación de GeoNode/GeoServer

GeoNode como proveedor OAuth2 (OP)

OpenID Connect es un marco de identidad creado sobre el protocolo OAuth 2.0 que amplía la autorización de los procesos OAuth 2.0 para implementar su mecanismo de autenticación.OpenID Connect agrega un mecanismo de descubrimiento que permite a los usuarios utilizar una autoridad confiable externa como proveedor de identidad.Desde otro punto de vista, esto puede verse como un sistema de inicio de sesión único (SSO).

OAuth 2.0 es un marco de autorización que es capaz de proporcionar una forma para que los clientes accedan a un recurso con acceso restringido en nombre del propietario del recurso.OpenID Connect permite a los clientes verificar a los usuarios con una autenticación basada en un servidor de autorización.

Como OP, GeoNode podrá actuar como proveedor de identidad confiable, permitiendo así que el sistema funcione en un entorno aislado y/o permitir que GeoNode autentique a usuarios privados administrados por el subsistema de autenticación local de DJango.

GeoServer como parte de confianza (RP) de OAuth2

Gracias a la Autenticación OAuth2, GeoServer puede recuperar la identidad de un usuario final directamente desde el Proveedor OAuth2 (OP).

Con GeoNode actuando como OP, el mecanismo evitará el uso de cookies confiando, en cambio, en el protocolo seguro OAuth2.

Cómo funciona el protocolo OAuth2:

../../_images/oauth001.png
  1. La parte que confía envía la solicitud al proveedor de OAuth2 para autenticar al usuario final.

  2. El proveedor de identidad OAuth2 autentica al usuario

  3. El proveedor de OAuth2 envía el token de identificación y el token de acceso a la parte de confianza

  4. La parte que confía envía una solicitud al usuario info punto final con el token de acceso recibido del proveedor OAuth2

  5. La información del usuario punto final devuelve los reclamos.

Mecanismo de autorización de GeoNode/GeoServer

Sin embargo, permitir que GeoServer utilice OAuth2 para actuar como RP OAuth2 no es suficiente para asignar una identidad de usuario a sus roles.

En el lado de GeoServer, todavía necesitaremos un RoleService que pueda comunicarse con GeoNode y transformar los tokens en un usuario principal para usar dentro del propio subsistema de seguridad de GeoServer.

En otras palabras, después de una autenticación exitosa, GeoServer necesita autorizar al usuario para comprender a qué recursos puede acceder o no.Un RoleService basado en REST en el lado de GeoNode permite que GeoServer se comunique con GeoNode a través de REST para obtener el usuario actual junto con la lista de sus roles.

Sin embargo, conocer los Roles asociados a un usuario no es suficiente.La Autorización completa del GeoServer necesita capturar un conjunto de Reglas de Acceso, asociadas a los Roles, para establecer qué recursos y datos son accesibles por el usuario.

La autorización de GeoServer se basa únicamente en roles, por lo tanto, para cada usuario autenticado también necesitamos saber:

  1. Los Roles asociados a una sesión de usuario válida

  2. Los permisos de acceso asociados a un recurso GeoServer

El mecanismo de autenticación anterior permite a GeoServer obtener información sobre el usuario y sus roles, lo que aborda el punto 1.

Respecto al punto 2, GeoServer utiliza el complemento GeoFence Embedded Server.GeoFence es una aplicación web Java que proporciona un motor de autenticación/autorización avanzado para GeoServer utilizando la interfaz descrita en aquí.GeoFence tiene su propia base de datos de reglas para la gestión de reglas de autorización y anula el sistema de gestión de seguridad estándar de GeoServer mediante la implementación de un sofisticado administrador de acceso a recursos.Por último, pero no por último, GeoFence implementa y expone una API REST que permite a los clientes remotos autorizados leer/escribir/modificar reglas de seguridad.

Las ventajas de utilizar dicho complemento son múltiples:

  1. Las reglas de Autorizaciones tienen una granularidad fina.Las reglas de seguridad son manejadas por GeoFence de manera similar a las de iptables, y permiten definir restricciones de seguridad incluso en subregiones y atributos de capas.

  2. GeoFence expone una interfaz REST a su base de datos de reglas interna, lo que permite a los administradores externos actualizar las restricciones de seguridad mediante programación.

  3. GeoFence implementa un mecanismo de almacenamiento en caché interno que mejora considerablemente el rendimiento bajo carga.

Interacción del GeoNode con GeoFence

El propio GeoNode puede enviar/administrar reglas de autorización a GeoServer a través de GeoFence REST API, actuando como administrador de GeoServer.GeoNode configura correctamente las reglas de GeoFence en cualquier momento que sea necesario, es decir, los permisos de un Recurso/Capa se actualizan.

GeoServer debe conocer y poder acceder a GeoNode a través de HTTP/HTTPS.En otras palabras, un usuario externo conectado a GeoNode debe autenticarse en GeoServer con los mismos permisos.Esto es posible a través de GeoNodeCoockieProcessingFiler.

Resumiendo tendremos diferentes formas de acceder a las Capas de GeoNode:

  1. A través de GeoNode mediante autenticación DJango y GeoNodeCoockieProcessingFiler;Básicamente los usuarios disponibles en GeoNode también son válidos para GeoServer o cualquier otro backend.

    Advertencia

    Si un usuario de GeoNode tiene derechos de «administrador», también podrá administrar GeoServer.

  2. A través del Subsistema de Seguridad GeoServer;Siempre será posible acceder a GeoServer utilizando su sistema de seguridad interno y sus usuarios, a menos que esté explícitamente deshabilitado (advertencia esto es peligroso, debes saber lo que estás haciendo).

Veamos ahora en detalle cómo se configuran las piezas individuales y cómo se pueden configurar.

Configuración y configuración del kit de herramientas DJango OAuth

Como se indicó anteriormente, GeoNode utiliza el protocolo OAuth2 para todas las interacciones frontend con GeoServer.GeoNode debe configurarse como proveedor OAuth2 y proporcionar un ID de cliente y una clave Client Sercret a GeoServer.Esto es posible habilitando y configurando el Complemento Django OAuth Toolkit.

Advertencia

GeoNode y GeoServer no funcionarán en absoluto si no se ejecutan los siguientes pasos en la primera instalación.

Configuración de seguridad predeterminada settings.py para OAuth2

Verifique que el proveedor OAuth2 y el complemento de seguridad estén habilitados y que las configuraciones a continuación estén configuradas correctamente.

AUTH_IP_WHITELIST

La propiedad AUTH_IP_WHITELIST limita el acceso a usuarios/grupos REST Role Service punto finals a las únicas direcciones IP incluidas en la lista blanca.Lista vacía significa «permitir todo».Si necesita limitar las llamadas REST “api” solo a algunas IP específicas, complete la lista de esta manera: AUTH_IP_WHITELIST = ['192.168.1.158', '192.168.1.159']

Los valores predeterminados son:

...
AUTH_IP_WHITELIST = []
...

INSTALLED_APPS

Para permitir que GeoNode actúe como proveedor de OAuth2, necesitamos habilitar la aplicación DJango oauth2_provider proporcionada por el «Django OAuth Toolkit».

Los valores predeterminados son:

...
INSTALLED_APPS = (

    'modeltranslation',

    ...
    'guardian',
    'oauth2_provider',
    ...

) + GEONODE_APPS
...

MIDDLEWARE_CLASSES

Instalar la aplicación DJango oauth2_provider` no es suficiente para habilitar la funcionalidad completa.También necesitamos que GeoNode incluya entidades adicionales en su modelo interno.

Los valores predeterminados son:

...
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',

    # The setting below makes it possible to serve different languages per
    # user depending on things like headers in HTTP requests.
    'django.middleware.locale.LocaleMiddleware',
    'pagination.middleware.PaginationMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

    # If you use SessionAuthenticationMiddleware, be sure it appears before OAuth2TokenMiddleware.
    # SessionAuthenticationMiddleware is NOT required for using django-oauth-toolkit.
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'oauth2_provider.middleware.OAuth2TokenMiddleware',
)
...

AUTHENTICATION_BACKENDS

Para permitir que GeoNode actúe como proveedor de OAuth2, necesitamos habilitar el backend de DJango oauth2_provider.backends.OAuth2Backend proporcionado por el «Django OAuth Toolkit».También tenga en cuenta que debemos especificar los alcances del proveedor OAuth2 y declarar qué «generador» usar para crear «ID de cliente OAuth2».

Los valores predeterminados son:

...
# Replacement of default authentication backend in order to support
# permissions per object.
AUTHENTICATION_BACKENDS = (
    'oauth2_provider.backends.OAuth2Backend',
    'django.contrib.auth.backends.ModelBackend',
    'guardian.backends.ObjectPermissionBackend',
)

OAUTH2_PROVIDER = {
    'SCOPES': {
        'read': 'Read scope',
        'write': 'Write scope',
        'groups': 'Access to your groups'
    },

    'CLIENT_ID_GENERATOR_CLASS': 'oauth2_provider.generators.ClientIdGenerator',
}
...

Configuración de administración del kit de herramientas Django OAuth

Una vez que settings.py y local_settings.py se hayan configurado correctamente para su sistema:

  1. Complete los pasos de configuración de GeoNode

    • preparar el modelo

      python manage.py makemigrations
      python manage.py migrate
      python manage.py syncdb
      
    • Preparar los datos estáticos.

      python manage.py collectstatic
      
    • Asegúrese de que la base de datos se haya completado con los datos predeterminados iniciales.

      Advertencia

      En desuso este comando será reemplazado por migraciones en el futuro, así que tenga cuidado.

      python manage.py loaddata initial_data.json
      
    • Asegúrese de que exista un superusuario para su entorno

      Advertencia

      En desuso este comando será reemplazado por migraciones en el futuro, así que tenga cuidado.

      python manage.py createsuperuser
      

    Nota

    Lea los tutoriales básicos en la documentación de GeoNode Developer para obtener detalles sobre los comandos específicos y cómo usarlos.

  2. Iniciar la aplicación

    Inicie GeoNode de acuerdo con cómo se realizó la configuración;ejecute el modo de depuración a través de paver, o mediante proxy mediante un servidor HTTP como Apache2 HTTPD, Nginx u otros.

  3. Finalice la configuración del proveedor OAuth2

    En primer lugar, debe configurar y crear una nueva aplicación OAuth2 llamada GeoServer a través del panel de administración de GeoNode.

    • Acceda al panel de administración de GeoNode

      ../../_images/oauth002.png
    • Vaya a Django OAuth Toolkit > Aplicaciones

      ../../_images/oauth003.png
    • Actualizar o crear la Aplicación denominada GeoServer

      Advertencia

      El nombre de la aplicación debe ser GeoServer

      ../../_images/oauth004.png
      • Identificación del cliente;Un código alfanumérico que representa el ID del cliente OAuth2.El complemento GeoServer OAuth2 utilizará este** valor.

        Advertencia

        En un entorno de producción, se recomienda altamente modificar el valor predeterminado proporcionado con la instalación de GeoNode.

      • Usuario;Busque el usuario admin.Su ID se actualizará automáticamente en el formulario.

      • Redirigir URL;Es posible especificar muchos URI aquí.Estos deben coincidir con los URI de las instancias de GeoServer.

      • Tipo de cliente;Elija Confidencial

      • Tipo de concesión de autorización;Elija Código de autorización

      • Secreto del cliente;Un código alfanumérico que representa el secreto del cliente OAuth2.El complemento GeoServer OAuth2 utilizará este** valor.

        Advertencia

        En un entorno de producción, se recomienda altamente modificar el valor predeterminado proporcionado con la instalación de GeoNode.

      • Nombre;**Debe** ser GeoServer

Backend de seguridad de GeoServer

Subsistema de seguridad GeoServer

GeoServer tiene un subsistema de seguridad robusto, inspirado en Spring Security.La mayoría de las funciones de seguridad están disponibles a través de la interfaz de administración web.

Para obtener más detalles sobre cómo funciona y cómo configurarlo y modificarlo, consulte la guía oficial de GeoServer http://docs.geoserver.org/stable/en/user/security/webadmin/index.html

Al utilizar el GeoServer Data Dir proporcionado con la compilación GeoNode, la siguiente configuración ya está disponible.Sólo necesitará actualizarlos de acuerdo con su entorno (como direcciones IP y nombres de host, claves OAuth2 y cosas similares).Sin embargo, se recomienda leer atentamente los siguientes pasajes para comprender exactamente cómo se configuran los diferentes componentes e identificar fácilmente cualquier posible problema durante la implementación.

Los principales temas de esta sección son:

  1. Conexión al servicio de rol REST de GeoNode

  2. Configuración del filtro de autenticación GeoServer OAuth2

  3. Configuración de las cadenas de filtros del GeoServer

  4. Configuración y prueba del servidor GeoFence y reglas predeterminadas

Conexión al servicio de rol REST de GeoNode

Controles preliminares

  • GeoServer está en funcionamiento y usted tiene derechos de administrador

  • GeoServer debe llegar a la instancia de GeoNode a través de HTTP

  • Se debe permitir que la dirección IP del host de GeoServer acceda a las API del servicio de rol de GeoNode (consulte la sección AUTH_IP_WHITELIST más arriba)

Configuración del servicio de rol REST de GeoNode

  1. Inicie sesión como admin en la GUI de GeoServer

    Advertencia

    En un sistema de producción recuerde cambiar las credenciales de administrador predeterminadas admin geoserver

    ../../_images/oauth005.png
  2. Accede a la sección Seguridad > Usuarios, Grupos, Roles

    ../../_images/oauth006.png
  3. Si aún no está configurado el servicio servicio de rol REST de geonode, haga clic en Servicios de rol > Agregar nuevo

    Nota

    Este pasaje no es necesario si el servicio de rol REST del geonode ya se ha creado.Si es así, se mostrará en la lista de Servicios de rol.

    ../../_images/oauth008.png
    ../../_images/oauth007.png
  4. Si aún no está configurado el servicio geonode REST role service, elija AuthKEY REST - Role service from REST punto final

    ../../_images/oauth009.png
  5. Cree/actualice el servicio de rol REST de geonode en consecuencia

    ../../_images/oauth010.png
    • Nombre;**Debe** ser servicio de rol REST de geonode

    • URL del servidor base;Debe apuntar a la URL base de la instancia de GeoNode (por ejemplo, http://<geonode_host_url>)

    • Roles Punto final REST;Ingrese /api/roles

    • Punto final REST de función de administrador;Ingrese /api/adminRole

    • Punto final REST de usuarios;Ingrese /api/usuarios

    • Ruta JSON de roles;Ingrese $.grupos

    • Ruta JSON del rol de administrador;Introduzca $.adminRole

    • Ruta JSON de usuarios;Ingrese $.usuarios[0].grupos

    Una vez que todo haya sido configurado y esté funcionando, elija Rol de administrador y Rol de administrador de grupo como ROLE_ADMIN

Permitir que GeoFence valide reglas con ROLES

Advertencia

Las siguientes instrucciones son diferentes según la versión de GeoServer que esté utilizando actualmente.

GeoServer 2.9.x y 2.10.x

  1. Accede a la sección Seguridad > Configuración

    ../../_images/oauth011.png
  2. Elija el servicio de rol REST de geonode como servicio de rol activo

    ../../_images/oauth012.png

GeoServer 2.12.x y superior

Con las últimas actualizaciones del complemento GeoFence, este último ya no reconoce el servicio de rol desde la configuración predeterminada, sino desde el archivo geofence-server.properties.

Dicho esto, es importante que el servicio de función Seguridad > Configuración esté configurado en predeterminado, para permitir que GeoServer siga la cadena de autorización estándar.

Por otro lado, deberá asegurarse de que el archivo geofence-server.properties en la carpeta $GEOSERVER_DATA_DIR/geofence contenga las siguientes dos propiedades adicionales:

gwc.context.suffix=gwc
org.geoserver.rest.DefaultUserGroupServiceName=geonode REST role service

Configuración del filtro de autenticación GeoServer OAuth2

Ahora es necesario verificar que GeoServer pueda conectarse a proveedores OAuth2 (específicamente a GeoNode OP) y poder autenticar usuarios a través de él.

Controles preliminares

  • GeoServer está en funcionamiento y usted tiene derechos de administrador

  • GeoServer debe llegar a la instancia de GeoNode a través de HTTP

  • OAuth2 Client ID y Client Secret se han generado en GeoNode y se conocen

Configuración del filtro de seguridad GeoNode OAuth2

  1. Accede a la sección Seguridad > Autenticación

    ../../_images/oauth013.png
  2. Si aún no está configurado el filtro de autenticación geonode-oauth2 - Autenticación usando un GeoNode OAuth2, haga clic en Filtros de autenticación > Agregar nuevo

    Nota

    Este pasaje no es necesario si ya se ha creado geonode-oauth2 - Autenticación mediante un GeoNode OAuth2.Si es así, se mostrará entre la lista de filtros de autenticación.

    ../../_images/oauth015.png
    ../../_images/oauth014.png
  3. Si aún no está configurado el filtro de autenticación geonode-oauth2 - Autenticación usando un GeoNode OAuth2, elija GeoNode OAuth2 - Se autentica buscando una clave de token de acceso de GeoNode OAuth2 válida enviada como parámetro de URL

    ../../_images/oauth016.png
  4. Cree/actualice geonode-oauth2 - Autenticación usando un GeoNode OAuth2 en consecuencia

    ../../_images/oauth017.png
    • Nombre;**Debe** ser geonode-oauth2

    • Habilitar punto de entrada de autenticación de redireccionamiento;Se recomienda poner esto en False; de lo contrario, GeoServer no le permitirá conectarse a su GUI de administración a través del Formulario, sino solo a través de GeoNode.

    • Punto final de autenticación de inicio de sesión;A menos que tenga necesidades específicas, mantenga el valor predeterminado /j_spring_oauth2_geonode_login

    • Punto final de autenticación de cierre de sesión;A menos que tenga necesidades específicas, mantenga el valor predeterminado /j_spring_oauth2_geonode_logout

    • Forzar acceso al token URI HTTPS Protocolo seguro;Esto debe ser «Falso» a menos que haya habilitado una «Conexión segura» en GeoNode.En ese caso, deberá confiar en el Certificado de GeoNode en el almacén de claves JVM de GeoServer.Por favor vea los detalles a continuación

    • URI del token de acceso;Establezca esto en http://<geonode_host_base_url>/o/token/

    • Forzar autorización de usuario URI HTTPS Protocolo seguro;Esto debe ser «Falso» a menos que haya habilitado una «Conexión segura» en GeoNode.En ese caso, deberá confiar en el Certificado de GeoNode en el almacén de claves JVM de GeoServer.Por favor vea los detalles a continuación

    • URI de autorización de usuario;Establezca esto en http://<geonode_host_base_url>/o/authorize/

    • Redireccionar URI;Establezca esto en http://<geoserver_host>/geoserver.Esta dirección debe estar presente en Redirect uris de GeoNode OAuth2 > Aplicaciones > GeoServer (ver arriba)

    • Verificar URL del punto final del token;Establezca esto en http://<geonode_host_base_url>/api/o/v4/tokeninfo/

    • URI de cierre de sesión;Establezca esto en http://<geonode_host_base_url>/account/logout/

    • Alcances;A menos que tenga necesidades específicas, mantenga el valor predeterminado lectura, escritura, grupos

    • ID de cliente;La clave alfanumérica Client id generada por el GeoNode OAuth2 > Aplicaciones > GeoServer (ver arriba)

    • Secreto del cliente;La clave alfanumérica Client secret generada por el GeoNode OAuth2 > Aplicaciones > GeoServer (ver arriba)

    • Fuente de rol;Para autorizar al usuario contra GeoNode, elija Servicio de rol > Servicio de rol REST de geonode

Configuración de las cadenas de filtros del GeoServer

Los siguientes pasos garantizan que GeoServer pueda adoptar más métodos de autenticación.Como se indicó anteriormente, es posible autenticarse en GeoServer utilizando diferentes protocolos.

GeoServer escanea la cadena de filtros de autenticación asociada a la ruta especificada y los prueba uno por uno de forma secuencial.El primero que coincide con el protocolo y puede otorgar acceso al usuario, rompe el ciclo creando un User Principal e inyectándolo en el GeoServer SecurityContext.El proceso de Autenticación entonces termina aquí y el control pasa al de Autorización, el cual intentará recuperar los Roles del usuario autenticado a través de los Servicios de Roles GeoServer disponibles asociados al Filtro de Autenticación que otorgó el acceso.

Controles preliminares

  • GeoServer está en funcionamiento y usted tiene derechos de administrador

  • GeoServer debe llegar a la instancia de GeoNode a través de HTTP

  • El filtro de autenticación geonode-oauth2 - Autenticación mediante un GeoNode OAuth2 y el servicio de rol REST geonode se han configurado correctamente

Configuración de las cadenas de filtros de GeoServer

  1. Accede a la sección Seguridad > Autenticación

    ../../_images/oauth013.png
  2. Identificar la sección Cadenas de filtros

    ../../_images/oauth018.png
  3. Asegúrese de que la cadena de filtros web esté configurada como se muestra a continuación

    ../../_images/oauth019.png

    Advertencia

    Cada vez que modifiques una cadena de filtros, no olvides guardar la configuración de Autenticación.Esto debe hacerse para cada cambio.

    ../../_images/oauth020.png
  4. Asegúrese de que la cadena de filtros rest esté configurada como se muestra a continuación

    ../../_images/oauth021.png

    Advertencia

    Cada vez que modifiques una cadena de filtros, no olvides guardar la configuración de Autenticación.Esto debe hacerse para cada cambio.

    ../../_images/oauth020.png
  5. Asegúrese de que la cadena de filtros gwc esté configurada como se muestra a continuación

    ../../_images/oauth022.png

    Advertencia

    Cada vez que modifiques una cadena de filtros, no olvides guardar la configuración de Autenticación.Esto debe hacerse para cada cambio.

    ../../_images/oauth020.png
  6. Asegúrese de que la cadena de filtros predeterminada esté configurada como se muestra a continuación

    ../../_images/oauth023.png

    Advertencia

    Cada vez que modifiques una cadena de filtros, no olvides guardar la configuración de Autenticación.Esto debe hacerse para cada cambio.

    ../../_images/oauth020.png
  7. Agregue los Puntos finales de inicio de sesión de GeoNode a la lista delimitada por comas de la cadena de filtros webLogin

    ../../_images/oauth024.png

    Advertencia

    Cada vez que modifiques una cadena de filtros, no olvides guardar la configuración de Autenticación.Esto debe hacerse para cada cambio.

    ../../_images/oauth020.png
  8. Agregue los Puntos finales de cierre de sesión de GeoNode a la lista delimitada por comas de la cadena de filtros webLogout

    ../../_images/oauth025.png

    Advertencia

    Cada vez que modifiques una cadena de filtros, no olvides guardar la configuración de Autenticación.Esto debe hacerse para cada cambio.

    ../../_images/oauth020.png
  9. Agregue los Puntos finales de cierre de sesión de GeoNode a la lista delimitada por comas del nodo XML formLogoutChain en <GEOSERVER_DATA_DIR>/security/filter/formLogout/config.xml

    Necesitará un editor de texto para modificar el archivo.

    Nota

    Si el nodo XML <formLogoutChain> no existe en absoluto, cree uno nuevo como se especifica a continuación

    <logoutFilter>
      ...
      <redirectURL>/web/</redirectURL>
      <formLogoutChain>/j_spring_security_logout,/j_spring_security_logout/,/j_spring_oauth2_geonode_logout,/j_spring_oauth2_geonode_logout/</formLogoutChain>
    </logoutFilter>
    

    Advertencia

    El valor j_spring_oauth2_geonode_logout debe ser el mismo especificado que Logout Authentication EndPoint en geonode-oauth2 - Autenticación usando un GeoNode OAuth2 anterior.

Configuración y prueba del servidor GeoFence y reglas predeterminadas

Para funcionar correctamente, GeoServer necesita que el complemento GeoFence Embedded Server esté instalado y configurado en el sistema.

La configuración de GeoServer proporcionada para GeoNode tiene el complemento ya instalado con una configuración predeterminada.En ese caso, verifique que el complemento funcione correctamente y que las reglas predeterminadas se hayan configurado siguiendo los siguientes pasos.

Controles preliminares

  • GeoServer está en funcionamiento y usted tiene derechos de administrador

  • El complemento GeoFence Embedded Server se ha instalado en GeoServer

Configuración de las cadenas de filtros de GeoServer

  1. Accede a la sección Seguridad > Autenticación

    ../../_images/oauth013.png
  2. Identifique la sección Proveedores de autenticación y asegúrese de que el Proveedor de autenticación geofence esté presente

    ../../_images/oauth032.png
  3. Asegúrese de que la Cadena de proveedores esté configurada como se muestra a continuación

    ../../_images/oauth033.png

    Advertencia

    Cada vez que modifique un proveedor de autenticación, no olvide guardar la configuración de Autenticación.Esto debe hacerse para cada cambio.

    ../../_images/oauth020.png

Configuración del servidor GeoFence y reglas

  1. Asegúrese de que el servidor GeoFence funcione y que la configuración predeterminada esté configurada correctamente

    • Accede a la sección Seguridad > GeoFence

      ../../_images/oauth026.png
    • Asegúrese de que las Opciones estén configuradas de la siguiente manera y que el servidor funcione bien al realizar una Conexión de prueba

      ../../_images/oauth027.png
      • Permitir capas remotas y en línea en SLD;Configúrelo en Verdadero

      • Permitir parámetros SLD y SLD_BODY en solicitudes;Configúrelo en Verdadero

      • Los usuarios autenticados pueden escribir;Configúrelo en Verdadero

      • Utilice roles de GeoServer para obtener autorizaciones;Configúrelo en Falso

  2. Verifique las reglas predeterminadas de GeoFence

    • Accede a la sección Seguridad > Reglas de datos de GeoFence

      ../../_images/oauth028.png
    • Asegúrese de que la regla DENEGAR TODO esté presente de forma predeterminada; de lo contrario, todos podrán acceder a sus datos.

      Nota

      Esta regla es siempre la última

      ../../_images/oauth029.png

      Advertencia

      Si esa regla no existe en la parte inferior (esta regla es siempre la última), agréguela manualmente.

    • Access the Security > GeoFence Admin Rules section

      ../../_images/oauth030.png
    • No se necesitan reglas aquí

      ../../_images/oauth031.png

Solución de problemas y funciones avanzadas

Problemas comunes y soluciones

  • GeoServer/GeoNode OAuth2 no se autentica como administrador incluso utilizando usuarios admin de GeoNode

    Symptoms

    Al intentar autenticarme con un usuario admin usando OAuth2, el proceso redirige correctamente a la página de GeoServer, pero no soy un administrador de GeoServer.

    Causa

    Eso significa que de alguna manera GeoServer no pudo completar exitosamente el proceso de Autorización y Autenticación.

    Las posibles causas del problema pueden ser las siguientes:

    1. La autenticación OAuth2 falla en el lado de GeoServer

      Esto generalmente se debe a una excepción al intentar completar el proceso de autenticación.

      • Una causa típica es que GeoServer intenta utilizar conexiones HTTPS pero no se confía en el certificado de GeoNode;

        En ese caso, consulte la sección siguiente.También eche un vistazo a los registros (en particular el de GeoServer) como se explica en debug_geonode.Los registros de GeoServer deben contener una excepción detallada que explique la causa del problema.Si no aparece ninguna excepción aquí (incluso después de elevar el nivel de registro a DEBUG), intente verificar el servicio de rol GeoNode como se explica a continuación.

      • Otro posible problema es que de alguna manera el protocolo de enlace OAuth2 no se puede completar exitosamente;

        1. Inicie sesión en GeoServer como administrador a través de su formulario de inicio de sesión WEB.

        2. Verifique que todos los parámetros geonode-oauth2 - Autenticación usando un GeoNode OAuth2 sean correctos.Si todo está bien, eche un vistazo a los registros (en particular el de GeoServer) como se explica en debug_geonode.Los registros de GeoServer deben contener una excepción detallada que explique la causa del problema.Si no aparece ninguna excepción aquí (incluso después de elevar el nivel de registro a DEBUG), intente verificar el servicio de rol GeoNode como se explica a continuación.

    2. GeoServer no puede recuperar la función del usuario de un servicio de función

      Siempre verifique dos veces el registro del servidor HTTP y del GeoServer como se especifica en la sección debug_geonode.Esto podría guiarlo directamente a la causa del problema.

      • Verifique que el host de GeoServer tenga permiso para acceder a las API REST del servicio de rol de GeoNode en AUTH_IP_WHITELIST de settings.py

      • Compruebe que el servicio de rol REST geonode sea el servicio de rol predeterminado y que el complemento GeoServer OAuth2 se haya configurado para usarlo de forma predeterminada.

      • Verifique que las API del servicio de rol REST de GeoNode sean funcionales y produzcan JSON correcto.

        Esto es posible usando simples llamadas GET cUrl como

        curl http://localhost/api/adminRole
        $> {"adminRole": "admin"}
        
        
        curl http://localhost/api/users
        $> {"users": [{"username": "AnonymousUser", "groups": ["anonymous"]}, {"username": "afabiani", "groups": ["anonymous", "test"]}, {"username": "admin", "groups": ["anonymous", "test", "admin"]}]}
        
        curl http://localhost/api/roles
        $> {"groups": ["anonymous", "test", "admin"]}
        
        curl http://localhost/api/users/admin
        $> {"users": [{"username": "admin", "groups": ["anonymous", "test", "admin"]}]}
        

Cómo configurar puntos finales seguros HTTPS

En un sistema de producción es una buena práctica cifrar la conexión entre GeoServer y GeoNode.Esto sería posible habilitando el protocolo HTTPS en las API del servicio de función REST de GeoNode y en los puntos finales OAuth2.

La mayoría de las veces dependerá de una conexión HTTPS autofirmada mediante un certificado generado.Eso hace que la conexión no sea de confianza y deberá indicarle a la máquina virtual Java GeoServer que confíe en ella.

Esto se puede hacer siguiendo los pasos a continuación.

Para cualquier problema, consulte los registros (en particular el de GeoServer) como se explica en debug_geonode.Los registros de GeoServer deben contener una excepción detallada que explique la causa del problema.

Certificados SSL de confianza

Cuando utilice un Keystore personalizado o intente acceder a un proveedor OAuth2 autofirmado o no confiable con protección SSL desde una conexión que no sea SSH, deberá agregar los certificados al Keystore de JVM.

Para poder realizar esto puedes seguir los siguientes pasos:

En este ejemplo vamos a

  1. Recuperar certificado SSL del dominio GeoNode:

    «URI del token de acceso» = https://<geonode_host_base_url>/o/token/, por lo tanto, debemos confiar en https://<geonode_host_base_url> o (<geonode_host_base_url>:443)

    Nota

    Deberá obtener y confiar en los certificados de cada URL HTTPS diferente utilizada en los puntos finales OAuth2.

  2. Almacene certificados SSL en el disco duro local

  3. Add SSL Certificates to the Java Keystore

  4. Habilite la JVM para buscar certificados SSL desde el almacén de claves

  1. Recuperar el certificado SSL del dominio GeoNode

    Utiliza el comando openssl para volcar el certificado

    Para https://<geonode_host_base_url>

    openssl s_client -connect <geonode_host_base_url>:443
    
    ../../_images/google_ssl_001.png
  2. Almacenar el certificado SSL en el disco duro local

    Copie y pegue la sección -BEGIN CERTIFICATE-, -END CERTIFICATE- y guárdela en un archivo .cert

    Nota

    El archivo .cert son archivos de texto sin formato que contienen los caracteres ASCII incluidos en las secciones -BEGIN CERTIFICATE- y -END CERTIFICATE-.

    geonode.cert (o el nombre que quieras con la extensión .cert)

    ../../_images/google_ssl_003.png
  3. Agregar certificados SSL al almacén de claves de Java

    Puedes usar el comando Java keytool así

    geonode.cert (o el nombre que quieras con la extensión .cert)

    keytool -import -noprompt -trustcacerts -alias geonode -file geonode.cert -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}
    

    o, alternativamente, puedes utilizar alguna herramienta gráfica que te ayude a administrar los certificados SSL y los almacenes de claves, como Portecle

    java -jar c:\apps\portecle-1.9\portecle.jar
    
    ../../_images/google_ssl_005.png
    ../../_images/google_ssl_006.png
    ../../_images/google_ssl_007.png
    ../../_images/google_ssl_008.png
    ../../_images/google_ssl_009.png
    ../../_images/google_ssl_010.png
    ../../_images/google_ssl_011.png
    ../../_images/google_ssl_012.png
    ../../_images/google_ssl_013.png
  4. Habilite la JVM para buscar certificados SSL desde el almacén de claves

    Para hacer esto, necesita pasar una JAVA_OPTION a su JVM:

    -Djavax.net.ssl.trustStore=F:\tmp\keystore.key
    
  5. Reinicia tu servidor

Nota

A continuación, encontrarás un script bash que simplifica la importación de certificados SSL de Keystore. Úsalo cuando te resulte conveniente.

HOST=myhost.example.com
PORT=443
KEYSTOREFILE=dest_keystore
KEYSTOREPASS=changeme

# get the SSL certificate
openssl s_client -connect ${HOST}:${PORT} </dev/null \
        | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ${HOST}.cert

# create a keystore and import certificate
keytool -import -noprompt -trustcacerts \
        -alias ${HOST} -file ${HOST}.cert \
        -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS}

# verify we've got it.
keytool -list -v -keystore ${KEYSTOREFILE} -storepass ${KEYSTOREPASS} -alias ${HOST}

Funciones avanzadas de GeoFence

Tutoriales y gestión de reglas de GeoFence

  • Este tutorial muestra cómo instalar y configurar el complemento Geofence Internal Server.Muestra cómo crear reglas de dos maneras: usando la GUI y los métodos REST.

  • Las reglas de GeoFence se pueden crear, actualizar o eliminar a través de una API REST, a la que solo puede acceder un usuario administrador de GeoServer.Puede encontrar más detalles sobre cómo funciona la API REST de GeoFence aquí.

Configuración de almacenamiento de reglas de GeoFence

De forma predeterminada, GeoFence está configurado para utilizar una base de datos basada en un sistema de archivos almacenado en el directorio de datos del GeoServer <GEOSERVER_DATA_DIR/geofence.

  • También es posible configurar GeoFence para utilizar una base de datos PostgreSQL/PostGIS externa. Para obtener más detalles, consulta la documentación oficial de GeoFence aquí here.

  1. Agregue Bibliotecas Java a GeoServer

    wget --no-check-certificate "https://maven.geo-solutions.it/org/hibernatespatial/hibernate-spatial-postgis/1.1.3.2/hibernate-spatial-postgis-1.1.3.2.jar" -O hibernate-spatial-postgis-1.1.3.2.jar
    wget --no-check-certificate "https://repo1.maven.org/maven2/org/postgis/postgis-jdbc/1.3.3/postgis-jdbc-1.3.3.jar" -O postgis-jdbc-1.3.3.jar
    
    cp hibernate-spatial-postgis-1.1.3.2.jar <GEOSERVER_WEBAPP_DIR>/WEB-INF/lib
    cp postgis-jdbc-1.3.3.jar <GEOSERVER_WEBAPP_DIR>/WEB-INF/lib
    
    restart geoserver
    
  2. Cree una base de datos con el esquema actualizado aquí https://github.com/geoserver/geofence/blob/master/doc/setup/sql/002_create_schema_postgres.sql o habilite la creación automática de hbm2ddl a través del archivo de configuración (consulte el paso 3)

    Nota

    Observe que «actualizar» también crea las tablas si no existen.Sin embargo, en producción, sugeriría cambiarlo para «validar».

    # If you want to create a new DB for GeoFence
    sudo -u postgres createdb -O geonode geofence; \
    sudo -u postgres psql -d geofence -c 'CREATE EXTENSION postgis;'; \
    sudo -u postgres psql -d geofence -c 'GRANT ALL ON geometry_columns TO PUBLIC;'; \
    sudo -u postgres psql -d geofence -c 'GRANT ALL ON spatial_ref_sys TO PUBLIC;'; \
    sudo -u postgres psql -d geofence -c 'GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO geonode;'
    
  3. Agrega una configuración similar al ejemplo geofence-datasource-ovr.properties que aparece a continuación (si está cargada como extensión GeoServer)

    <GEOSERVER_DATA_DIR>/geofence/geofence-datasource-ovr.properties

    # /* (c) 2019 Open Source Geospatial Foundation - all rights reserved
    #  * This code is licensed under the GPL 2.0 license, available at the root
    #  * application directory.
    #  */
    #
    geofenceVendorAdapter.databasePlatform=org.hibernate.spatial.dialect.postgis.PostgisDialect
    geofenceDataSource.driverClassName=org.postgresql.Driver
    geofenceDataSource.url=jdbc:postgresql://localhost:5432/geofence
    geofenceDataSource.username=postgres
    geofenceDataSource.password=postgres
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.default_schema]=public
    
    geofenceDataSource.testOnBorrow=true
    geofenceDataSource.validationQuery=SELECT 1
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.testOnBorrow]=true
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.validationQuery]=SELECT 1
    
    geofenceDataSource.removeAbandoned=true
    geofenceDataSource.removeAbandonedTimeout=60
    geofenceDataSource.connectionProperties=ApplicationName=GeoFence;
    
    ################################################################################
    ## Other setup entries
    ################################################################################
    ## hbm2ddl.auto may assume one of these values:
    ## - validate: validates the DB schema at startup against the internal model. May fail on oracle spatial.
    ## - update: updates the schema, according to the internal model. Updating automatically the production DB is dangerous.
    ## - create-drop: drop the existing schema and recreates it according to the internal model. REALLY DANGEROUS, YOU WILL LOSE YOUR DATA.
    ## You may want not to redefine the property entirely, in order to leave the default value (no action).
    
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.hbm2ddl.auto]=update
    geofenceEntityManagerFactory.jpaPropertyMap[javax.persistence.validation.mode]=none
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.validator.apply_to_ddl]=false
    geofenceEntityManagerFactory.jpaPropertyMap[hibernate.validator.autoregister_listeners]=false
    
    ##
    ## ShowSQL is set to true in the configuration file; putting showsql=false in
    ## this file, you can easily check that this override file has been properly applied.
    
    # geofenceVendorAdapter.generateDdl=false
    # geofenceVendorAdapter.showSql=false
    
    ## Set to "true" in specific use cases
    # workspaceConfigOpts.showDefaultGroups=false
    
    
    
    ################################################################################
    ## Disable second level cache.
    ## This is needed in a geofence-clustered environment.
    
    #geofenceEntityManagerFactory.jpaPropertyMap[hibernate.cache.use_second_level_cache]=false
    
    ################################################################################
    ## Use external ehcache configuration file.
    ## Useful to change cache settings, for example diskStore path.
    #geofenceEntityManagerFactory.jpaPropertyMap[hibernate.cache.provider_configuration_file_resource_path]=file:/path/to/geofence-ehcache-override.xml