Autenticación SAML 2.0 saml-2-0-authentication

Aprenda a configurar y autenticar usuarios finales (no autores de AEM) en un IDP compatible con SAML 2.0 de su elección.

¿Qué es SAML para AEM as a Cloud Service?

La integración de SAML 2.0 con AEM Publish (o Preview) permite a los usuarios finales de una experiencia web basada en AEM autenticarse en un IDP (proveedor de identidad) que no es de Adobe y acceder a AEM como un usuario autorizado con nombre.

AEM Author
Publicación de AEM
Compatibilidad con SAML 2.0
Comprensión del flujo de SAML 2.0 con AEM

El flujo típico de una integración de AEM Publish SAML es el siguiente:

  1. El usuario realiza una solicitud a AEM Publish que indica que se requiere autenticación.

    • El usuario solicita un recurso protegido por CUG/ACL.
    • El usuario solicita un recurso que está sujeto a un requisito de autenticación.
    • El usuario sigue un vínculo al extremo de inicio de sesión de AEM (es decir, /system/sling/login) que solicita explícitamente la acción de inicio de sesión.
  2. AEM realiza una AuthnRequest al IDP, en la que se solicita que el IDP inicie el proceso de autenticación.

  3. El usuario se autentica en IDP.

    • El IDP solicita credenciales al usuario.
    • El usuario ya se ha autenticado con el IDP y no tiene que proporcionar más credenciales.
  4. IDP genera una afirmación de SAML que contiene los datos del usuario y la firma utilizando el certificado privado del IDP.

  5. IDP envía la afirmación de SAML a través de HTTP POST, a través del explorador web del usuario (RESPECTIVE_PROTECTED_PATH/saml_login), a AEM Publish.

  6. AEM Publish recibe la afirmación de SAML y valida la integridad y autenticidad de la afirmación de SAML utilizando el certificado público IDP.

  7. AEM Publish administra el registro de usuario de AEM en función de la configuración OSGi de SAML 2.0 y el contenido de la aserción SAML.

    • Crea un usuario
    • Sincroniza atributos de usuario
    • Actualiza la pertenencia a grupos de usuarios de AEM
  8. AEM Publish establece la cookie login-token de AEM en la respuesta HTTP, que se utiliza para autenticar solicitudes posteriores en AEM Publish.

  9. AEM Publish redirige al usuario a la dirección URL en AEM Publish según se especifica en la cookie saml_request_path.

Introducción a la configuración

Este vídeo explica cómo configurar la integración de SAML 2.0 con el servicio de publicación de AEM as a Cloud Service y cómo utilizar Okta como IDP.

Requisitos previos

Se requiere lo siguiente al configurar la autenticación SAML 2.0:

  • Acceso del administrador de implementación a Cloud Manager
  • Acceso de administrador de AEM al entorno de AEM as a Cloud Service
  • Acceso de administrador al IDP
  • Opcionalmente, acceso a un par de claves pública y privada utilizado para cifrar cargas SAML

SAML 2.0 solo se admite para autenticar usuarios en AEM Publish o Preview. Para administrar la autenticación del autor de AEM que usa y IDP, integre el IDP con Adobe IMS.

Instalación del certificado público IDP en AEM

El certificado público del IDP se añade al repositorio de confianza global de AEM y se utiliza para validar que la afirmación de SAML enviada por el IDP es válida.

Flujo de firma de aserción SAML

SAML 2.0 - Firma de aserción SAML IDP

  1. El usuario se autentica en IDP.
  2. IDP genera una afirmación de SAML que contiene los datos del usuario.
  3. IDP firma la afirmación de SAML usando el certificado privado de IDP.
  4. IDP inicia un POST HTTP del lado del cliente en el extremo SAML de AEM Publish (.../saml_login) que incluye la afirmación de SAML firmada.
  5. AEM Publish recibe el POST HTTP que contiene la afirmación de SAML firmada, puede validar la firma mediante el certificado público IDP.

Agregar el certificado público IDP al Almacén de confianza global

  1. Obtenga el archivo de certificado público del IDP. Este certificado permite a AEM validar la afirmación de SAML proporcionada a AEM por el IDP.

    El certificado está en formato PEM y debe tener un aspecto similar al siguiente:

    code language-none
    -----BEGIN CERTIFICATE-----
    MIIC4jCBAcoCCQC33wnybT5QZDANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJV
    ...
    m0eo2USlSRTVl7QHRTuiuSThHpLKQQ==
    -----END CERTIFICATE-----
    
  2. Inicie sesión en AEM Author como administrador de AEM.

  3. Vaya a Herramientas > Seguridad > Almacén de confianza.

  4. Cree o abra el Almacén de confianza global. Si crea un almacén de confianza global, guarde la contraseña en un lugar seguro.

  5. Expandir Agregar certificado del archivo CER.

  6. Seleccione Seleccionar archivo de certificado y cargue el archivo de certificado proporcionado por el IDP.

  7. Deje Asignar certificado al usuario en blanco.

  8. Seleccione Enviar.

  9. El certificado recién agregado aparece encima de la sección Agregar certificado del archivo CRT.

  10. Tome nota del alias, ya que este valor se usa en la configuración OSGi del Controlador de autenticación SAML 2.0.

  11. Seleccione Guardar y cerrar.

El repositorio de confianza global está configurado con el certificado público del IDP en AEM Author, pero como SAML solo se utiliza en AEM Publish, el repositorio de confianza global debe replicarse en AEM Publish para que el certificado público IDP sea accesible allí.

