You are here: Foswiki>Wiki Web>AtualizacaoShibboleth3 (14 Jul 2016, italovalcy)EditAttach

Atualização do Shibboleth para versão 3.2.1

1 Objetivo

Este documento descreve os passos necessários para atualizar, manualmente, o Shibboleth (software usado para Provedor de Identidade da CAFe) para a versão 3.2.1, última versão estável homologada pela RNP.

A RNP disponibiliza uma máquina virtual para realizar o processo de atualização de forma mais simplificada, porém caso você deseje aplicar a atualização manualmente, mantendo o servidor no perfil de instalação e configuração da sua instituição, poderá seguir esse procedimento.

2 Definições

  • Shibboleth: software desenvolvido pela Internet2 (rede acadêmica dos Estados Unidos) que funciona como framework para implementar um Provedor de Identidade (IdP) através do protocolo SAML.
  • IdP: Ou Provedor de Identidade, é responsável por associar uma identidade a um usuário, após um processo de autenticação. O usuário então recebe uma credencial, chamada de identidade.

3 Pré-requisitos

  • Tomcat 7 ou superior
  • Java 7 ou superior (pode ser o Java OpenJDK)

4 Descrição das etapas

Baixar o tarball de instalação do código do Shibboleth na versão 3.2.1 com as customizações da RNP (metadados das federações, configuração de filtro e resolução de atributos etc.):

cd /root
wget https://wiki-sti.ufba.br/foswiki/pub/Wiki/AtualizacaoShibboleth3/shibboleth-identity-provider-3.2.1-rnp.tgz
tar -xzf shibboleth-identity-provider-3.2.1-rnp.tgz

Em seguida, será necessário configurar alguns parâmetros referentes ao seu IDP e ao LDAP/AD da sua instituição. Em particular, você precisará das seguintes informações:
  • LDAP_SERVIDOR, URL do servidor LDAP/AD, exemplo: ldap://localhost:389
  • LDAP_BASE, raiz da base LDAP/AD, exemplo: dc=foobar,dc=br
  • LDAP_USER, usuário que fará login (bind) na base LDAP/AD para buscar os usuários (busca não anônima), exemplo: cn=leitor-shib,ou=apps,dc=foobar,dc=br
  • LDAP_PASS, senha do usuário de bind do LDAP/AD, exemplo: XXXXXXXXX
  • LDAP_USERSDN, sub-árvore de usuários onde o shibboleth irá buscar, exemplo: ou=people,dc=foobar,dc=br
  • Caso esteja utilizando autenicação no AD, você precisará alterar os atributos de busca (uid para sAMAccountName) e formato do DN de usuário. Os comentários ajudam a entender as mudanças necessárias.

Abaixo vamos mostrar a criação do arquivo de parâmetros do LDAP considerando as variáveis acima e seus respectivos valores ilustrados:

cat >  /root/shibboleth-identity-provider-3.2.1-rnp/dist/conf/ldap.properties.dist <<-EOF
# LDAP authentication configuration, see authn/ldap-authn-config.xml
## Authenticator strategy, either anonSearchAuthenticator, bindSearchAuthenticator, directAuthenticator, adAuthenticator
#idp.authn.LDAP.authenticator                   = anonSearchAuthenticator
idp.authn.LDAP.authenticator                   = bindSearchAuthenticator
## Connection properties ##
idp.authn.LDAP.ldapURL                         = ldap://localhost:389
idp.authn.LDAP.useStartTLS                     = false
idp.authn.LDAP.useSSL                          = false
idp.authn.LDAP.connectTimeout                  = 30000
## 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
## NOTE: this is not used during attribute resolution; configure that directly in the
## attribute-resolver.xml configuration via a DataConnector's <dc:ReturnAttributes> element
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                           = dc=foobar,dc=br
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                           = cn=leitor-shib,ou=apps,dc=foobar,dc=br
idp.authn.LDAP.bindDNCredential                 = XXXXXXXX
# Format DN resolution, used by directAuthenticator, adAuthenticator
# for AD use idp.authn.LDAP.dnFormat=%s@domain.com
idp.authn.LDAP.dnFormat                         = uid=%s,ou=people,dc=foobar,dc=br
# LDAP attribute configuration, see attribute-resolver.xml
idp.attribute.resolver.LDAP.ldapURL             = %{idp.authn.LDAP.ldapURL}
idp.attribute.resolver.LDAP.baseDN              = %{idp.authn.LDAP.baseDN}
idp.attribute.resolver.LDAP.bindDN              = %{idp.authn.LDAP.bindDN}
idp.attribute.resolver.LDAP.bindDNCredential    = %{idp.authn.LDAP.bindDNCredential}
idp.attribute.resolver.LDAP.useStartTLS         = %{idp.authn.LDAP.useStartTLS:true}
idp.attribute.resolver.LDAP.trustCertificates   = %{idp.authn.LDAP.trustCertificates}
idp.attribute.resolver.LDAP.searchFilter        = (uid=\$requestContext.principalName)
# 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                   = 300
#idp.pool.LDAP.prunePeriod                      = 300
#idp.pool.LDAP.idleTime                         = 600
#idp.pool.LDAP.blockWaitTime                    = 3000
#idp.pool.LDAP.failFastInitialize               = false
EOF

