Saiba como configurar e autenticar usuários finais (não autores de AEM) em um IDP compatível com SAML 2.0 de sua escolha.
A integração do SAML 2.0 com o AEM Publish (ou Preview) permite que os usuários finais de uma experiência da Web baseada em AEM se autentiquem em um IDP (Identity Provider, Provedor de identidade) não-Adobe e acessem o AEM como um usuário nomeado e autorizado.
Autor do AEM | AEM Publish | |
---|---|---|
Suporte ao SAML 2.0 | ✘ | ✔ |
O fluxo típico de uma integração do AEM Publish SAML é o seguinte:
/system/sling/login
) que solicita explicitamente a ação de logon.login-token
cookie na resposta HTTP, que é usada para autenticar solicitações subsequentes para o AEM Publish.saml_request_path
cookie.Este vídeo aborda a configuração da integração do SAML 2.0 com o serviço de publicação as a Cloud Service do AEM e o uso do Okta como o IDP.
Os seguintes itens são necessários ao configurar a autenticação SAML 2.0:
O SAML 2.0 só é compatível com a autenticação de usuários para publicação ou visualização no AEM. Para gerenciar a autenticação do AEM Author usando e o IDP, integrar o IDP ao Adobe IMS.
O certificado público do IDP é adicionado ao AEM Global Trust Store e usado para validar se a declaração SAML enviada pelo IDP é válida.
.../saml_login
) que inclui a asserção SAML assinada.Obtenha o certificado público do IDP. Esse certificado permite que o AEM valide a asserção SAML fornecida ao AEM pelo IDP.
O certificado está no formato PEM e deve se parecer com:
-----BEGIN CERTIFICATE-----
MIIC4jCBAcoCCQC33wnybT5QZDANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJV
...
m0eo2USlSRTVl7QHRTuiuSThHpLKQQ==
-----END CERTIFICATE-----
Faça logon no AEM Author como Administrador do AEM.
Navegue até Ferramentas > Segurança > Armazenamento de confiança.
Crie ou abra o Armazenamento global de confiança. Se estiver criando um armazenamento global de confiança, armazene a senha em algum lugar seguro.
Expandir Adicionar certificado do arquivo CER.
Selecionar Selecionar arquivo de certificado e carregue o arquivo de certificado fornecido pelo IDP.
Sair Mapear certificado para usuário em branco.
Selecione Enviar.
O certificado recém-adicionado aparece acima do campo Adicionar certificado do arquivo CRT seção.
Anote o alias, pois esse valor é usado no Configuração OSGi do Manipulador de autenticação SAML 2.0.
Selecionar Salvar e fechar.
O armazenamento global de confiança está configurado com o certificado público do IDP no AEM Author, mas como o SAML é usado somente no AEM Publish, o armazenamento global de confiança deve ser replicado para o AEM Publish para que o certificado público do IDP esteja acessível lá.
Global Trust Store
1.0.0
com.your.company
/etc/truststore
./etc/truststore
) para o AEM Publish.A criação de um armazenamento de chaves para o serviço de autenticação é necessária quando o Propriedade de configuração OSGi do manipulador de autenticação SAML 2.0 handleLogout
está definida como true
ou quando Autenticação AuthnRequest/criptografia de asserção SAML é obrigatório
Faça logon no AEM Author como Administrador do AEM para fazer upload da chave privada.
Navegue até Ferramentas > Segurança > Usuários e selecione serviço de autenticação e selecione Propriedades na barra de ação superior.
Selecione o Armazenamento de chaves guia.
Crie ou abra o armazenamento de chaves. Se estiver criando um armazenamento de chaves, mantenha a senha segura.
Selecionar Salvar e fechar.
Criar um pacote contendo os dados atualizados serviço de autenticação usuário.
Use a seguinte solução temporária usando pacotes:
Authentication Service
1.0.0
com.your.company
/home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore
.
<AUTHENTICATION SERVICE UUID>
pode ser encontrado navegando até Ferramentas > Segurança > Usuários e selecionando serviço de autenticação usuário. A UUID é a última parte do URL.A instalação do par de chave pública/privada do AEM é opcional
O AEM Publish pode ser configurado para assinar AuthnRequests (para IDP) e criptografar asserções SAML (para AEM). Isso é feito fornecendo uma chave privada para o AEM Publish e uma chave pública correspondente ao IDP.
A AuthnRequest (a solicitação ao IDP do AEM Publish que inicia o processo de logon) pode ser assinada pelo AEM Publish. Para fazer isso, o AEM Publish assina a AuthnRequest usando a chave privada, e garante que o IDP valida a assinatura usando a chave pública. Isso garante ao IDP que o AuthnRequest foi iniciado e solicitado pelo AEM Publish, e não por terceiros mal-intencionados.
Toda a comunicação HTTP entre o IDP e o AEM Publish deve ser por HTTPS e, portanto, segura por padrão. No entanto, conforme necessário, as afirmações SAML podem ser criptografadas caso seja necessário confidencialidade extra além da fornecida por HTTPS. Para fazer isso, o IDP criptografa os dados da SAML Assertion usando a chave privada e o AEM Publish descriptografa a asserção SAML usando a chave privada.
A assinatura de AuthnRequest e a criptografia de asserção SAML são opcionais, no entanto, ambas estão habilitadas, usando o Propriedade de configuração OSGi do manipulador de autenticação SAML 2.0 useEncryption
, o que significa que ambos ou nenhum dos dois pode ser usado.
Obtenha a chave pública, a chave privada (PKCS#8 no formato DER) e o arquivo da cadeia de certificados (pode ser a chave pública) usados para assinar o AuthnRequest e criptografar a asserção SAML. Normalmente, as chaves são fornecidas pela equipe de segurança da organização de TI.
$ 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
Faça upload da chave pública para o IDP.
openssl
acima, a chave pública é a variável aem-public.crt
arquivo.Faça logon no AEM Author como Administrador do AEM para fazer upload da chave privada.
Navegue até Ferramentas > Segurança > Armazenamento de confiança e selecione serviço de autenticação e selecione Propriedades na barra de ação superior.
Navegue até Ferramentas > Segurança > Usuários e selecione serviço de autenticação e selecione Propriedades na barra de ação superior.
Selecione o Armazenamento de chaves guia.
Crie ou abra o armazenamento de chaves. Se estiver criando um armazenamento de chaves, mantenha a senha segura.
Selecionar Adicionar chave privada do arquivo DER e adicione a chave privada e o arquivo de cadeia ao AEM:
openssl
acima, este é o aem-private-pkcs8.der
arquivoopenssl
acima, este é o aem-public.crt
arquivoO certificado recém-adicionado aparece acima do campo Adicionar certificado do arquivo CRT seção.
Selecionar Salvar e fechar.
Criar um pacote contendo os dados atualizados serviço de autenticação usuário.
Use a seguinte solução temporária usando pacotes:
Authentication Service
1.0.0
com.your.company
/home/users/system/cq:services/internal/security/<AUTHENTICATION SERVICE UUID>/keystore
.
<AUTHENTICATION SERVICE UUID>
pode ser encontrado navegando até Ferramentas > Segurança > Usuários e selecionando serviço de autenticação usuário. A UUID é a última parte do URL.A configuração SAML do AEM é executada por meio de Manipulador de autenticação Adobe Granite SAML 2.0 Configuração do OSGi.
A configuração é uma configuração de fábrica OSGi, o que significa que um único serviço de Publicação as a Cloud Service de AEM pode ter várias configurações SAML cobrindo árvores de recursos discretas do repositório; isso é útil para implantações do AEM em vários sites.
Propriedade OSGi | Obrigatório | Formato do valor | Valor padrão | Descrição | |
---|---|---|---|---|---|
Caminhos | path |
✔ | Matriz de string | / |
Caminhos de AEM para os quais esse manipulador de autenticação é usado. |
URL DO IDP | idpUrl |
✔ | String | URL do IDP para o qual a solicitação de autenticação SAML é enviada. | |
Alias do certificado IDP | idpCertAlias |
✔ | String | Alias do certificado IDP encontrado no AEM Global Trust Store | |
Redirecionamento HTTP IDP | idpHttpRedirect |
✘ | Booleano | false |
Indica se há um Redirecionamento HTTP para o URL do IDP em vez de enviar uma AuthnRequest. Defina como true para autenticação iniciada por IDP. |
Identificador do IDP | idpIdentifier |
✘ | String | ID exclusiva do IDP para garantir a exclusividade do usuário e do grupo do AEM. Se estiver vazio, a variável serviceProviderEntityId é usado em seu lugar. |
|
URL do serviço do consumidor de asserção | assertionConsumerServiceURL |
✘ | String | A variável AssertionConsumerServiceURL Atributo de URL na AuthnRequest especificando onde a variável <Response> deve ser enviada ao AEM. |
|
Id de entidade da controladora | serviceProviderEntityId |
✔ | String | Identifica exclusivamente o AEM para o IDP; geralmente, o nome do host AEM. | |
Criptografia da controladora | useEncryption |
✘ | Booleano | true |
Indica se o IDP criptografa asserções SAML. Exige spPrivateKeyAlias e keyStorePassword a definir. |
Alias da chave privada da controladora | spPrivateKeyAlias |
✘ | String | O alias da chave privada no authentication-service armazenamento de chaves do usuário. Obrigatório se useEncryption está definida como true . |
|
Senha do armazenamento de chave da controladora | keyStorePassword |
✘ | String | A senha do armazenamento de chaves do usuário 'serviço de autenticação'. Obrigatório se useEncryption está definida como true . |
|
Redirecionamento padrão | defaultRedirectUrl |
✘ | String | / |
O URL de redirecionamento padrão após a autenticação bem-sucedida. Pode ser relativo ao host AEM (por exemplo, /content/wknd/us/en/html ). |
Atributo de ID de usuário | userIDAttribute |
✘ | String | uid |
O nome do atributo de asserção SAML que contém a ID do usuário AEM. Deixe em branco para utilizar Subject:NameId . |
Criar usuários do AEM automaticamente | createUser |
✘ | Booleano | true |
Indica se os usuários do AEM são criados na autenticação bem-sucedida. |
Caminho intermediário do usuário do AEM | userIntermediatePath |
✘ | String | Ao criar usuários do AEM, esse valor é usado como o caminho intermediário (por exemplo, /home/users/<userIntermediatePath>/jane@wknd.com ). Exige createUser a ser definido como true . |
|
Atributos de usuário do AEM | synchronizeAttributes |
✘ | Matriz de string | Lista de mapeamentos de atributos SAML para armazenar no usuário AEM, no formato [ "saml-attribute-name=path/relative/to/user/node" ] (por exemplo, [ "firstName=profile/givenName" ] ). Consulte a lista completa de atributos nativos do AEM. |
|
Adicionar usuário a grupos de AEM | addGroupMemberships |
✘ | Booleano | true |
Indica se um usuário AEM é adicionado automaticamente a grupos de usuários AEM após a autenticação bem-sucedida. |
Atributo de associação de grupo AEM | groupMembershipAttribute |
✘ | String | groupMembership |
O nome do atributo de asserção SAML contendo uma lista de grupos de usuários AEM aos quais o usuário deve ser adicionado. Exige addGroupMemberships a ser definido como true . |
Grupos AEM padrão | defaultGroups |
✘ | Matriz de string | Uma lista de grupos de usuários AEM autenticados é sempre adicionada ao (por exemplo, [ "wknd-user" ] ). Exige addGroupMemberships a ser definido como true . |
|
Formato de NameIDPolicy | nameIdFormat |
✘ | String | urn:oasis:names:tc:SAML:2.0:nameid-format:transient |
O valor do parâmetro de formato NameIDPolicy a ser enviado na mensagem AuthnRequest. |
Armazenar resposta SAML | storeSAMLResponse |
✘ | Booleano | false |
Indica se a variável samlResponse é armazenado no AEM cq:User nó. |
Manipular logout | handleLogout |
✘ | Booleano | false |
Indica se a solicitação de logout é tratada por esse manipulador de autenticação SAML. Exige logoutUrl a definir. |
URL de saída | logoutUrl |
✘ | String | URL do IDP para o qual a solicitação de logout do SAML é enviada. Obrigatório se handleLogout está definida como true . |
|
Tolerância do relógio | clockTolerance |
✘ | Número inteiro | 60 |
Tolerância de desvio do relógio IDP e AEM (SP) ao validar asserções SAML. |
Método Digest | digestMethod |
✘ | String | http://www.w3.org/2001/04/xmlenc#sha256 |
O algoritmo de compilação que o IDP usa ao assinar uma mensagem SAML. |
Método de assinatura | signatureMethod |
✘ | String | http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 |
O algoritmo de assinatura que o IDP usa ao assinar uma mensagem SAML. |
Tipo de sincronização de identidade | identitySyncType |
✘ | default ou idp |
default |
Não alterar from padrão para o AEM as a Cloud Service. |
Classificação de serviço | service.ranking |
✘ | Número inteiro | 5002 |
As configurações de classificação mais altas são preferidas para a mesma path . |
O AEM usa os seguintes atributos de usuário, que podem ser preenchidos por meio da variável synchronizeAttributes
propriedade na configuração OSGi do Manipulador de autenticação SAML 2.0 do Adobe Granite. Qualquer atributo do IDP pode ser sincronizado com qualquer propriedade de usuário do AEM. No entanto, o mapeamento para o AEM usa propriedades de atributo (listadas abaixo) permite que o AEM as use naturalmente.
Atributo de usuário | Caminho de propriedade relativa de rep:User nó |
---|---|
Título (por exemplo, Mrs ) |
profile/title |
Nome (ou seja, nome) | profile/givenName |
Nome da família (ou seja, sobrenome) | profile/familyName |
Cargo | profile/jobTitle |
Endereço de e-mail | profile/email |
Endereço | profile/street |
Cidade | profile/city |
Código postal | profile/postalCode |
País | profile/country |
Número de telefone | profile/phoneNumber |
Sobre mim | profile/aboutMe |
Crie um arquivo de configuração OSGi em seu projeto em /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json
e abra no IDE.
/wknd-examples/
ao seu /<project name>/
~
no nome do arquivo deve identificar exclusivamente essa configuração, portanto, pode ser o nome do IDP, como ...~okta.cfg.json
. O valor deve ser alfanumérico com hifens.Cole o seguinte JSON no com.adobe.granite.auth.saml.SamlAuthenticationHandler~...cfg.json
e atualize o wknd
referências conforme necessário.
{
"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"
]
}
Atualize os valores conforme exigido pelo projeto. Consulte a Glossário de configuração OSGi do Manipulador de autenticação SAML 2.0 acima para obter descrições das propriedades de configuração
É recomendável, mas não obrigatório, usar variáveis de ambiente OSGi e segredos, quando os valores puderem mudar fora de sincronia com o ciclo de lançamento ou quando os valores forem diferentes entre tipos de ambiente/camadas de serviço semelhantes. Valores padrão podem ser definidos com o uso de $[env:..;default=the-default-value]"
conforme mostrado acima.
Configurações de OSGi por ambiente (config.publish.dev
, config.publish.stage
, e config.publish.prod
) pode ser definida com atributos específicos se a configuração do SAML variar entre ambientes.
Quando criptografando a asserção AuthnRequest e SAML, as seguintes propriedades são obrigatórias: useEncryption
, spPrivateKeyAlias
, e keyStorePassword
. A variável keyStorePassword
contém uma senha, portanto, o valor não deve ser armazenado no arquivo de configuração do OSGi, mas inserido usando valores de configuração secreta
Abertura /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json
no IDE.
Adicionar as três propriedades useEncryption
, spPrivateKeyAlias
, e keyStorePassword
conforme mostrado abaixo.
{
"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"
]
}
As três propriedades de configuração do OSGi necessárias para criptografia são:
useEncryption
definir como true
spPrivateKeyAlias
contém o alias de entrada do keystore para a chave privada usada pela integração SAML.keyStorePassword
contém um Variável de configuração secreta OSGi contendo o authentication-service
senha do keystore do usuário.Durante o processo de autenticação SAML, o IDP inicia um POST HTTP do lado do cliente para o AEM Publish .../saml_login
ponto final. Se o IDP e o AEM Publish existirem em uma origem diferente, o AEM Publish Filtro referenciador é configurado por meio da configuração OSGi para permitir HTTP POSTs da origem do IDP.
Crie (ou edite) um arquivo de configuração OSGi em seu projeto em /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/org.apache.sling.security.impl.ReferrerFilter.cfg.json
.
/wknd-examples/
ao seu /<project name>/
Assegure a allow.empty
o valor está definido como true
, o allow.hosts
(ou se preferir, allow.hosts.regexp
) contém a origem do IDP e filter.methods
inclui POST
. A configuração do OSGi deve ser semelhante a:
{
"allow.empty": true,
"allow.hosts.regexp": [ ],
"allow.hosts": [
"$[env:SAML_IDP_REFERRER;default=dev-123567890.okta.com]"
],
"filter.methods": [
"POST",
],
"exclude.agents.regexp": [ ]
}
O AEM Publish é compatível com uma única configuração de filtro Referenciador, portanto, mescle os requisitos de configuração do SAML com qualquer configuração existente.
Configurações de OSGi por ambiente (config.publish.dev
, config.publish.stage
, e config.publish.prod
) pode ser definida com atributos específicos se a variável allow.hosts
(ou allow.hosts.regex
) variam entre os ambientes.
Durante o processo de autenticação SAML, o IDP inicia um POST HTTP do lado do cliente para o AEM Publish .../saml_login
ponto final. Se o IDP e o AEM Publish existirem em hosts/domínios diferentes, o AEM Publish Compartilhamento de recursos de origem CRoss (CORS) deve ser configurado para permitir POSTs HTTP do host/domínio do IDP.
Esta solicitação HTTP POST Origin
normalmente tem um valor diferente do host de publicação do AEM, exigindo a configuração do CORS.
Ao testar a autenticação SAML no SDK AEM local (localhost:4503
), o IDP pode definir as Origin
cabeçalho para null
. Em caso afirmativo, adicione "null"
para o alloworigin
lista.
/ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.cors.impl.CORSPolicyImpl~saml.cfg.json
/wknd-examples/
ao nome do seu projeto~
no nome do arquivo deve identificar exclusivamente essa configuração, portanto, pode ser o nome do IDP, como ...CORSPolicyImpl~okta.cfg.json
. O valor deve ser alfanumérico com hifens.com.adobe.granite.cors.impl.CORSPolicyImpl~...cfg.json
arquivo.{
"alloworigin": [
"$[env:SAML_IDP_ORIGIN;default=https://dev-1234567890.okta.com]",
"null"
],
"allowedpaths": [
".*/saml_login"
],
"supportedmethods": [
"POST"
]
}
Configurações de OSGi por ambiente (config.publish.dev
, config.publish.stage
, e config.publish.prod
) pode ser definida com atributos específicos se a variável alloworigin
e allowedpaths
O varia entre os ambientes.
Após a autenticação bem-sucedida para o IDP, o IDP orquestrará um POST HTTP de volta para AEM registrado /saml_login
ponto final (configurado no IDP). Esta POST HTTP para /saml_login
O está bloqueado por padrão no Dispatcher, portanto, deve ser permitido explicitamente usando a seguinte regra do Dispatcher:
dispatcher/src/conf.dispatcher.d/filters/filters.any
no IDE./saml_login
....
# Allow SAML HTTP POST to ../saml_login end points
/0190 { /type "allow" /method "POST" /url "*/saml_login" }
Se a reescrita de URL no servidor Web Apache estiver configurada (dispatcher/src/conf.d/rewrites/rewrite.rules
), assegurar que os pedidos de .../saml_login
Os pontos finais não são danificados acidentalmente.
Depois que o fluxo de autenticação SAML cria um usuário no AEM Publish, o nó do usuário AEM é autenticável na camada de serviço do AEM Publish.
Isso requer sincronização de dados e tokens encapsulados para ser ativado pelo Suporte para Adobe no serviço de publicação do AEM.
Envie uma solicitação para o Suporte ao cliente do Adobe (via Admin Console > Suporte) solicitando:
A sincronização de dados e os tokens encapsulados são ativados no serviço de publicação do AEM para o Programa X e o Ambiente Y.
As configurações do OSGi devem ser confirmadas no Git e implantadas no AEM as a Cloud Service usando o 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
Implante a ramificação Git do Cloud Manager de destino (neste exemplo, develop
), usando um pipeline de implantação de empilhamento completo.