Replicar el almacén de confianza global en AEM Publish

  1. Vaya a Herramientas > Implementación > Paquetes.

  2. Creación de un paquete

    • Nombre del paquete: Global Trust Store
    • Versión: 1.0.0
    • Grupo: com.your.company
  3. Edite el nuevo paquete de Almacén de confianza global.

  4. Seleccione la ficha Filtros y agregue un filtro para la ruta raíz /etc/truststore.

  5. Seleccione Listo y luego Guardar.

  6. Seleccione el botón Generar para el paquete de Almacén de confianza global.

  7. Una vez generado, seleccione Más > Replicar para activar el nodo Almacén de confianza global (/etc/truststore) en AEM Publish.

Crear almacén de claves del servicio de autenticación authentication-service-keystore

Es necesario crear un almacén de claves para el servicio de autenticación cuando la propiedad de configuración OSGi del controlador de autenticación SAML 2.0 handleLogout está establecida en true o cuando se requiere cifrado de firma AuthnRequest/aserción SAML

  1. Inicie sesión en AEM Author como administrador de AEM para cargar la clave privada.

  2. Vaya a Herramientas > Seguridad > Usuarios, seleccione el usuario authentication-service y seleccione Propiedades en la barra de acciones superior.

  3. Seleccione la pestaña Keystore.

  4. Cree o abra el repositorio de claves. Si crea un almacén de claves, mantenga la contraseña a salvo.

  5. Seleccione Guardar y cerrar.

  6. Cree un paquete que contenga el usuario authentication-service actualizado.

    Use la siguiente solución temporal mediante paquetes:

    1. Vaya a Herramientas > Implementación > Paquetes.

    2. Creación de un paquete

      • Nombre del paquete: Authentication Service
      • Versión: 1.0.0
      • Grupo: com.your.company
    3. Edite el nuevo paquete Almacenamiento de claves del servicio de autenticación.

    4. Seleccione la ficha Filtros y agregue un filtro para la ruta raíz /home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore.

      • Para encontrar <AUTHENTICATION SERVICE UUID>, vaya a Herramientas > Seguridad > Usuarios y seleccione el usuario authentication-service. El UUID es la última parte de la dirección URL.
    5. Seleccione Listo y luego Guardar.

    6. Seleccione el botón Generar para el paquete de Almacenamiento de claves del servicio de autenticación.

    7. Una vez compilado, seleccione Más > Replicar para activar el almacén de claves del servicio de autenticación en AEM Publish.

Instalación del par de claves pública y privada de AEM install-aem-public-private-key-pair

La instalación del par de claves pública y privada de AEM es opcional

AEM Publish se puede configurar para firmar solicitudes de autenticación (a IDP) y cifrar aserciones de SAML (a AEM). Esto se logra proporcionando una clave privada a AEM Publish y haciendo coincidir la clave pública con el IDP.

Comprender el flujo de firma de AuthnRequest (opcional)

AuthnRequest (la solicitud al IDP desde AEM Publish que inicia el proceso de inicio de sesión) puede firmarla AEM Publish. Para ello, AEM Publish firma AuthnRequest con la clave privada, de modo que el IDP valide la firma con la clave pública. Esto garantiza al IDP que AuthnRequest se inició y fue solicitado por AEM Publish, y no por un tercero malicioso.

SAML 2.0 - SP AuthnRequest firma

  1. El usuario realiza una solicitud HTTP a AEM Publish que resulta en una solicitud de autenticación SAML al IDP.
  2. AEM Publish genera la solicitud SAML para enviarla al IDP.
  3. AEM Publish firma la solicitud SAML con la clave privada de AEM.
  4. AEM Publish inicia AuthnRequest, un redireccionamiento del lado del cliente HTTP al IDP que contiene la solicitud SAML firmada.
  5. IDP recibe la AuthnRequest y valida la firma con la clave pública de AEM, lo que garantiza que AEM Publish inició la AuthnRequest.
  6. A continuación, AEM Publish valida la integridad y autenticidad de la afirmación de SAML descifrada mediante el certificado público IDP.
Comprender el flujo de cifrado de afirmación de SAML (opcional)

Toda la comunicación HTTP entre IDP y AEM Publish debe ser a través de HTTPS y, por lo tanto, segura de forma predeterminada. Sin embargo, según sea necesario, las afirmaciones de SAML pueden cifrarse en el caso de que se requiera confidencialidad adicional además de la proporcionada por HTTPS. Para ello, el IDP cifra los datos de aserción de SAML utilizando la clave privada y AEM Publish descifra la aserción de SAML utilizando la clave privada.

SAML 2.0: cifrado de aserción SP SAML

  1. El usuario se autentica en IDP.
  2. IDP genera una afirmación de SAML que contiene los datos del usuario y la firma utilizando el certificado privado del IDP.
  3. A continuación, IDP cifra la afirmación de SAML con la clave pública de AEM, que requiere la clave privada de AEM para descifrar.
  4. La afirmación de SAML cifrada se envía a AEM Publish a través del explorador web del usuario.
  5. AEM Publish recibe la afirmación de SAML y la descifra utilizando la clave privada de AEM.
  6. IDP solicita al usuario que se autentique.

Tanto la firma de AuthnRequest como el cifrado de aserción de SAML son opcionales; sin embargo, ambos están habilitados mediante la propiedad de configuración OSGi del controlador de autenticación SAML 2.0, lo que significa que se pueden usar ambos o ninguno.useEncryption

