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 a Publicação do AEM (ou Visualização) permite que os usuários finais de uma experiência da Web com base em AEM sejam autenticados para um não Adobe IDP (Provedor de identidade) e acessem o AEM como um usuário nomeado e autorizado.
Autor do AEM | AEM Publish | |
---|---|---|
Suporte para SAML 2.0 | ✘ | ✔ |
O fluxo típico de uma integração SAML de publicação do AEM é o seguinte:
/system/sling/login
) que solicita explicitamente a ação de logon.login-token
cookie na resposta HTTP, que é usado 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 AEM serviço de publicação as a Cloud Service e o uso do Okta como IDP.
Os itens a seguir são necessários ao configurar a autenticação SAML 2.0:
O SAML 2.0 é compatível apenas com a autenticação de usuários para a Publicação ou Visualização do AEM. Para gerenciar a autenticação do autor do AEM usando o e o IDP, integrar o IDP ao Adobe IMS.
O certificado público do IDP é adicionado AEM Armazenamento de Confiança Global e usado para validar a asserção de SAML enviada pelo IDP é válido.
.../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 ser semelhante a:
-----BEGIN CERTIFICATE-----
MIIC4jCBAcoCCQC33wnybT5QZDANBgkqhkiG9w0BAQsFADAyMQswCQYDVQQGEwJV
...
m0eo2USlSRTVl7QHRTuiuSThHpLKQQ==
-----END CERTIFICATE-----
Faça logon no AEM Author como um administrador de AEM.
Navegar para Ferramentas > Segurança > Armazenamento de confiança.
Crie ou abra o Armazenamento de Confiança Global. Se estiver criando um Armazenamento de Confiança Global, armazene a senha em algum lugar seguro.
Expandir Adicionar certificado do arquivo CER.
Selecionar Selecionar arquivo de certificado e faça upload do arquivo de certificado fornecido pelo IDP.
Sair Mapear certificado para usuário em branco.
Selecione Enviar.
O certificado recém-adicionado aparece acima da Adicionar certificado do arquivo CRT seção.
Anote o alias, pois esse valor é usado na variável Configuração OSGi do Manipulador de Autenticação SAML 2.0.
Selecionar Salvar e fechar.
O Armazenamento de confiança global é configurado com o certificado público do IDP no Autor do AEM, mas como o SAML é usado apenas na Publicação do AEM, o Armazenamento de confiança global deve ser replicado para Publicação do AEM 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 Publicação no AEM.A instalação do par de chaves públicas/privadas AEM é opcional
A Publicação do AEM pode ser configurada para assinar as Solicitações de Autor (para o IDP) e criptografar asserções de SAML (para AEM). Isso é feito fornecendo uma chave privada para o AEM Publish e é a chave pública correspondente ao IDP.
O AuthnRequest (a solicitação para o IDP da publicação do AEM que inicia o processo de logon) pode ser assinado pelo AEM Publish. Para fazer isso, o AEM Publish assina o AuthnRequest usando a chave privada, de 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 um terceiro mal-intencionado.
Todas as comunicações HTTP entre o IDP e o AEM Publish devem ser via HTTPS e, portanto, seguras por padrão. No entanto, conforme necessário, as asserções de SAML podem ser criptografadas no caso de uma confidencialidade extra ser exigida além da fornecida pelo HTTPS. Para fazer isso, o IDP criptografa os dados de Asserção SAML usando a chave privada e o AEM Publish descriptografa a asserção SAML usando a chave privada.
A assinatura AuthnRequest e a criptografia de asserção SAML são opcionais, no entanto, ambas são ativadas, 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 (esta pode ser a chave pública) usados para assinar o AuthnRequest e criptografar a asserção SAML. As chaves são normalmente 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.
Navegar para Ferramentas > Segurança > Armazenamento de confiança e selecione serviço de autenticação e selecione Propriedades na barra de ação superior.
Navegar para 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 repositório 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 método aem-private-pkcs8.der
arquivoopenssl
acima, este é o método aem-public.crt
arquivoO certificado recém-adicionado aparece acima da Adicionar certificado do arquivo CRT seção.
Selecionar Salvar e fechar.
Selecionar serviço de autenticação e selecione Ativar na barra de ação superior.
AEM configuração do SAML é executada por meio do Manipulador de autenticação do 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 AEM pode ter várias configurações SAML cobrindo árvores de recursos discretas do repositório; isso é útil para implantações de AEM de vários sites.
Propriedade OSGi | Obrigatório | Formato do valor | Valor padrão | Descrição | |
---|---|---|---|---|---|
Caminhos | path |
✔ | Matriz de sequência | / |
AEM caminhos para os quais esse manipulador de autenticação é usado. |
URL do IDP | idpUrl |
✔ | Sequência de caracteres | URL IDP para a qual a solicitação de autenticação SAML é enviada. | |
alias do certificado IDP | idpCertAlias |
✔ | Sequência de caracteres | O alias do certificado IDP encontrado no AEM Global Trust Store | |
Redirecionamento HTTP IDP | idpHttpRedirect |
✘ | Booleano | false |
Indica se um redirecionamento HTTP para o URL do IDP em vez de enviar um AuthnRequest. Defina como true para autenticação iniciada pelo IDP. |
Identificador do IDP | idpIdentifier |
✘ | Sequência de caracteres | Id de IDP exclusiva para garantir AEM exclusividade de usuários e grupos. Se estiver vazio, a variável serviceProviderEntityId é usada em vez disso. |
|
URL do serviço de consumidor de asserção | assertionConsumerServiceURL |
✘ | Sequência de caracteres | O AssertionConsumerServiceURL Atributo de URL no AuthnRequest especificando onde a variável <Response> deve ser enviada para AEM. |
|
ID da entidade SP | serviceProviderEntityId |
✔ | Sequência de caracteres | Identifica exclusivamente AEM ao IDP; geralmente o nome do host AEM. | |
Criptografia de SP | useEncryption |
✘ | Booleano | true |
Indica se o IDP criptografa asserções SAML. Exige spPrivateKeyAlias e keyStorePassword a ser definido. |
alias da chave privada do SP | spPrivateKeyAlias |
✘ | Sequência de caracteres | O alias da chave privada no authentication-service repositório de chaves do usuário. Obrigatório se useEncryption está definida como true . |
|
Senha do armazenamento de chaves do SP | keyStorePassword |
✘ | Sequência de caracteres | A senha do armazenamento de chaves do usuário 'authentication-service'. Obrigatório se useEncryption está definida como true . |
|
Redirecionamento padrão | defaultRedirectUrl |
✘ | Sequência de caracteres | / |
O URL de redirecionamento padrão após a autenticação bem-sucedida. Pode ser relativo ao host do AEM (por exemplo, /content/wknd/us/en/html ). |
Atributo de ID de usuário | userIDAttribute |
✘ | Sequência de caracteres | uid |
O nome do atributo de asserção SAML contendo o ID de usuário do usuário AEM. Deixe em branco para usar a variável Subject:NameId . |
Criar usuários de AEM automaticamente | createUser |
✘ | Booleano | true |
Indica se AEM usuários foram criados na autenticação bem-sucedida. |
Caminho intermediário do usuário AEM | userIntermediatePath |
✘ | Sequência de caracteres | Ao criar AEM usuários, esse valor é usado como o caminho intermediário (por exemplo, /home/users/<userIntermediatePath>/jane@wknd.com ). Exige createUser a ser definido como true . |
|
AEM atributos do usuário | synchronizeAttributes |
✘ | Matriz de sequência | Lista de mapeamentos de atributos SAML a serem armazenados 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 de AEM nativos. |
|
Adicionar usuário a grupos AEM | addGroupMemberships |
✘ | Booleano | true |
Indica se um usuário AEM é adicionado automaticamente a AEM grupos de usuários após uma autenticação bem-sucedida. |
Atributo de associação de grupo AEM | groupMembershipAttribute |
✘ | Sequência de caracteres | groupMembership |
O nome do atributo de asserção SAML contendo uma lista de AEM grupos de usuários aos quais o usuário deve ser adicionado. Exige addGroupMemberships a ser definido como true . |
Grupos de AEM padrão | defaultGroups |
✘ | Matriz de sequência | Uma lista de AEM grupos de usuários aos quais os usuários autenticados são sempre adicionados (por exemplo, [ "wknd-user" ] ). Exige addGroupMemberships a ser definido como true . |
|
Formato NameIDPolicy | nameIdFormat |
✘ | Sequência de caracteres | urn:oasis:names:tc:SAML:2.0:nameid-format:transient |
O valor do parâmetro NameIDPolicy format para enviar na mensagem AuthnRequest . |
Armazenar resposta SAML | storeSAMLResponse |
✘ | Booleano | false |
Indica se a variável samlResponse é armazenado no AEM cq:User nó . |
Gerenciar logout | handleLogout |
✘ | Booleano | false |
Indica se a solicitação de logout é tratada por este manipulador de autenticação SAML. Exige logoutUrl a ser definido. |
URL de logout | logoutUrl |
✘ | Sequência de caracteres | URL do IDP para o qual a solicitação de logout do SAML é enviada. Obrigatório se handleLogout está definida como true . |
|
Tolerância de relógio | clockTolerance |
✘ | Inteiro | 60 |
A tolerância de desvio de clock do IDP e do AEM (SP) ao validar asserções de SAML. |
Método Digest | digestMethod |
✘ | Sequência de caracteres | http://www.w3.org/2001/04/xmlenc#sha256 |
O algoritmo de resumo que o IDP usa ao assinar uma mensagem SAML. |
Método de assinatura | signatureMethod |
✘ | Sequência de caracteres | 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 AEM as a Cloud Service. |
Classificação do serviço | service.ranking |
✘ | Inteiro | 5002 |
As configurações de classificação mais altas são preferidas para o mesmo path . |
O AEM usa os seguintes atributos de usuário, que podem ser preenchidos por meio da variável synchronizeAttributes
na configuração OSGi do Manipulador de Autenticação do Adobe Granite SAML 2.0. Todos os atributos do IDP podem ser sincronizados com qualquer propriedade de usuário AEM, no entanto, o mapeamento para AEM usar propriedades de atributo (listado abaixo) permite AEM usá-los naturalmente.
Atributo do usuário | Caminho da propriedade relativa de rep:User nó |
---|---|
Título (por exemplo, Mrs ) |
profile/title |
Nome próprio (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 no 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/
para /<project name>/
~
no nome do arquivo deve identificar exclusivamente essa configuração, de modo que 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 seu projeto. Consulte a Glossário de configuração do OSGi do Manipulador de Autenticação SAML 2.0 acima para descrições de propriedades de configuração
É recomendável, mas não obrigatório, usar variáveis e segredos de ambiente OSGi, quando os valores podem mudar fora de sincronia com o ciclo de lançamento ou quando os valores são diferentes entre tipos de ambiente/níveis de serviço semelhantes. Os valores padrão podem ser definidos usando o $[env:..;default=the-default-value]"
como mostrado acima.
Configurações OSGi por ambiente (config.publish.dev
, config.publish.stage
e config.publish.prod
) pode ser definido com atributos específicos se a configuração do SAML variar entre ambientes.
When criptografando a asserção AuthnRequest e SAML, as seguintes propriedades são obrigatórias: useEncryption
, spPrivateKeyAlias
e keyStorePassword
. O keyStorePassword
contém uma senha, portanto, o valor não deve ser armazenado no arquivo de configuração OSGi, mas sim injetado usando valores de configuração secreta
Abrir /ui.config/src/main/content/jcr_root/wknd-examples/osgiconfig/config.publish/com.adobe.granite.auth.saml.SamlAuthenticationHandler~saml.cfg.json
no IDE.
Adicione 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
defina como true
spPrivateKeyAlias
contém o alias de entrada do repositório de chaves 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 do SAML, o IDP inicia um POST HTTP do lado do cliente para o AEM Publish's .../saml_login
ponto final. Se o IDP e o AEM Publish existirem em uma origem diferente, o AEM Publish Filtro referenciador é configurado pela configuração OSGi para permitir POSTs HTTP a partir 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/
para /<project name>/
Verifique se a allow.empty
é 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 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 ambientes.
Durante o processo de autenticação do SAML, o IDP inicia um POST HTTP do lado do cliente para o AEM Publish's .../saml_login
ponto final. Se a publicação do IDP e do AEM existir em diferentes hosts/domínios, a publicação do AEM Compartilhamento de recursos de origem CR (CORS) deve ser configurado para permitir POSTs HTTP a partir do host/domínio do IDP.
Esta solicitação HTTP POST Origin
geralmente tem um valor diferente do host AEM Publish, exigindo a configuração do CORS.
Ao testar a autenticação SAML no SDK local do AEM (localhost:4503
), o IDP pode definir a variável Origin
cabeçalho para null
. Em caso afirmativo, adicione "null"
para 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/
para o nome do projeto~
no nome do arquivo deve identificar exclusivamente essa configuração, de modo que 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 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
varia entre ambientes.
Após a autenticação bem-sucedida no IDP, o IDP orquestrará um POST HTTP de volta para AEM registrado /saml_login
ponto final (configurado no IDP). Este POST HTTP para /saml_login
é 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 regravação 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 na Publicação AEM, o nó do usuário AEM é autenticável no nível de serviço de Publicação AEM.
Isso requer sincronização de dados e tokens encapsulados para ser habilitado pelo Suporte do Adobe no serviço de publicação do AEM.
Envie uma solicitação para o Suporte ao cliente do Adobe (via AdminConsole > Suporte) solicitando:
A sincronização de dados e os tokens encapsulados são ativados no serviço AEM Publish para o Programa X e o Ambiente Y.
As configurações do OSGi devem ser comprometidas com o Git e implantadas 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 Pilha cheia.