Em seguida, será necessário configurar alguns parâmetros referentes ao seu IDP, a saber:
  • IDP_DOMINIO, domínio da instituição, exemplo: foobar.br
  • IDP_HOSTNAME, nome do servidor que será disponibilizado para acesso ao IDP, exemplo: idp-cafe.foobar.br

Abaixo vamos mostrar a criação do arquivo de parâmetros do IDP considerando as variáveis acima e seus respectivos valores ilustrados:

cat >  /root/shibboleth-identity-provider-3.2.1-rnp/dist/conf/idp.properties.dist <<-EOF
idp.additionalProperties= /conf/ldap.properties, /conf/saml-nameid.properties, /conf/services.properties
 
idp.entityID= https://idp-cafe.foobar.br/idp/shibboleth
 
idp.scope= foobar.br
 
idp.sealer.storeResource= %{idp.home}/credentials/sealer.jks
idp.sealer.versionResource= %{idp.home}/credentials/sealer.kver
idp.sealer.storePassword= changeit
idp.sealer.keyPassword= changeit
 
idp.signing.key= %{idp.home}/credentials/idp.key
idp.signing.cert= %{idp.home}/credentials/idp.crt
idp.encryption.key= %{idp.home}/credentials/idp.key
idp.encryption.cert= %{idp.home}/credentials/idp.crt
 
idp.authn.flows= Password
 
idp.status.accessPolicy= AccessByIPAddress
idp.resolvertest.accessPolicy= AccessByIPAddress
idp.reload.accessPolicy= AccessByIPAddress
 
idp.ui.fallbackLanguages= pt-br,en

idp.cafe.computedIDsalt = `openssl rand -base64 32`
EOF

Abaixo vamos mostrar a criação do arquivo de outros parâmetros do IDP. Aqui você precisará se atentar ao parâmetro sourceAttribute, pois ele será diferente se usar AD. Abaixo exemplo conforme valores ilustrativos anteriores:
cat > /root/shibboleth-identity-provider-3.2.1-rnp/dist/conf/saml-nameid.properties.dist <<-EOF
# Properties involving SAML NameIdentifier/NameID generation/consumption

# For the most part these settings only deal with "transient" and "persistent"
# identifiers. See saml-nameid.xml and c14n/subject-c14n.xml for advanced
# settings

# Comment out to disable legacy NameID generation via Attribute Resolver
#idp.nameid.saml2.legacyGenerator = shibboleth.LegacySAML2NameIDGenerator
#idp.nameid.saml1.legacyGenerator = shibboleth.LegacySAML1NameIdentifierGenerator

# Default NameID Formats to use when nothing else is called for.
# Don't change these just to change the Format used for a single SP!
#idp.nameid.saml2.default = urn:oasis:names:tc:SAML:2.0:nameid-format:transient
#idp.nameid.saml1.default = urn:mace:shibboleth:1.0:nameIdentifier

# Set to shibboleth.StoredTransientIdGenerator for server-side transient ID storage
#idp.transientId.generator = shibboleth.CryptoTransientIdGenerator

# Persistent IDs can be computed on the fly with a hash, or managed in a database

# For computed IDs, set a source attribute and a secret salt:
idp.persistentId.sourceAttribute = uid
#idp.persistentId.useUnfilteredAttributes = true
# Do *NOT* share the salt with other people, it's like divulging your private key.
#idp.persistentId.algorithm = SHA
idp.persistentId.salt = `openssl rand -base64 32`

# To use a database, use shibboleth.StoredPersistentIdGenerator
#idp.persistentId.generator = shibboleth.ComputedPersistentIdGenerator
# For basic use, set this to a JDBC DataSource bean name:
#idp.persistentId.dataSource = PersistentIdDataSource
# For advanced use, set to a bean inherited from shibboleth.JDBCPersistentIdStore
#idp.persistentId.store = MyPersistentIdStore
# Set to an empty property to skip hash-based generation of first stored ID
#idp.persistentId.computed = shibboleth.ComputedPersistentIdGenerator
EOF

O próximo passo é executar o script de instalação do shibboleth, conforme ilustrado abaixo. Atente-se, pois, ao executar esse script de instalação ele irá processar os parâmetros e em seguida ficará aguardando um ENTER para continuar a instalação. Observe, ainda, que a instalação será feita no diretório /opt/shibboleth-idp-3 para não entrar em conflito com a instalação existente do shibboleth.

# variavel de ambiente do java, altere segundo a sua instalacao (ex: oracle java, java8 etc)
export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64"

# Executa a instalacao
/root/shibboleth-identity-provider-3.2.1-rnp/bin/install.sh \
   -Didp.src.dir=/root/shibboleth-identity-provider-3.2.1-rnp \
   -Didp.target.dir=/opt/shibboleth-idp-3 \
   -Didp.sealer.password=changeit \
   -Didp.keystore.password=changeit \
   -Didp.conf.filemode=644 \
   -Didp.host.name=idp-cafe.foobar.br \
   -Didp.scope=ufba.br \
   -Didp.entityID=https://idp-cafe.foobar.br/idp/shibboleth