Almacén de claves del servicio de autenticación de AEM

  1. Obtenga la clave pública, la clave privada (PKCS#8 en formato DER) y el archivo de cadena de certificados (puede ser la clave pública) utilizados para firmar AuthnRequest y cifre la afirmación de SAML. Las claves las suele proporcionar el equipo de seguridad de la organización de TI.

    • Se puede generar un par de claves autofirmadas con openssl:
    code language-none
    $ openssl req -x509 -sha256 -days 365 -newkey rsa:4096 -keyout aem-private.key -out aem-public.crt
    
    # Provide a password (keep in safe place), and other requested certificate information
    
    # Convert the keys to AEM's required format
    $ openssl rsa -in aem-private.key -outform der -out aem-private.der
    $ openssl pkcs8 -topk8 -inform der -nocrypt -in aem-private.der -outform der -out aem-private-pkcs8.der
    
  2. Cargue la clave pública al IDP.

    • Utilizando el método openssl anterior, la clave pública es el archivo aem-public.crt.
  3. Inicie sesión en AEM Author como administrador de AEM para cargar la clave privada.

  4. Vaya a Herramientas > Seguridad > Almacén de confianza, seleccione el usuario servicio de autenticación y seleccione Propiedades en la barra de acciones superior.

  5. Vaya a Herramientas > Seguridad > Usuarios, seleccione el usuario authentication-service y seleccione Propiedades en la barra de acciones superior.

  6. Seleccione la pestaña Keystore.

  7. Cree o abra el repositorio de claves. Si crea un almacén de claves, mantenga la contraseña a salvo.

  8. Seleccione Agregar clave privada desde el archivo DER y agregue la clave privada y el archivo de cadena a AEM:

    • Alias: proporcione un nombre significativo, a menudo el nombre del IDP.
    • Archivo de clave privada: Cargue el archivo de clave privada (PKCS#8 en formato DER).
      • Utilizando el método openssl anterior, este es el archivo aem-private-pkcs8.der
    • Seleccionar archivo de cadena de certificados: cargue el archivo de cadena que lo acompaña (puede ser la clave pública).
      • Utilizando el método openssl anterior, este es el archivo aem-public.crt
    • Seleccionar Enviar
  9. El certificado recién agregado aparece encima de la sección Agregar certificado del archivo CRT.

  10. Seleccione Guardar y cerrar.

  11. Cree un paquete que contenga el usuario authentication-service actualizado.

    Use la siguiente solución temporal mediante paquetes:

    1. Vaya a Herramientas > Implementación > Paquetes.

    2. Creación de un paquete

      • Nombre del paquete: Authentication Service
      • Versión: 1.0.0
      • Grupo: com.your.company
    3. Edite el nuevo paquete Almacenamiento de claves del servicio de autenticación.

    4. Seleccione la ficha Filtros y agregue un filtro para la ruta raíz /home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore.

      • Para encontrar <AUTHENTICATION SERVICE UUID>, vaya a Herramientas > Seguridad > Usuarios y seleccione el usuario authentication-service. El UUID es la última parte de la dirección URL.
    5. Seleccione Listo y luego Guardar.

    6. Seleccione el botón Generar para el paquete de Almacenamiento de claves del servicio de autenticación.

    7. Una vez compilado, seleccione Más > Replicar para activar el almacén de claves del servicio de autenticación en AEM Publish.

Configurar el controlador de autenticación SAML 2.0 configure-saml-2-0-authentication-handler

La configuración de SAML de AEM se realiza a través de la configuración OSGi Controlador de autenticación Adobe Granite SAML 2.0.
La configuración es una configuración de fábrica de OSGi, lo que significa que un solo servicio de publicación de AEM as a Cloud Service puede tener varias configuraciones de SAML que cubran árboles de recursos discretos del repositorio; esto resulta útil para implementaciones de AEM de varios sitios.

Glosario de configuración OSGi del Controlador de autenticación SAML 2.0

Configuración OSGi del Controlador de autenticación SAML 2.0 de Adobe Granite configure-saml-2-0-authentication-handler-osgi-configuration

table 0-row-6 1-row-6 2-row-6 3-row-6 4-row-6 5-row-6 6-row-6 7-row-6 8-row-6 9-row-6 10-row-6 11-row-6 12-row-6 13-row-6 14-row-6 15-row-6 16-row-6 17-row-6 18-row-6 19-row-6 20-row-6 21-row-6 22-row-6 23-row-6 24-row-6 25-row-6 26-row-6 27-row-6 3-align-center 4-align-center 10-align-center 11-align-center 17-align-center 18-align-center 24-align-center 25-align-center 31-align-center 32-align-center 38-align-center 39-align-center 45-align-center 46-align-center 52-align-center 53-align-center 59-align-center 60-align-center 66-align-center 67-align-center 73-align-center 74-align-center 80-align-center 81-align-center 87-align-center 88-align-center 94-align-center 95-align-center 101-align-center 102-align-center 108-align-center 109-align-center 115-align-center 116-align-center 122-align-center 123-align-center 129-align-center 130-align-center 136-align-center 137-align-center 143-align-center 144-align-center 150-align-center 151-align-center 157-align-center 158-align-center 164-align-center 165-align-center 171-align-center 172-align-center 178-align-center 179-align-center 185-align-center 186-align-center 192-align-center 193-align-center
Propiedad OSGi Requerido Formato de valor Valor predeterminado Descripción
Rutas path Matriz de cadenas / Rutas de AEM para las que se utiliza este controlador de autenticación.
URL de IDP idpUrl Cadena Dirección URL de IDP a la que se envía la solicitud de autenticación SAML.
Alias de certificado IDP idpCertAlias Cadena Alias del certificado IDP encontrado en el repositorio de confianza global de AEM
Redirección HTTP de IDP idpHttpRedirect Booleano false Indica si hay un redireccionamiento HTTP a la URL de IDP en lugar de enviar una AuthnRequest. Se estableció en true para la autenticación iniciada por IDP.
Identificador de IDP idpIdentifier Cadena ID de IDP único para garantizar la exclusividad de usuarios y grupos de AEM. Si está vacío, se utiliza serviceProviderEntityId en su lugar.
URL de servicio de consumidor de afirmación assertionConsumerServiceURL Cadena Atributo de URL AssertionConsumerServiceURL en AuthnRequest que especifica dónde se debe enviar el mensaje <Response> a AEM.
ID de entidad de SP serviceProviderEntityId Cadena Identifica de forma exclusiva a AEM con el IDP; normalmente es el nombre de host de AEM.
Cifrado SP useEncryption Booleano true Indica si el IDP cifra las afirmaciones de SAML. Requiere que se establezcan spPrivateKeyAlias y keyStorePassword.
Alias de clave privada SP spPrivateKeyAlias Cadena Alias de la clave privada en el almacén de claves del usuario authentication-service. Obligatorio si useEncryption está establecido en true.
Contraseña del almacén de claves SP keyStorePassword Cadena La contraseña del almacén de claves del usuario del servicio de autenticación. Obligatorio si useEncryption está establecido en true.
Redirección predeterminada defaultRedirectUrl Cadena / La URL de redireccionamiento predeterminada después de la autenticación correcta. Puede ser relativo al host de AEM (por ejemplo, /content/wknd/us/en/html).
Atributo de ID de usuario userIDAttribute Cadena uid Nombre del atributo de afirmación de SAML que contiene el ID de usuario del usuario de AEM. Dejar vacío para utilizar Subject:NameId.
Crear automáticamente usuarios de AEM createUser Booleano true Indica si los usuarios de AEM se crean con una autenticación correcta.
Ruta intermedia del usuario de AEM userIntermediatePath Cadena Al crear usuarios de AEM, este valor se usa como ruta intermedia (por ejemplo, /home/users/<userIntermediatePath>/jane@wknd.com). Requiere que createUser se establezca en true.
Atributos de usuario de AEM synchronizeAttributes Matriz de cadenas Lista de asignaciones de atributos SAML que se almacenarán en el usuario de AEM, con el formato [ "saml-attribute-name=path/relative/to/user/node" ] (por ejemplo, [ "firstName=profile/givenName" ]). Ver la lista completa de atributos nativos de AEM.
Añadir usuario a grupos de AEM addGroupMemberships Booleano true Indica si se agrega automáticamente un usuario de AEM a los grupos de usuarios de AEM después de la autenticación correcta.
atributo de pertenencia a grupo de AEM groupMembershipAttribute Cadena groupMembership Nombre del atributo de afirmación de SAML que contiene una lista de grupos de usuarios de AEM a los que se debe agregar el usuario. Requiere que addGroupMemberships se establezca en true.
Grupos de AEM predeterminados defaultGroups Matriz de cadenas Siempre se agrega una lista de usuarios autenticados de grupos de usuarios de AEM a (por ejemplo, [ "wknd-user" ]). Requiere que addGroupMemberships se establezca en true.
Formato de directiva de IDP de nombre nameIdFormat Cadena urn:oasis:names:tc:SAML:2.0:nameid-format:transient Valor del parámetro de formato NameIDPolicy que se enviará en el mensaje AuthnRequest.
Almacenar respuesta de SAML storeSAMLResponse Booleano false Indica si el valor samlResponse está almacenado en el nodo cq:User de AEM.
Controlar cierre de sesión handleLogout Booleano false Indica si este controlador de autenticación SAML administra la solicitud de cierre de sesión. Requiere que se establezca logoutUrl.
URL de desconexión logoutUrl Cadena URL de IDP a la que se envía la solicitud de cierre de sesión de SAML. Obligatorio si handleLogout está establecido en true.
Tolerancia del reloj clockTolerance Entero 60 La tolerancia de sesgo de reloj de IDP y AEM (SP) al validar afirmaciones de SAML.
Método de resumen digestMethod Cadena http://www.w3.org/2001/04/xmlenc#sha256 Algoritmo de resumen que utiliza el IDP al firmar un mensaje SAML.
Método de firma signatureMethod Cadena http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 Algoritmo de firma que utiliza el IDP al firmar un mensaje SAML.
Tipo de sincronización de identidad identitySyncType default o idp default No cambie el valor predeterminado from para AEM as a Cloud Service.
Clasificación del servicio service.ranking Entero 5002 Se prefieren configuraciones de clasificación más alta para el mismo path.

Atributos de usuario de AEM aem-user-attributes

AEM utiliza los siguientes atributos de usuario, que se pueden rellenar mediante la propiedad synchronizeAttributes en la configuración OSGi del Controlador de autenticación SAML 2.0 de Adobe Granite. Cualquier atributo IDP se puede sincronizar con cualquier propiedad de usuario de AEM, pero la asignación a las propiedades de atributo de uso de AEM (enumeradas a continuación) permite que AEM los utilice de forma natural.

table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2 6-row-2 7-row-2 8-row-2 9-row-2 10-row-2 11-row-2
Atributo de usuario Ruta de propiedad relativa desde el nodo rep:User
Título (por ejemplo, Mrs) profile/title
Nombre dado (es decir, nombre) profile/givenName
Apellido (es decir, apellido) profile/familyName
Título de trabajo profile/jobTitle
Dirección de correo electrónico profile/email
Dirección profile/street
Ciudad profile/city
Código postal profile/postalCode
País profile/country
Número de teléfono profile/phoneNumber
Acerca de mí profile/aboutMe
  1. Cree un archivo de configuración OSGi en su proyecto en /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json y ábralo en su IDE.

    • Cambiar /wknd-examples/ a /<project name>/
    • El identificador después de ~ en el nombre de archivo debe identificar de forma exclusiva esta configuración, por lo que puede ser el nombre del IDP, como ...~okta.cfg.json. El valor debe ser alfanumérico y contener guiones.
  2. Pegue el siguiente JSON en el archivo com.adobe.granite.auth.saml.SamlAuthenticationHandler~...cfg.json y actualice las referencias wknd según sea necesario.

    code language-json
    {
        "path": [ "/content/wknd", "/content/dam/wknd" ],
        "idpCertAlias": "$[env:SAML_IDP_CERT_ALIAS;default=certalias___1652125559800]",
        "idpIdentifier": "$[env:SAML_IDP_ID;default=http://www.okta.com/exk4z55r44Jz9C6am5d7]",
        "idpUrl": "$[env:SAML_IDP_URL;default=https://dev-5511372.okta.com/app/dev-5511372_aemasacloudservice_1/exk4z55r44Jz9C6am5d7/sso/saml]",
        "serviceProviderEntityId": "$[env:SAML_AEM_ID;default=https://publish-p123-e456.adobeaemcloud.com]",
        "useEncryption": false,
        "createUser": true,
        "userIntermediatePath": "wknd/idp",
        "synchronizeAttributes":[
            "firstName=profile/givenName"
        ],
        "addGroupMemberships": true,
        "defaultGroups": [
            "wknd-users"
        ]
    }
    
  3. Actualice los valores según sea necesario en el proyecto. Consulte el glosario de configuración OSGi del Controlador de autenticación SAML 2.0 anterior para obtener descripciones de las propiedades de configuración

  4. Se recomienda, pero no es obligatorio, utilizar variables y secretos de entorno OSGi, cuando los valores pueden cambiar sin estar sincronizados con el ciclo de lanzamiento o cuando los valores difieren entre tipos de entorno/niveles de servicio similares. Los valores predeterminados se pueden establecer con la sintaxis $[env:..;default=the-default-value]", como se muestra arriba.

Las configuraciones de OSGi por entorno (config.publish.dev, config.publish.stage y config.publish.prod) se pueden definir con atributos específicos si la configuración de SAML varía entre entornos.

Usar cifrado

Al cifrar AuthnRequest y la aserción SAML, se requieren las siguientes propiedades: useEncryption, spPrivateKeyAlias y keyStorePassword. El keyStorePassword contiene una contraseña; por lo tanto, el valor no debe almacenarse en el archivo de configuración OSGi, sino insertarse usando valores de configuración secretos

Opcionalmente, actualice la configuración de OSGi para utilizar el cifrado
  1. Abra /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json en su IDE.

  2. Agregue las tres propiedades useEncryption, spPrivateKeyAlias y keyStorePassword como se muestra a continuación.

    code language-json
    {
    "path": [ "/content/wknd", "/content/dam/wknd" ],
    "idpCertAlias": "$[env:SAML_IDP_CERT_ALIAS;default=certalias___1234567890]",
    "idpIdentifier": "$[env:SAML_IDP_ID;default=http://www.okta.com/abcdef1235678]",
    "idpUrl": "$[env:SAML_IDP_URL;default=https://dev-5511372.okta.com/app/dev-123567890_aemasacloudservice_1/abcdef1235678/sso/saml]",
    "serviceProviderEntityId": "$[env:SAML_AEM_ID;default=https://publish-p123-e456.adobeaemcloud.com]",
    "useEncryption": true,
    "spPrivateKeyAlias": "$[env:SAML_AEM_KEYSTORE_ALIAS;default=aem-saml-encryption]",
    "keyStorePassword": "$[secret:SAML_AEM_KEYSTORE_PASSWORD]",
    "createUser": true,
    "userIntermediatePath": "wknd/idp"
    "synchronizeAttributes":[
        "firstName=profile/givenName"
    ],
    "addGroupMemberships": true,
    "defaultGroups": [
        "wknd-users"
    ]
    }
    
  3. Las tres propiedades de configuración OSGi necesarias para el cifrado son:

  • useEncryption se estableció en true
  • spPrivateKeyAlias contiene el alias de entrada del almacén de claves para la clave privada utilizada por la integración de SAML.
  • keyStorePassword contiene una variable de configuración secreta OSGi que contiene la contraseña del almacén de claves de usuario authentication-service.

Configurar el filtro de referente

Durante el proceso de autenticación SAML, el IDP inicia un POST HTTP del lado del cliente en el punto final .../saml_login de AEM Publish. Si el IDP y AEM Publish existen en un origen diferente, el Filtro de referente de AEM Publish se configura mediante la configuración OSGi para permitir HTTP POST desde el origen del IDP.

  1. Cree (o edite) un archivo de configuración OSGi en su proyecto en /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/org.apache.sling.security.impl.ReferrerFilter.cfg.json.

    • Cambiar /wknd-examples/ a /<project name>/
  2. Asegúrese de que el valor allow.empty esté establecido en true, de que allow.hosts (o, si lo prefiere, allow.hosts.regexp) contenga el origen del IDP y de que filter.methods incluya POST. La configuración de OSGi debe ser similar a:

    code language-json
    {
        "allow.empty": true,
        "allow.hosts.regexp": [ ],
        "allow.hosts": [
            "$[env:SAML_IDP_REFERRER;default=dev-123567890.okta.com]"
        ],
        "filter.methods": [
            "POST",
        ],
        "exclude.agents.regexp": [ ]
    }
    

AEM Publish admite una sola configuración de filtro de referente, por lo que debe combinar los requisitos de configuración de SAML con cualquier configuración existente.

Las configuraciones de OSGi por entorno (config.publish.dev, config.publish.stage y config.publish.prod) se pueden definir con atributos específicos si allow.hosts (o allow.hosts.regex) varían entre entornos.

Configuración del intercambio de recursos de origen cruzado (CORS)

Durante el proceso de autenticación SAML, el IDP inicia un POST HTTP del lado del cliente en el punto final .../saml_login de AEM Publish. Si el IDP y la publicación de AEM existen en hosts/dominios diferentes, el intercambio de recursos de origen de CRoss (CORS) de AEM Publish debe configurarse para permitir HTTP POST desde el host/dominio del IDP.

El encabezado Origin de esta solicitud HTTP POST suele tener un valor diferente al host de publicación de AEM, por lo que requiere la configuración CORS.

Al probar la autenticación SAML en AEM SDK local (localhost:4503), el IDP puede establecer el encabezado Origin en null. Si es así, agregue "null" a la lista alloworigin.

  1. Cree un archivo de configuración OSGi en su proyecto en /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.cors.impl.CORSPolicyImpl~saml.cfg.json

    • Cambiar /wknd-examples/ a su nombre de proyecto
    • El identificador después de ~ en el nombre de archivo debe identificar de forma exclusiva esta configuración, por lo que puede ser el nombre del IDP, como ...CORSPolicyImpl~okta.cfg.json. El valor debe ser alfanumérico y contener guiones.
  2. Pegue el siguiente JSON en el archivo com.adobe.granite.cors.impl.CORSPolicyImpl~...cfg.json.

{
    "alloworigin": [
        "$[env:SAML_IDP_ORIGIN;default=https://dev-1234567890.okta.com]",
        "null"
    ],
    "allowedpaths": [
        ".*/saml_login"
    ],
    "supportedmethods": [
        "POST"
    ]
}

Las configuraciones de OSGi por entorno (config.publish.dev, config.publish.stage y config.publish.prod) se pueden definir con atributos específicos si alloworigin y allowedpaths varían entre entornos.

Configuración de AEM Dispatcher para permitir HTTP POST de SAML

Después de autenticarse correctamente en el IDP, el IDP orquestará un POST HTTP de vuelta al punto final /saml_login registrado de AEM (configurado en el IDP). Este POST HTTP para /saml_login está bloqueado de forma predeterminada en Dispatcher, por lo que debe permitirse explícitamente usando la siguiente regla de Dispatcher:

  1. Abra dispatcher/src/conf.dispatcher.d/filters/filters.any en su IDE.
  2. Agregue al final del archivo una regla de permiso para POST HTTP a direcciones URL que terminen con /saml_login.
...

# Allow SAML HTTP POST to ../saml_login end points
/0190 { /type "allow" /method "POST" /url "*/saml_login" }
NOTE
Cuando implemente varias configuraciones de SAML en AEM para varias rutas protegidas y diferentes puntos de conexión de IDP, asegúrese de que el IDP publique en el punto de conexión RESPECTIVE_PROTECTED_PATH/saml_login para seleccionar la configuración de SAML adecuada en el lado de AEM. Si hay configuraciones de SAML duplicadas para la misma ruta protegida, la selección de la configuración de SAML se producirá aleatoriamente.

Si está configurada la reescritura de URL en el servidor web Apache (dispatcher/src/conf.d/rewrites/rewrite.rules), asegúrese de que las solicitudes a los puntos finales .../saml_login no se manipulen accidentalmente.

Pertenencia a grupo dinámico

La pertenencia a grupos dinámicos es una característica de Apache Jackrabbit Oak que aumenta el rendimiento de la evaluación y el aprovisionamiento de grupos. En esta sección se describe cómo se almacenan los usuarios y grupos cuando se habilita esta función y cómo modificar la configuración del Controlador de autenticación SAML para habilitarlo para entornos nuevos o existentes.

Cómo habilitar la pertenencia a grupos dinámicos para usuarios de SAML en nuevos entornos

Para mejorar significativamente el rendimiento de la evaluación de grupos en nuevos entornos de AEM as a Cloud Service, se recomienda activar la función de pertenencia a grupos dinámicos en nuevos entornos.
También es un paso necesario cuando se activa la sincronización de datos. Más detalles aquí .
Para ello, agregue la siguiente propiedad al archivo de configuración OSGI:

/apps/example/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~example.cfg.json

Con esta configuración, los usuarios y grupos se crean como usuarios externos de Oak. En AEM, los usuarios y grupos externos tienen un(a) rep:principalName predeterminado compuesto(a) por [user name];[idp] o [group name];[idp].
Observe que las Listas de control de acceso (ACL) están asociadas al nombre principal de los usuarios o grupos.
Al implementar esta configuración en una implementación existente en la que anteriormente identitySyncType no se especificaba ni se establecía en default, se crearán nuevos usuarios y grupos y se deberá aplicar ACL a estos nuevos usuarios y grupos. Tenga en cuenta que los grupos externos no pueden contener usuarios locales. Repoinit se puede usar para crear ACL para grupos externos SAML, incluso si solo se crearán cuando el usuario inicie sesión.
Para evitar esta refactorización en ACL, se ha implementado una característica de migración estándar.

Almacenamiento de las suscripciones en grupos locales y externos con pertenencia a grupos dinámicos

En los grupos locales, los miembros del grupo se almacenan en el atributo oak: rep:members. El atributo contiene la lista de uid de cada miembro del grupo. Se pueden encontrar detalles adicionales aquí.
Ejemplo:

{
  "jcr:primaryType": "rep:Group",
  "rep:principalName": "operators",
  "rep:managedByIdp": "SAML",
  "rep:members": [
    "635afa1c-beeb-3262-83c4-38ea31e5549e",
    "5e496093-feb6-37e9-a2a1-7c87b1cec4b0",
    ...
  ],
   ...
}

Los grupos externos con pertenencia a grupo dinámico no almacenan ningún miembro en la entrada de grupo.
La pertenencia al grupo se almacena en las entradas de los usuarios. Encontrará documentación adicional aquí. Por ejemplo, este es el nodo de OAK para el grupo:

{
  "jcr:primaryType": "rep:Group",
  "jcr:mixinTypes": [
    "rep:AccessControllable"
  ],
  "jcr:createdBy": "",
  "jcr:created": "Tue Jul 16 2024 08:58:47 GMT+0000",
  "rep:principalName": "GROUP_1;aem-saml-idp-1",
  "rep:lastSynced": "Tue Jul 16 2024 08:58:47 GMT+0000",
  "jcr:uuid": "d9c6af8a-35c0-3064-899a-59af55455cd0",
  "rep:externalId": "GROUP_1;aem-saml-idp-1",
  "rep:authorizableId": "GROUP_1;aem-saml-idp-1"
}

Este es el nodo de un usuario miembro de ese grupo:

{
  "jcr:primaryType": "rep:User",
  "jcr:mixinTypes": [
    "rep:AccessControllable"
  ],
  "surname": "Test",
  "rep:principalName": "testUser",
  "rep:externalId": "test;aem-saml-idp-1",
  "rep:authorizableId": "test",
  "rep:externalPrincipalNames": [
    "projects-users;aem-saml-idp-1",
    "GROUP_2;aem-saml-idp-1",
    "GROUP_1;aem-saml-idp-1",
    "operators;aem-saml-idp-1"
  ],
  ...
}

Habilitación de la pertenencia a grupos dinámicos para usuarios de SAML en entornos existentes

Como se explica en la sección anterior, el formato de los usuarios y grupos externos es ligeramente diferente del utilizado para los usuarios y grupos locales. Es posible definir una nueva ACL para grupos externos y aprovisionar nuevos usuarios externos, o utilizar la herramienta de migración como se describe a continuación.

Habilitar la pertenencia a grupos dinámicos para entornos existentes con usuarios externos

El controlador de autenticación SAML crea usuarios externos cuando se especifica la siguiente propiedad: "identitySyncType": "idp". En este caso, se puede habilitar la pertenencia al grupo dinámico modificando esta propiedad a: "identitySyncType": "idp_dynamic". No se requiere ninguna migración.

Migración automática a la pertenencia a grupos dinámicos para entornos existentes con usuarios locales

El controlador de autenticación SAML crea usuarios locales cuando se especifica la siguiente propiedad: "identitySyncType": "default". También es el valor predeterminado cuando no se especifica la propiedad. En esta sección describimos los pasos que debe seguir el procedimiento de migración automática.

Cuando esta migración está habilitada, se realiza durante la autenticación del usuario y consiste en los siguientes pasos:

  1. El usuario local se migra a un usuario externo mientras se mantiene el nombre de usuario original. Esto implica que los usuarios locales migrados, que ahora actúan como usuarios externos, conservan su nombre de usuario original en lugar de seguir la sintaxis de nomenclatura mencionada en la sección anterior. Se agregará una propiedad adicional llamada: rep:externalId con el valor de [user name];[idp]. No se modificó el usuario PrincipalName.
  2. Para cada grupo externo recibido en la aserción SAML, se crea un grupo externo. Si existe un grupo local correspondiente, el grupo externo se agrega al grupo local como miembro.
  3. El usuario se agrega como miembro del grupo externo.
  4. A continuación, el usuario local se elimina de todos los grupos locales de Saml a los que era miembro. La propiedad OAK identifica los grupos locales de muestra: rep:managedByIdp. El controlador de autenticación Saml establece esta propiedad cuando el atributo syncType no se especifica o no se establece en default.

Por ejemplo, si antes de la migración user1 es un usuario local y un miembro del grupo local group1, después de la migración se producirán los siguientes cambios:
user1 se convierte en un usuario externo. El atributo rep:externalId se agrega a este perfil.
user1 se convierte en miembro del grupo externo: group1;idp
user1 ya no es un miembro directo del grupo local: group1
group1;idp es miembro del grupo local: group1.
user1 es entonces miembro del grupo local: group1 a través de la herencia

La pertenencia a grupos para grupos externos se almacena en el perfil de usuario de la propiedad rep:externalPrincipalNames

Configuración de la migración automática a la pertenencia a grupos dinámicos

  1. Habilite la propiedad "identitySyncType": "idp_dynamic_simplified_id" en el archivo de configuración OSGi de SAML: com.adobe.granite.auth.saml.SamlAuthenticationHandler~...cfg.json :
  2. Configure el nuevo servicio OSGi con el PID de fábrica que comienza por: com.adobe.granite.auth.saml.migration.SamlDynamicGroupMembershipMigration~. Por ejemplo, un PID puede ser: com.adobe.granite.auth.saml.migration.SamlDynamicGroupMembershipMigration~myIdP. Establezca la siguiente propiedad:
{
  "idpIdentifier": "<value of IDP Identifier (idpIdentifier)" property from the "com.adobe.granite.auth.saml.SamlAuthenticationHandler" configuration to be migrated>"
}

Para migrar varias configuraciones de SAML, se deben crear varias configuraciones de fábrica de OSGi para com.adobe.granite.auth.saml.migration.SamlDynamicGroupMembershipMigration, cada una de las cuales especifique un idpIdentifier para migrar.

Implementación de la configuración SAML

Las configuraciones de OSGi deben enviarse a Git e implementarse en AEM as a Cloud Service mediante Cloud Manager.

$ git remote -v
adobe   https://git.cloudmanager.adobe.com/myOrg/myCloudManagerGit/ (fetch)
adobe   https://git.cloudmanager.adobe.com/myOrg/myCloudManagerGit/ (push)
$ git add .
$ git commit -m "SAML 2.0 configurations"
$ git push adobe saml-auth:develop

Implemente la rama de Git de Cloud Manager de destino (en este ejemplo, develop) mediante una canalización de implementación de pila completa.

Invocación de la autenticación SAML

El flujo de autenticación SAML se puede invocar desde una página web del sitio de AEM, creando vínculos especialmente diseñados o botones. Los parámetros que se describen a continuación se pueden configurar mediante programación según sea necesario, por ejemplo, un botón de inicio de sesión puede establecer saml_request_path, que es donde se lleva al usuario tras la autenticación SAML correcta, en diferentes páginas de AEM, según el contexto del botón.

Almacenamiento en caché seguro mientras se usa SAML

En la instancia de publicación de AEM, la mayoría de las páginas se almacenan generalmente en caché. Sin embargo, para las rutas protegidas con SAML, el almacenamiento en caché debe deshabilitarse o el almacenamiento en caché seguro debe habilitarse mediante la configuración auth_checker. Para obtener más información, consulte los detalles proporcionados aquí

Tenga en cuenta que si almacena en caché rutas protegidas sin habilitar el auth_checker, puede experimentar un comportamiento impredecible.

petición GET

La autenticación SAML se puede invocar creando una petición HTTP GET con el formato:

HTTP GET /system/sling/login

y proporcionando parámetros de consulta:

Nombre del parámetro de consulta
Valor del parámetro de consulta
resource
Cualquier ruta JCR, o subruta, que sea la escucha del controlador de autenticación SAML, tal como se define en la propiedad OSGi del controlador de autenticación SAML 2.0 de Adobe Granite de la configuraciónpath.
saml_request_path
La ruta URL a la que debe dirigirse el usuario después de autenticarse correctamente en SAML.

Por ejemplo, este vínculo de HTML almacenará en déclencheur el flujo de inicio de sesión de SAML y, una vez realizado correctamente, llevará al usuario a /content/wknd/us/en/protected/page.html. Estos parámetros de consulta se pueden configurar mediante programación según sea necesario.

<a href="/system/sling/login?resource=/content/wknd&saml_request_path=/content/wknd/us/en/protected/page.html">
    Log in using SAML
</a>

petición POST

La autenticación SAML se puede invocar creando una solicitud HTTP POST con el formato:

HTTP POST /system/sling/login

y proporcionar los datos del formulario:

Nombre de datos de formulario
Valor de datos de formulario
resource
Cualquier ruta JCR, o subruta, que sea la escucha del controlador de autenticación SAML, tal como se define en la propiedad OSGi del controlador de autenticación SAML 2.0 de Adobe Granite de la configuraciónpath.
saml_request_path
La ruta URL a la que debe dirigirse el usuario después de autenticarse correctamente en SAML.

Por ejemplo, este botón de HTML utilizará un POST HTTP para almacenar en déclencheur el flujo de inicio de sesión de SAML y, una vez realizado correctamente, llevar al usuario a /content/wknd/us/en/protected/page.html. Estos parámetros de datos de formulario se pueden definir mediante programación según sea necesario.

<form action="/system/sling/login" method="POST">
    <input type="hidden" name="resource" value="/content/wknd">
    <input type="hidden" name="saml_request_path" value="/content/wknd/us/en/protected/page.html">
    <input type="submit" value="Log in using SAML">
</form>

Configuración de Dispatcher

Tanto el método HTTP GET como el método POST requieren acceso de cliente a los extremos /system/sling/login de AEM y, por lo tanto, se deben permitir a través de AEM Dispatcher.

Permitir los patrones de URL necesarios en función de si se utiliza GET o POST

# Allow GET-based SAML authentication invocation
/0191 { /type "allow" /method "GET" /url "/system/sling/login" /query "*" }

# Allow POST-based SAML authentication invocation
/0192 { /type "allow" /method "POST" /url "/system/sling/login" }
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69