Como alterar o atributo principal de autenticação em seu IDP
Esse roteiro tem como finalidade ajudar nossos clientes em como alterar o atributo principal de autenticação em seu IDP.
Alteração do atributo no IDP
Em seu IDP, assim como em todo IDP, o mesmo possui um atributo chave que é usado como o atributo de autenticação principal. Em clientes que usam LDAP esse atributo é setado por padrão como sendo o "uid" e em clientes que usam o Microsoft AD esse atributo por padrão é setado como sendo o atributo "sAMAccountName".
Clientes nos perguntam se é possível alterar esse atributo principal de login na federação CAFe, e sim, é possível ! Abaixo eu descrevo os passos necessários para que façam esse ajusto em seus IDPs.
Será necessário apenas ajustar e alterar informações em um único arquivo do IDP, é o arquivo "ldap.properties". Sugiro que seja feito um backup do arquivo original antes de altera-lo.
sudo -i
cp -a /opt/shibboleth-idp/conf/ldap.properties /home/cafe/ldap.properties-original
Vamos ao procedimento de alteração, acesse o arquivo "ldap.properties" como root:
sudo -i
vim /opt/shibboleth-idp/conf/ldap.properties
Faremos o exemplo usando um arquivo "ldap.properties" usando a configuração padrão de um LDAP, com isso o atributo principal será o "uid". Se você estiver usando um Microsoft AD esse atributo será o "sAMAccountName" não se preocupe basta fazer o mesmo procedimento.
# LDAP authentication (and possibly attribute resolver) configuration
# Note, this doesn't apply to the use of JAAS authentication via LDAP
## Authenticator strategy, either anonSearchAuthenticator, bindSearchAuthenticator, directAuthenticator, adAuthenticator
idp.authn.LDAP.authenticator = bindSearchAuthenticator
## Connection properties ##
idp.authn.LDAP.ldapURL = ldaps://ldap.rnp.br:636
idp.authn.LDAP.useStartTLS = false
# Time in milliseconds that connects will block
idp.authn.LDAP.connectTimeout = PT3S
# Time in milliseconds to wait for responses
idp.authn.LDAP.responseTimeout = PT3S
# Connection strategy to use when multiple URLs are supplied, either ACTIVE_PASSIVE, ROUND_ROBIN, RANDOM
#idp.authn.LDAP.connectionStrategy = ACTIVE_PASSIVE
## SSL configuration, either jvmTrust, certificateTrust, or keyStoreTrust
idp.authn.LDAP.sslConfig = certificateTrust
## If using certificateTrust above, set to the trusted certificate's path
idp.authn.LDAP.trustCertificates = %{idp.home}/credentials/ldap-server.crt
## If using keyStoreTrust above, set to the truststore path
#idp.authn.LDAP.trustStore = %{idp.home}/credentials/ldap-server.truststore
## Return attributes during authentication
idp.authn.LDAP.returnAttributes = uid
## DN resolution properties ##
# Search DN resolution, used by anonSearchAuthenticator, bindSearchAuthenticator
# for AD: CN=Users,DC=example,DC=org
idp.authn.LDAP.baseDN = ou=RNP,dc=rnp,dc=local
idp.authn.LDAP.subtreeSearch = true
idp.authn.LDAP.userFilter = (uid={user})
# bind search configuration
# for AD: idp.authn.LDAP.bindDN=adminuser@domain.com
idp.authn.LDAP.bindDN = uid=app.shib.r,OU=APLICACOES,dc=rnp,dc=local
# Format DN resolution, used by directAuthenticator, adAuthenticator
# for AD use idp.authn.LDAP.dnFormat=%s@domain.com
idp.authn.LDAP.dnFormat = uid=%s,ou=RNP,dc=rnp,dc=local
# pool passivator, either none, bind or anonymousBind
#idp.authn.LDAP.bindPoolPassivator = none
# LDAP attribute configuration, see attribute-resolver.xml
# Note, this likely won't apply to the use of legacy V2 resolver configurations
idp.attribute.resolver.LDAP.ldapURL = %{idp.authn.LDAP.ldapURL}
idp.attribute.resolver.LDAP.connectTimeout = %{idp.authn.LDAP.connectTimeout:PT3S}
idp.attribute.resolver.LDAP.responseTimeout = %{idp.authn.LDAP.responseTimeout:PT3S}
idp.attribute.resolver.LDAP.connectionStrategy = %{idp.authn.LDAP.connectionStrategy:ACTIVE_PASSIVE}
idp.attribute.resolver.LDAP.baseDN = %{idp.authn.LDAP.baseDN:undefined}
idp.attribute.resolver.LDAP.bindDN = %{idp.authn.LDAP.bindDN:undefined}
idp.attribute.resolver.LDAP.useStartTLS = %{idp.authn.LDAP.useStartTLS:true}
idp.attribute.resolver.LDAP.trustCertificates = %{idp.authn.LDAP.trustCertificates:undefined}
idp.attribute.resolver.LDAP.searchFilter = (uid=$resolutionContext.principal)
# LDAP pool configuration, used for both authn and DN resolution
#idp.pool.LDAP.minSize = 3
#idp.pool.LDAP.maxSize = 10
#idp.pool.LDAP.validateOnCheckout = false
#idp.pool.LDAP.validatePeriodically = true
#idp.pool.LDAP.validatePeriod = PT5M
#idp.pool.LDAP.validateDN =
#idp.pool.LDAP.validateFilter = (objectClass=*)
#idp.pool.LDAP.prunePeriod = PT5M
#idp.pool.LDAP.idleTime = PT10M
#idp.pool.LDAP.blockWaitTime = PT3S
As alterações irão ocorrer em apenas 4 linhas, tenha atenção nesse ponto.
Serão as linhas 25, 33, 40 e 55 procure pelas variáveis nesse ordem que segue:
Essas variáveis são as responsáveis por determinar qual atributo será usado para login em seu IDP, sendo assim em nosso exemplo o nosso atributo de autenticação no IDP está sendo o "uid". Porém houve a necessidade de se alterar esse atributo e a escolha do novo atributo para login, em nosso exemplo, será o atributo "mail". Como ficaria então essa nova configuração, veja:
Repare aonde mudamos os valores para as variáveis, veja como a estrutura deve ficar ao final:
# LDAP authentication (and possibly attribute resolver) configuration
# Note, this doesn't apply to the use of JAAS authentication via LDAP
## Authenticator strategy, either anonSearchAuthenticator, bindSearchAuthenticator, directAuthenticator, adAuthenticator
idp.authn.LDAP.authenticator = bindSearchAuthenticator
## Connection properties ##
idp.authn.LDAP.ldapURL = ldaps://ldap.rnp.br:636
idp.authn.LDAP.useStartTLS = false
# Time in milliseconds that connects will block
idp.authn.LDAP.connectTimeout = PT3S
# Time in milliseconds to wait for responses
idp.authn.LDAP.responseTimeout = PT3S
# Connection strategy to use when multiple URLs are supplied, either ACTIVE_PASSIVE, ROUND_ROBIN, RANDOM
#idp.authn.LDAP.connectionStrategy = ACTIVE_PASSIVE
## SSL configuration, either jvmTrust, certificateTrust, or keyStoreTrust
idp.authn.LDAP.sslConfig = certificateTrust
## If using certificateTrust above, set to the trusted certificate's path
idp.authn.LDAP.trustCertificates = %{idp.home}/credentials/ldap-server.crt
## If using keyStoreTrust above, set to the truststore path
#idp.authn.LDAP.trustStore = %{idp.home}/credentials/ldap-server.truststore
## Return attributes during authentication
idp.authn.LDAP.returnAttributes = mail
## DN resolution properties ##
# Search DN resolution, used by anonSearchAuthenticator, bindSearchAuthenticator
# for AD: CN=Users,DC=example,DC=org
idp.authn.LDAP.baseDN = ou=RNP,dc=rnp,dc=local
idp.authn.LDAP.subtreeSearch = true
idp.authn.LDAP.userFilter = (mail={user})
# bind search configuration
# for AD: idp.authn.LDAP.bindDN=adminuser@domain.com
idp.authn.LDAP.bindDN = uid=app.shib.r,OU=APLICACOES,dc=rnp,dc=local
# Format DN resolution, used by directAuthenticator, adAuthenticator
# for AD use idp.authn.LDAP.dnFormat=%s@domain.com
idp.authn.LDAP.dnFormat = mail=%s,ou=RNP,dc=rnp,dc=local
# pool passivator, either none, bind or anonymousBind
#idp.authn.LDAP.bindPoolPassivator = none
# LDAP attribute configuration, see attribute-resolver.xml
# Note, this likely won't apply to the use of legacy V2 resolver configurations
idp.attribute.resolver.LDAP.ldapURL = %{idp.authn.LDAP.ldapURL}
idp.attribute.resolver.LDAP.connectTimeout = %{idp.authn.LDAP.connectTimeout:PT3S}
idp.attribute.resolver.LDAP.responseTimeout = %{idp.authn.LDAP.responseTimeout:PT3S}
idp.attribute.resolver.LDAP.connectionStrategy = %{idp.authn.LDAP.connectionStrategy:ACTIVE_PASSIVE}
idp.attribute.resolver.LDAP.baseDN = %{idp.authn.LDAP.baseDN:undefined}
idp.attribute.resolver.LDAP.bindDN = %{idp.authn.LDAP.bindDN:undefined}
idp.attribute.resolver.LDAP.useStartTLS = %{idp.authn.LDAP.useStartTLS:true}
idp.attribute.resolver.LDAP.trustCertificates = %{idp.authn.LDAP.trustCertificates:undefined}
idp.attribute.resolver.LDAP.searchFilter = (mail=$resolutionContext.principal)
# LDAP pool configuration, used for both authn and DN resolution
#idp.pool.LDAP.minSize = 3
#idp.pool.LDAP.maxSize = 10
#idp.pool.LDAP.validateOnCheckout = false
#idp.pool.LDAP.validatePeriodically = true
#idp.pool.LDAP.validatePeriod = PT5M
#idp.pool.LDAP.validateDN =
#idp.pool.LDAP.validateFilter = (objectClass=*)
#idp.pool.LDAP.prunePeriod = PT5M
#idp.pool.LDAP.idleTime = PT10M
#idp.pool.LDAP.blockWaitTime = PT3S
Alteração do texto de acesso
Excelente ! Se o seu arquivo ficou conforme o final do processo anterior indica que você alterou o seu atributo principal de login, agora os usuários usarão o e-mail para logar em seu IDP.
Mas é agora ? Na tela de login a mensagem que aparece para os usuários ainda é a de inserir o "uid" ?
Sim, verdade ! Será necessário também customizar a frase da tela de login, afinal mudamos o meio de login do IDP e isso pode confundir os usuários. Então vamos lá !
Na imagem abaixo eu mostro como estava a minha frase na minha tela de login, veja:
Veja que a minha frase era "Seu nome.sobrenome" porque como os usuários usavam o "uid" para se logar, e em minha base o nosso "uid" é nome.sobrenome do usuário, mas eu alterei para o atributo "mail" conforme procedimento acima, então temos que alterar essa frase.
Para alterar a frase da tela de login do IDP vamos precisar mexer no arquivo "messages_pt_BR.properties". Sugiro que seja feito um backup desse arquivo original antes de altera-lo.
sudo -i
cp -a /opt/shibboleth-idp/messages/messages_ptBR.properties /home/cafe/messages_ptBR.properties-original
Agora vamos alterar a mensagem de login da tela do IDP. Edite o arquivo messages_ptBR.properties
sudo -i
vim /opt/shibboleth-idp/messages/messages_ptBR.properties
Esse arquivo é muito grande não seria prático colocar todo ele aqui, então oriento você a procurar pela seguinte variável:
idp.login.username.label = Seu nome.sobrenome
Essa é a mensagem que irá aparecer para os usuários do IDP, então altere como achar melhor para indicar aos seus usuários o que eles devem usar para se autenticar, no nosso exemplo usamos o atributo "mail" referente ao email, então nossa alteração será assim:
idp.login.username.label = Seu email @rnp.br
Salve o arquivo e vamos agora refazer o "build" do IDP:
sudo -i
cd /opt/shibboleth-idp/bin
./build.sh
Buildfile: /opt/shibboleth-idp/bin/build.xml
build-war:
Installation Directory: [/opt/shibboleth-idp] ?
INFO [net.shibboleth.idp.installer.BuildWar:103] - Rebuilding /opt/shibboleth-idp/war/idp.war, Version 4.1.5
INFO [net.shibboleth.idp.installer.BuildWar:113] - Initial populate from /opt/shibboleth-idp/dist/webapp to /opt/shibboleth-idp/webpapp.tmp
INFO [net.shibboleth.idp.installer.BuildWar:92] - Overlay from /opt/shibboleth-idp/edit-webapp to /opt/shibboleth-idp/webpapp.tmp
INFO [net.shibboleth.idp.installer.BuildWar:125] - Creating war file /opt/shibboleth-idp/war/idp.war
BUILD SUCCESSFUL
Total time: 8 seconds
Repare que na etapa de número (7) o script está lhe fazendo uma pergunta, aonde é o diretório instalado do seu IDP, como o nosso template usa o padrão, basta pressionar a tecla <enter> que o script irá seguir com o restante. Feito isso acabamos, agora vamos reiniciar o serviço do Jetty9
sudo -i
systemctl restart jetty9.service
Veja como ficou agora a minha tela de login:
Pronto, você alterou o seu atributo de login prinicipal e alterou a frase da sua tela de login.