Agora precisaremos copiar os Certificados Digitais do IDP Shibboleth na versão anterior para a nova instalação (caso seja uma instalação nova, veja CertificadoIDPShib):
cd /opt/shibboleth-idp-3/credentials/
rm -f idp*
cp /opt/shibboleth-idp/credentials/{idp.crt,idp.key} ./

Ainda na pasta de certificados, vamos gerar o pacote de certificados para ser usado pelo TOMCAT, caso opte pelo proxy com SSL (não é obrigatório):

# forneca a senha: changeit (igual a /etc/tomcat7/server.xml)
openssl pkcs12 -export -in idp.crt -inkey idp.key -out idp.p12 -name idp -caname selfsigned

Metadados da CAFe / RNP

Junto com o pacote do shibboleth-idp-3.2.1-rnp foi disponibilizado também o arquivo de metadados da federação CAFe. Precisaremos fazer alguns ajustes nesse arquivo e copiá-lo para a pasta do shibboleth-3.

O primeiro passo é copiá-lo para a pasta do shibboleth-idp-3:
cp /root/idp-metadata.cafe.xml.dist /opt/shibboleth-idp-3/metadata/idp-metadata.xml

Em seguida, alterar alguns parâmetros específicos da sua instituição, a saber:
  • DOMINIO, domínio da instituição, exemplo: foobar.br
  • HOSTNAME, nome do servidor que será disponibilizado para acesso ao IDP, exemplo: idp-cafe.foobar.br
  • SIGLA, sigla da sua instituição, exemplo: FOOBAR
  • NOME, nome completo da sua instituição, exemplo: Foo Bar University
  • CONTATO, nome do contato técnico da sua instituição, exemplo: Setor de Tecnologia da Informacao
  • EMAIL, e-mail do contato técnico da sua instituição, exemplo: setorti@foobar.br

Abaixo vamos mostrar a criação do arquivo de parâmetros da instituição considerando as variáveis acima e seus respectivos valores ilustrados:

sed -i -e "s/SUBSTITUIR_URL/idp-cafe.foobar.br/g" -e "s/SUBSTITUIR_HOSTNAME/idp-cafe.foobar.br/g" \
   -e "s/SUBSTITUIR_DOMINIO_INSTITUICAO/foobar.br/g" -e "s/SUBSTITUIR_SIGLA/FOOBAR/g" \
   -e "s/SUBSTITUIR_INSTITUICAO/Foo Bar University/g" -e "s/SUBSTITUIR_NOME_CONTATO_TECNICO/Setor de Tecnologia da Informacao/g" \
   -e "s/SUBSTITUIR_EMAIL_CONTATO_TECNICO/setorti@foobar.br/g" \
      /opt/shibboleth-idp-3/metadata/idp-metadata.xml

Agora precisamos inserir o certificado digital do seu IDP no arquivo de metadados. Para isso, execute os seguintes passos:

sed -e '1d' -e '$d' /opt/shibboleth-idp-3/credentials/idp.crt > /tmp/idp.crt.tmp
      
awk '/SUBSTITUIR_CONTEUDO_DO_ARQUIVO_DO_CERTIFICADO/ { system ("cat /tmp/idp.crt.tmp") } \
   !/SUBSTITUIR_CONTEUDO_DO_ARQUIVO_DO_CERTIFICADO/{ print; }' /opt/shibboleth-idp-3/metadata/idp-metadata.xml > /opt/shibboleth-idp-3/metadata/idp-metadata.tmp
   
mv /opt/shibboleth-idp-3/metadata/idp-metadata.tmp /opt/shibboleth-idp-3/metadata/idp-metadata.xml

sed -i "s/\r//g" /opt/shibboleth-idp-3/metadata/idp-metadata.xml

Feito esse processo, será necessário corrigir a configuração do attribute-resolver para aumentar a quantidade de entradas retornadas na busca, permitindo usuários que possuem múltiplos vínculos a terem todos os seus vínculos mapeados, e aumentando o tempo máximo da busca, a fim de evitar que sobrecargas no servidor LDAP retornem erro no IDP. Para isso, edite o arquivo /opt/shibboleth-idp-3/conf/attribute-resolver.xml e adicione o seguinte:

diff --git a/attribute-resolver.xml b/attribute-resolver.xml
index 02ffef5..932f190 100644
--- a/attribute-resolver.xml
+++ b/attribute-resolver.xml
@@ -132,6 +132,7 @@ rev 5 - Sanitização do arquivo e adequação ao Shibboleth 3
        <!-- ========================================== -->
  
        <resolver:DataConnector id="myLDAP" xsi:type="dc:LDAPDirectory"
+               searchTimeLimit="30000"
                ldapURL="%{idp.attribute.resolver.LDAP.ldapURL}"
                baseDN="%{idp.attribute.resolver.LDAP.baseDN}"
                principal="%{idp.attribute.resolver.LDAP.bindDN}"
@@ -146,6 +147,8 @@ rev 5 - Sanitização do arquivo e adequação ao Shibboleth 3
        </resolver:DataConnector>
  
        <resolver:DataConnector id="ldapBrEduPerson" xsi:type="dc:LDAPDirectory"
+               searchTimeLimit="30000"
+               maxResultSize="0"
                ldapURL="%{idp.attribute.resolver.LDAP.ldapURL}"
                baseDN="%{idp.attribute.resolver.LDAP.baseDN}"
                principal="%{idp.attribute.resolver.LDAP.bindDN}"

Configuração Shibboleth / Tomcat

É preciso corrigir as permissões do Shibboleth para o usuário e grupo do tomcat:

USER=$(grep tomcat /etc/passwd | cut -d: -f1)
GROUP=$(grep tomcat /etc/group | cut -d: -f1)
chown -R $USER:$GROUP /opt/shibboleth-idp-3/{credentials,logs,metadata}

Editar o arquivo de deploy do IDP no tomcat (/etc/tomcat7/Catalina/localhost/idp.xml), para deixá-lo da seguinte forma: <Context docBase="/opt/shibboleth-idp-3/war/idp.war" unpackWAR="false" swallowOutput="true">

Editar a configuração do tomcat e alterar o Connector da porta 8009 para aceitar conexões para as webapps (IDP) invés de redirecionar para a porta com SSL (8443). Para isso, edite o arquivo /etc/tomcat7/server.xml para comentar a conexão anterior ao Shibboleth, retirar o redirecionamento e habilitar a nova conexão via protocolo AJP, conforme abaixo:

diff --git a/tomcat7/server.xml b/tomcat7/server.xml
index 33165a6..c54dced 100644
--- a/tomcat7/server.xml
+++ b/tomcat7/server.xml
@@ -92,6 +92,8 @@
     -->
 
     <!-- Define an AJP 1.3 Connector on port 8009 -->
+    <Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" />
+    <!--
     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     <Connector port="8443"
                maxHttpHeaderSize="8192"
@@ -107,6 +109,7 @@
                truststoreFile="/opt/shibboleth-idp/credentials/idp.p12"
                truststorePass="changeit"
                truststoreAlgorithm="DelegateToApplication"/>
+    -->
 
 
     <!-- An Engine represents the entry point (within Catalina) that processes

É preciso alterar a configuração do apache, para redirecionar o IDP ao local correto. Editar o arquivo /etc/apache2/sites-available/idp-SSO.conf e alterar:

diff --git a/apache2/sites-available/idp-SSO.conf b/apache2/sites-available/idp-SSO.conf
index 1c8422a..58ee715 100644
--- a/apache2/sites-available/idp-SSO.conf
+++ b/apache2/sites-available/idp-SSO.conf
@@ -25,7 +25,11 @@
        allow from 200.130.35.0/24
    </Location>
 
-   JkMount /idp/* ajp13_worker
+   #JkMount /idp/* ajp13_worker
+   ProxyPass /idp ajp://localhost:8009/idp retry=5
+   <Proxy ajp://localhost:8009>
+      Require all granted
+   </Proxy>
  
    CustomLog /var/log/apache2/access-idp-443.log combined
    LogLevel warn

É necessário habilitar o módulo do proxy AJP, conforme abaixo:

a2enmod proxy_ajp

Configurações específicas do Java 7

Se tiver usando Java 7, será necessário fazer um ajuste na configuração do attribute-resolver.xml, conforme mostrado no patch abaixo:

diff -Naur /root/shibboleth-identity-provider-3.2.1-rnp/dist/conf/attribute-resolver.xml.dist /opt/shibboleth-idp-3/conf/attribute-resolver.xml  
--- /root/shibboleth-identity-provider-3.2.1-rnp/dist/conf/attribute-resolver.xml.dist   2016-06-22 10:06:45.000000000 -0300
+++ /opt/shibboleth-idp-3/conf/attribute-resolver.xml   2016-06-28 19:36:04.694182365 -0300
@@ -41,7 +41,9 @@
       <resolver:Dependency ref="myLDAP" />
       <Script><![CDATA[
             uidMD5.getValues().clear();
-            logger = Java.type("org.slf4j.LoggerFactory").getLogger("net.shibboleth.idp.attribute");
+            //logger = Java.type("org.slf4j.LoggerFactory").getLogger("net.shibboleth.idp.attribute");
+            importPackage(Packages.org.slf4j);
+            logger = LoggerFactory.getLogger("net.shibboleth.idp.attribute");
             if (typeof %{idp.authn.LDAP.returnAttributes} != "undefined" && %{idp.authn.LDAP.returnAttributes} != null ){
                localpart = org.apache.commons.codec.digest.DigestUtils.md5Hex(%{idp.authn.LDAP.returnAttributes}.getValues().get(0)); 
                uidMD5.getValues().add(localpart);

Foi necessário, ainda, incluir o seguinte na configuração do idp.properties (/opt/shibboleth-idp-3/conf/idp.properties):

idp.xml.securityManager= org.apache.xerces.util.SecurityManager

A mudança acima se fez necessária devido ao seguinte erro:

tail /opt/shibboleth-idp/logs/idp-process.log
...
2016-06-28 18:59:29,599 - ERROR [org.springframework.web.context.ContextLoader:353] - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shibboleth.ParserPool' defined in file [/opt/shibboleth-idp/system/conf/global-system.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: com.sun.org.apache.xerces.internal.util.SecurityManager cannot be cast to org.apache.xerces.util.SecurityManager
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
Caused by: java.lang.IllegalArgumentException: com.sun.org.apache.xerces.internal.util.SecurityManager cannot be cast to org.apache.xerces.util.SecurityManager
   at org.apache.xerces.jaxp.DocumentBuilderFactoryImpl.setAttribute(Unknown Source)

Referências do erro:

Por fim, precisaremos remover algumas bibliotecas que foram inseridas anteriormente:

rm -rf /usr/share/tomcat7/endorsed/

Iniciar o serviço IDP com o Shibboleth 3.x

Altere o diretório do shibboleth, renomeando o antigo para shibboleth-2 e criando um link simbólico para o novo:

cd /opt
mv shibboleth-idp shibboleth-idp-2
ln -s /opt/shibboleth-idp-3 shibboleth-idp

Reiniciar os serviços:
/etc/init.d/tomcat7 restart
/etc/init.d/apache2 restart

Após a inicialização dos serviços, acompanhe os logs para verificar o processo de inicialização do tomcat e do shibboleth a fim de identificar possíveis erros (demora cerca de 5min para finalizar a inicialização):

tail -n 1000 -f /opt/shibboleth-idp/logs/idp-process.log /var/log/tomcat7/catalina.out

OBS: é preciso visualizar no log do catalina.out a mensagem: "INFORMAÇÕES: Server startup in XXXX ms"

Integração com a Edugain

Caso você possua integração com a federação Edugain, será necessário corrigir algumas configurações para mantê-la funcional.

O primeiro passo é editar o arquivo /opt/shibboleth-idp/conf/metadata-providers.xml e acrescentar os metadados da Edugain, conforme mostrado abaixo:

diff --git a/metadata-providers.xml b/metadata-providers.xml
index 1c78c35..c57e14f 100644
--- a/metadata-providers.xml
+++ b/metadata-providers.xml
@@ -28,4 +28,22 @@
         metadataURL="https://ds.cafe.rnp.br/metadata/cafe-metadata.xml"
         backingFile="%{idp.home}/metadata/cafe-metadata.xml">
     </MetadataProvider>
+    <MetadataProvider
+        xmlns="urn:mace:shibboleth:2.0:metadata"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd"
+        xsi:type="FileBackedHTTPMetadataProvider"
+        id="edugain"
+        metadataURL="https://ds.cafe.rnp.br/metadata/edugain/edugain-mds/metadata.edugain+sp.xml"
+        backingFile="%{idp.home}/metadata/edugain+sp-metadata.xml">
+    </MetadataProvider>
+    <MetadataProvider
+        xmlns="urn:mace:shibboleth:2.0:metadata"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd"
+        xsi:type="FileBackedHTTPMetadataProvider"
+        id="edugain-mds"
+        metadataURL="http://mds.edugain.org/"
+        backingFile="%{idp.home}/metadata/edugain-mds-metadata.xml">
+    </MetadataProvider>
 </MetadataProvider>

Alterar no attribute-filter, acrescentando alguns outros atributos que precisam ser liberados para a Edugain, conforme Edugain Recommended attributes. Para isso, edite o arquivo /opt/shibboleth-idp/conf/attribute-filter.xml e acrescente o seguinte:

diff --git a/attribute-filter.xml b/attribute-filter.xml
index 4b9b4f2..77e84c7 100644
--- a/attribute-filter.xml
+++ b/attribute-filter.xml
@@ -97,6 +97,34 @@
                        <PermitValueRule xsi:type="ANY" />
                </AttributeRule>
 
+               <AttributeRule attributeID="displayName">
+                       <PermitValueRule xsi:type="ANY" />
+               </AttributeRule>
+
+               <AttributeRule attributeID="commonName">
+                       <PermitValueRule xsi:type="ANY" />
+               </AttributeRule>
+
+               <AttributeRule attributeID="eduPersonAffiliation">
+                       <PermitValueRule xsi:type="ANY" />
+               </AttributeRule>
+
+               <AttributeRule attributeID="schacHomeOrganization">
+                       <PermitValueRule xsi:type="ANY" />
+               </AttributeRule>
+
+               <AttributeRule attributeID="schacHomeOrganizationType">
+                       <PermitValueRule xsi:type="ANY" />
+               </AttributeRule>
+
+               <AttributeRule attributeID="eduPersonScopedAffiliation">
+                       <PermitValueRule xsi:type="ANY" />
+               </AttributeRule>
+
+               <AttributeRule attributeID="eduPersonUniqueId">
+                       <PermitValueRule xsi:type="ANY" />
+               </AttributeRule>
+
        </AttributeFilterPolicy>
 
 </AttributeFilterPolicyGroup>

Alterar no attribute-resolver, definindo a forma como esses atributos serão preenchidos. Para isso, edite o arquivo /opt/shibboleth-idp/conf/attribute-resolver.xml e acrescente o seguinte:

diff --git a/attribute-resolver.xml b/attribute-resolver.xml
index 02ffef5..2f61542 100644
--- a/attribute-resolver.xml
+++ b/attribute-resolver.xml
@@ -126,12 +126,57 @@ rev 5 - Sanitização do arquivo e adequação ao Shibboleth 3
                <resolver:AttributeEncoder xsi:type="enc:SAML1String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" />
                <resolver:AttributeEncoder xsi:type="enc:SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" friendlyName="eduPersonEntitlement" />
        </resolver:AttributeDefinition>
+
+       <!-- Edugain - displayName -->
+       <resolver:AttributeDefinition id="displayName" xsi:type="ad:Simple" sourceAttributeID="cn">
+               <resolver:Dependency ref="myLDAP" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML1String" name="urn:mace:dir:attribute-def:displayName" encodeType="false" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML2String" name="urn:oid:2.16.840.1.113730.3.1.241" friendlyName="displayName" encodeType="false" />
+       </resolver:AttributeDefinition>
+
+       <!-- Edugain - schacHomeOrganization -->
+       <resolver:AttributeDefinition id="schacHomeOrganization" xsi:type="ad:Simple" sourceAttributeID="schacHomeOrganization">
+               <resolver:Dependency ref="myStatic" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML1String" name="urn:mace:dir:attribute-def:schacHomeOrganization" encodeType="false" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.9" friendlyName="schacHomeOrganization" encodeType="false" />
+       </resolver:AttributeDefinition>
+
+       <!-- Edugain - schacHomeOrganizationType -->
+       <resolver:AttributeDefinition id="schacHomeOrganizationType" xsi:type="ad:Simple" sourceAttributeID="schacHomeOrganizationType">
+               <resolver:Dependency ref="myStatic" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML1String" name="urn:mace:dir:attribute-def:schacHomeOrganizationType" encodeType="false" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML2String" name="urn:oid:1.3.6.1.4.1.25178.1.2.10" friendlyName="schacHomeOrganizationType" encodeType="false" />
+       </resolver:AttributeDefinition>
+
+       <!-- Edugain - eduPersonScopedAffiliation -->
+       <resolver:AttributeDefinition id="eduPersonScopedAffiliation" xsi:type="ad:Scoped" scope="%{idp.scope}" sourceAttributeID="brEduAffiliationType">
+               <resolver:Dependency ref="ldapBrEduPerson" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML1ScopedString" name="urn:mace:dir:attribute-def:eduPersonScopedAffiliation" encodeType="false" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML2ScopedString" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.9" friendlyName="eduPersonScopedAffiliation" encodeType="false" />
+       </resolver:AttributeDefinition>
+
+       <!-- Edugain - eduPersonUniqueId -->
+       <resolver:AttributeDefinition id="eduPersonUniqueId" xsi:type="ad:Scoped" scope="%{idp.scope}" sourceAttributeID="uidMD5">
+               <resolver:Dependency ref="uidMD5" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML1ScopedString" name="urn:mace:dir:attribute-def:eduPersonUniqueId" encodeType="false" />
+               <resolver:AttributeEncoder xsi:type="enc:SAML2ScopedString" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.13" friendlyName="eduPersonUniqueId" encodeType="false" />
+       </resolver:AttributeDefinition>
  
        <!-- ========================================== -->
        <!-- DEFINICAO DE DATACONNECTORS                -->
        <!-- ========================================== -->
+
+       <resolver:DataConnector id="myStatic" xsi:type="dc:Static">
+               <dc:Attribute id="schacHomeOrganization">
+                       <dc:Value>%{idp.scope}</dc:Value>
+               </dc:Attribute>
+               <dc:Attribute id="schacHomeOrganizationType">
+                       <dc:Value>urn:schac:homeOrganizationType:int:university</dc:Value>
+               </dc:Attribute>
+       </resolver:DataConnector>

Reiniciar o tomcat:

/etc/init.d/tomcat7 restart

Acompanhar nos logs:

tail -n 1000 -f /opt/shibboleth-idp/logs/idp-process.log /var/log/tomcat7/catalina.out

Para testar se o acesso ao Edugain está funcionando corretamente, acesse https://attribute-viewer.aai.switch.ch/interfederation-test/ e execute o processo de autenticação. Caso os atributos estejam resolvendo corretamente no seu IDP, você deveria visualizar as seguintes telas de sucesso:

attr-table.png

test-verdict.png

Customização da página de Login

Na versão 3 do shibboleth o mecanismo padrão para renderização das páginas de login, erro e consentimento mudou de JSP para templates Velocity, eliminando a necessidade de reiniciar o Container Servlet (tomcat) a cada modificação. Em particular, com os templates no formato Velocity, basta modificar os arquivos .vm no diretório /opt/shibboleth-idp/views que imediatamente as mudanças serão refletidas no IDP.

No caso da UFBA, modificamos os templates para deixá-los com a identidade visual da Universidade, de acordo com os passos adotados pela federação SWITCHaai. Para aplicar os templates da UFBA, execute os seguintes passos:

cd /root
wget https://wiki-sti.ufba.br/foswiki/pub/Wiki/AtualizacaoShibboleth3/custom-login-page-v3.tgz
tar -xzf custom-login-page-v3.tgz -C /opt/shibboleth-idp-3/

O tarball acima inclui os seguintes arquivos, customizados para o ambiente da UFBA:
  • Três arquivos de template Velocity (substituindo os arquivos padrões em /opt/shibboleth-idp-3/views): login.vm, login-error.vm e error.vm. Mudanças nesses arquivos não necessitam de reinicialização do Tomcat.
  • Um outro arquivo de template velocity do Termo de uso, substituindo o arquivo /opt/shibboleth-idp-3/views/intercept/terms-of-use.vm
  • Arquivos de CSS no diretório /opt/shibboleth-idp-3/edit-webapp/css: bootstrap.min.css e style.css, foi preferido criar esses arquivos novos invés de utilizar os antigos main.css e content.css
  • Arquivos de imagens no diretório /opt/shibboleth-idp-3/edit-webapp/images, com logo da UFBA, favicon, fontes etc.
  • Uma página alternativa para o index.jsp padrão do IDP, para o caso de alguém tentando acessar a página raiz do IDP (ex: https://cafe.ufba.br/idp/), o que não deve ocorrer em circunstâncias normais, e que retorna a mensagem padrão "Nenhum serviço disponível aqui"

Após essas alterações, é necessário reconstruir o WAR do IDP, pois fizemos alterações no diretório edit-wabapp. Para isso, execute os passos abaixo:

JAVACMD=/usr/bin/java /opt/shibboleth-idp-3/bin/build.sh -Didp.target.dir=/opt/shibboleth-idp-3

Página de Consentimento e Termo de Uso

Para alterar a página de consentimento e termo de uso, será necessário editar alguns arquivos e modificar algumas propriedades do Shibboleth. Em particular, no caso da UFBA, decidimos por omitir a página de consentimento do usuário e por ativar a página do termo de uso, que já versa sobre os atributos disponibilizados aos Provedores de Serviço. Dessa forma, os passos abaixo mostrarão como desativar a página de consentimento e ativar a página de termo de uso, utilizando como base a documentação Federação SWITCHaai.

O primeiro passo é alterar o relying-party para remover a obrigatoriedade do consentimento e adicionar do termo de uso. Para isso, edite o arquivo /opt/shibboleth-idp-3/conf/relying-party.xml e altere as seguintes definições:

-<bean parent="Shibboleth.SSO" p:postAuthenticationFlows="attribute-release" />
+<bean parent="Shibboleth.SSO" p:postAuthenticationFlows="#{ {'terms-of-use'} }" />
...
-<bean parent="SAML2.SSO" p:postAuthenticationFlows="attribute-release" />
+<bean parent="SAML2.SSO" p:postAuthenticationFlows="#{ {'terms-of-use'} }" />
...
-<bean parent="Shibboleth.SSO" p:postAuthenticationFlows="attribute-release" p:includeAttributeStatement="true"/>
+<bean parent="Shibboleth.SSO" p:postAuthenticationFlows="#{ {'terms-of-use'} }" p:includeAttributeStatement="true"/>

Em seguida, no arquivo /opt/shibboleth-idp/conf/intercept/consent-intercept-config.xml desativar o alias para shibboleth.consent.terms-of-use.Key, comentando-o:

<!--
<alias alias="shibboleth.consent.terms-of-use.Key" name="shibboleth.RelyingPartyIdLookup.Simple" />
-->

Ainda naquele mesmo arquivo, insira logo abaixo do comentário anterior uma nova definição do alias e do bean para o termo de uso:

<!--
This activates a single Terms of Use text to be presented once before the user
sees the first time the attribute release consent dialog.
-->

<alias alias="shibboleth.consent.terms-of-use.Key" name="shibboleth.SingleTermsOfUseText" />

<bean id="shibboleth.SingleTermsOfUseText"
        class="com.google.common.base.Functions" factory-method="constant">
    <constructor-arg value="my-terms-of-use" />
</bean>

Em seguida, no arquivo /opt/shibboleth-idp-3/messages/consent-messages.properties vamos definir a chave my-terms-of-use usada anteriormente. Para isso, comente as seguintes propriedades:
#https\://sp.example.org = example-tou-1
#example-tou-1.title = Example Terms of Use
#example-tou-1.text  = <b> <i>_ This is an example ToU - tailor due to your needs _</i> </b> \
#                      ...
#                

E adicione as seguintes propriedades do nosso Termo de Uso (atente-se para alterar para a URL do termo de uso da sua instituição):

my-terms-of-use = my-tou
my-tou.title = Termo de uso do serviço CAFe IDP FOOBAR
my-tou.text = <p>Termo de uso do serviço CAFe Provedor de Identidade FOOBAR</p> \
              <p>Veja o documento completo \
              <a href="https://idp-cafe.foobar.br/TermoUso" target="_blank">aqui</a>. \
              </p>

Ainda nesse arquivo, altere as seguintes propriedades:

idp.terms-of-use.accept     = Eu li os termos de uso
idp.terms-of-use.submit     = Aceitar
idp.terms-of-use.reject     = Rejeitar
idp.terms-of-use.required   = Por favor marque essa opção se deseja continuar.

Por fim, o arquivo /opt/shibboleth-idp-3/views/intercept/terms-of-use.vm possui o template Velocity que é exibido na tela do termo de uso, porém seu conteúdo já foi alterado na customização anterior.

Agora é necessário fazer um reload do Tomcat e testar seu funcionamento:

/etc/init.d/tomcat7 restart
tail -n 300 -f /var/log/tomcat7/catalina.out /opt/shibboleth-idp/logs/idp-process.log

Para testar se o termo de uso foi configurado com sucesso, acesse a página de teste da CAFe/RNP (https://sp.rnp.br/cafe) e verifique que após fazer o login, você precisa aceitar o termo de uso. No lado do servidor, aceitar o termo de uso gera a seguinte mensagem:

prompt# grep Shibboleth-Consent-Audit.SSO /opt/shibboleth-idp-3/logs/idp-process.log
2016-07-07 14:10:31,774 - INFO [Shibboleth-Consent-Audit.SSO:241] - 20160707T171031Z|https://sp.rnp.br/cafe|TermsAccepted|fulano.tal@foobar.br|my-tou||true
2016-07-07 14:11:23,826 - INFO [Shibboleth-Consent-Audit.SSO:241] - 20160707T171123Z|https://sp.rnp.br/cafe|TermsRejected|fulano.tal@foobar.br|my-tou||false

5 Plano de Testes

  • Realizar acesso ao portal de testes da RNP https://sp.rnp.br/cafe
  • Escolher o provedor de identidade FOOBAR
  • Fornecer suas credenciais da sua organização e aceitar o termo de uso
  • Verificar se o retorno ao portal de teste da RNP inclui as informações do seu perfil na sua organização. Por exemplo:
saida-sp-rnp.png

6 Plano de Retorno

Corrigir o link simbólico do shibboleth:

cd /opt
unlink shibboleth-idp
ln -s /opt/shibboleth-idp-2 shibboleth-idp

Corrigir o xml de deploy do IDP, alterando o arquivo /opt/shibboleth-idp/war/idp.war

<Context docBase="/opt/shibboleth-idp/war/idp.war"
         privileged="true"
         antiResourceLocking="false"
         antiJARLocking="false"
         unpackWAR="false"
         swallowOutput="true" />

Corrigir as configurações das portas do Tomcat para voltar ao padrão anterior:

index c54dced..33165a6 100644
--- a/tomcat7/server.xml
+++ b/tomcat7/server.xml
@@ -92,8 +92,6 @@
     -->
 
     <!-- Define an AJP 1.3 Connector on port 8009 -->
-    <Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" />
-    <!--
     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     <Connector port="8443"
                maxHttpHeaderSize="8192"
@@ -109,7 +107,6 @@
                truststoreFile="/opt/shibboleth-idp/credentials/idp.p12"
                truststorePass="changeit"
                truststoreAlgorithm="DelegateToApplication"/>
-    -->
 
 
     <!-- An Engine represents the entry point (within Catalina) that processes

Alterar a configuração do apache:

diff --git a/apache2/sites-available/idp-SSO.conf b/apache2/sites-available/idp-SSO.conf
index 58ee715..1c8422a 100644
--- a/apache2/sites-available/idp-SSO.conf
+++ b/apache2/sites-available/idp-SSO.conf
@@ -25,11 +25,7 @@
        allow from 200.130.35.0/24
    </Location>
 
-   #JkMount /idp/* ajp13_worker
-   ProxyPass /idp ajp://localhost:8009/idp retry=5
-   <Proxy ajp://localhost:8009>
-      Require all granted
-   </Proxy>
+   JkMount /idp/* ajp13_worker
  
    CustomLog /var/log/apache2/access-idp-443.log combined
    LogLevel warn

7 Referências

-- ItaloValcy - 14 Jul 2016
Topic attachments
I Attachment Action Size Date Who Comment
attr-table.pngpng attr-table.png manage 42.2 K 14 Jul 2016 - 01:59 UnknownUser  
custom-login-page-v3.tgztgz custom-login-page-v3.tgz manage 166.8 K 14 Jul 2016 - 12:17 UnknownUser  
saida-sp-rnp.pngpng saida-sp-rnp.png manage 52.4 K 14 Jul 2016 - 02:00 UnknownUser  
shibboleth-identity-provider-3.2.1-rnp.tgztgz shibboleth-identity-provider-3.2.1-rnp.tgz manage 38545.4 K 14 Jul 2016 - 12:17 UnknownUser  
test-verdict.pngpng test-verdict.png manage 86.0 K 14 Jul 2016 - 01:59 UnknownUser  
Topic revision: r3 - 14 Jul 2016, italovalcy
 
  • <span class=
No permission to view System.WebBottomBarExample