Configuration des attributs utilisateurs
1. Configuration de attribute-resolver.xml
Documentation : Attribute Resolver Configuration, consortium Shibboleth
attribute-resolver.xml
de la version 2 est utilisable avec la version 3 de l'IdP Shibboleth. Les fonctionnalités non supportées sont documentées (Deprecated features).
Ce fichier définit la façon dont chaque attribut utilisateur est extrait des référentiels locaux pour ensuite être diffusé par l'IdP Shibboleth. Vous devez définir des sources de données (DataConnector) puis des attributs (AttributeDefinition) qui y font référence.
Nous allons adapter la configuration distribuée par défaut pour interroger un annuaire LDAP de test. Par la suite, vous pouvez personnaliser ce fichier pour interroger l'annuaire LDAP de votre établissement.
ldap.properties
.
Le fichier de configuration attribute-resolver-ldap.xml
installé par défaut sera notre base de départ ; il prévoit l'extraction des attributs mail
, uid
et eduPersonPrincipalName
d'un annuaire LDAP. Nous allons éditer ce fichier pour changer la définition de l'attribut eduPersonPrincipalName
:
- /opt/shibboleth-idp/conf/attribute-resolver-ldap.xml
[...] <!-- ========================================== --> <!-- Attribute Definitions --> <!-- ========================================== --> <!-- The EPPN is the "standard" federated username in higher ed. For guidelines on the implementation of this attribute, refer to the Shibboleth and eduPerson documentation. Above all, do not expose a value for this attribute without considering the long term implications. --> ** <AttributeDefinition id="eduPersonPrincipalName" xsi:type="Scoped" scope="%{idp.scope}">** ** <InputDataConnector ref="myLDAP" attributeNames="uid" />** ** <DisplayName xml:lang="fr">Identifiant EPPN</DisplayName>** ** <DisplayDescription xml:lang="fr"> Identifiant globalement unique pour une personne. </DisplayDescription>** ** <AttributeEncoder xsi:type="SAML1ScopedString" name="urn:mace:dir:attribute-def:eduPersonPrincipalName" encodeType="false" />** ** <AttributeEncoder xsi:type="SAML2ScopedString" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" friendlyName="eduPersonPrincipalName" encodeType="false" />** ** </AttributeDefinition>** <!-- The uid is the closest thing to a "standard" LDAP attribute representing a local username, but you should generally *never* expose uid to federated services, as it is rarely globally unique. --> <AttributeDefinition id="uid" xsi:type="Simple" > <InputDataConnector ref="myLDAP" attributeNames="uid"/> <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:uid" encodeType="false" /> <AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.1" friendlyName="uid" encodeType="false" /> </AttributeDefinition> <!-- In the rest of the world, the email address is the standard identifier, despite the problems with that practice. Consider making the EPPN value the same as your official email addresses whenever possible. --> <AttributeDefinition id="mail" xsi:type="Simple" > <InputDataConnector ref="myLDAP" attributeNames="mail"/> <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:mail" encodeType="false" /> <AttributeEncoder xsi:type="SAML2String" name="urn:oid:0.9.2342.19200300.100.1.3" friendlyName="mail" encodeType="false" /> </AttributeDefinition> <!-- ========================================== --> <!-- Data Connectors --> <!-- ========================================== --> <!-- Example LDAP Connector The connectivity details can be specified in ldap.properties to share them with your authentication settings if desired. --> <DataConnector id="myLDAP" xsi:type="LDAPDirectory" ldapURL="%{idp.attribute.resolver.LDAP.ldapURL}" baseDN="%{idp.attribute.resolver.LDAP.baseDN}" principal="%{idp.attribute.resolver.LDAP.bindDN}" principalCredential="%{idp.attribute.resolver.LDAP.bindDNCredential}" useStartTLS="%{idp.attribute.resolver.LDAP.useStartTLS:true}" connectTimeout="%{idp.attribute.resolver.LDAP.connectTimeout}" **supprimez: trustFile="%{idp.attribute.resolver.LDAP.trustCertificates}"** responseTimeout="%{idp.attribute.resolver.LDAP.responseTimeout}"> <FilterTemplate> <![CDATA[ %{idp.attribute.resolver.LDAP.searchFilter} ]]> </FilterTemplate> <ConnectionPool minPoolSize="%{idp.pool.LDAP.minSize:3}" maxPoolSize="%{idp.pool.LDAP.maxSize:10}" blockWaitTime="%{idp.pool.LDAP.blockWaitTime:PT3S}" validatePeriodically="%{idp.pool.LDAP.validatePeriodically:true}" validateTimerPeriod="%{idp.pool.LDAP.validatePeriod:PT5M}" expirationTime="%{idp.pool.LDAP.idleTime:PT10M}" failFastInitialize="%{idp.pool.LDAP.failFastInitialize:false}" /> </DataConnector> </AttributeResolver>
Vous devez modifier la configuration de Shibboleth afin qu'il utilise attribute-resolver-ldap.xml
:
- /opt/shibboleth-idp/conf/services.xml
<util:list id ="shibboleth.AttributeResolverResources"> <value>**%{idp.home}/conf/attribute-resolver-ldap.xml**</value> </util:list>
Vous pouvez forcer le rechargement du nouveau fichier attribute-resolver-ldap.xml :
$> /opt/shibboleth-idp/bin/reload-service.sh -id=shibboleth.AttributeResolverService
Par défaut le fichier ldap.properties
est prévu pour réutiliser les paramètrages LDAP utilisés à l'étape authentification pour la phase de résolution d'attributs. Nous n'avons donc aucune modification à apporter dans le cas présent puisque nous utilisons le même serveur LDAP pour l'authentification et la résolution d'attributs utilisateurs :
- /opt/shibboleth-idp/conf/ldap.properties
[...] # 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.baseDN = %{idp.authn.LDAP.baseDN:undefined} idp.attribute.resolver.LDAP.bindDN = %{idp.authn.LDAP.bindDN:undefined} idp.attribute.resolver.LDAP.bindDNCredential = %{idp.authn.LDAP.bindDNCredential: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) [...]
idp.attribute.resolver.LDAP.searchFilter
ci-dessus) fait référence à l'identifiant de l'utilisateur via la variable $resolutionContext.principal
dont le contenu sera l'identifiant de connexion de l'utilisateur saisi lors de la phase d'authentification.
SAML1String
et SAML2String
) dans l'exemple ci-dessus. Ce mode de fonctionnement permet de rester compatible avec les SP Shibboleth 1.3 qui s'attendent à recevoir des attributs au format URN, alors que Shibboleth 2.x utilise le format OID, comme recommandé par la norme SAML2.
attribute-resolver-ldap.xml
plus complet est distribué par RENATER. Il est disponible dans les derniers chapitres de ce TP
2. Configuration du fichier attribute-filter.xml
Documentation : Attribute Filter Configuration, consortium Shibboleth
Un fournisseur d'identités Shibboleth est finement configurable pour filtrer les attributs utilisateurs transmis à chaque fournisseur de services. Cette configuration se fait via le fichier de configuration attribute-filter.xml
. La configuration par défaut ne prévoit que la diffusion de quelques attributs à un SP fictif. Nous allons l'adapter pour transmettre ces attributs utilisateurs à tous les fournisseurs de services :
- /opt/shibboleth-idp/conf/attribute-filter.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- This file is an EXAMPLE policy file. While the policy presented in this example file is illustrative of some simple cases, it relies on the names of non-existent example services and the example attributes demonstrated in the default attribute-resolver.xml file. This example does contain some usable "general purpose" policies that may be useful in conjunction with specific deployment choices, but those policies may not be applicable to your specific needs or constraints. --> <AttributeFilterPolicyGroup id="ShibbolethFilterPolicy" xmlns="urn:mace:shibboleth:2.0:afp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mace:shibboleth:2.0:afp http://shibboleth.net/schema/idp/shibboleth-afp.xsd"> [[...]] <!-- Release an additional attribute to an SP. --> <AttributeFilterPolicy id="example1"> ** <PolicyRequirementRule xsi:type="ANY" />** ** <AttributeRule attributeID="uid" permitAny="true" />** ** <AttributeRule attributeID="mail" permitAny="true" />** ** <AttributeRule attributeID="eduPersonPrincipalName" permitAny="true" />** </AttributeFilterPolicy> <!-- Release eduPersonScopedAffiliation to two specific SPs. --> <AttributeFilterPolicy id="example2"> <PolicyRequirementRule xsi:type="OR"> <Rule xsi:type="Requester" value="https://sp.example.org" /> <Rule xsi:type="Requester" value="https://another.example.org/shibboleth" /> </PolicyRequirementRule> <AttributeRule attributeID="eduPersonScopedAffiliation" permitAny="true" /> </AttributeFilterPolicy> </AttributeFilterPolicyGroup>
Vous pouvez forcer le rechargement du nouveau fichier attribute-filter.xml :
$> /opt/shibboleth-idp/bin/reload-service.sh -id shibboleth.AttributeFilterService
3. Vérification de la configuration des attributs
Documentation : https://wiki.shibboleth.net/confluence/display/IDP30/aacli
Shibboleth inclut l'utilitaire aacli.sh
en ligne de commande qui permet de tester quels attributs sont transmis, étant donné un fournisseur de services et un identifiant d'utilisateur.
Vous pouvez tester votre configuration dès maintenant :
$> /opt/shibboleth-idp/bin/aacli.sh -r https://formsfede-014.renater.fr/sp-ABC -n etudiant1
{ "requester": "https://formsfede-014.renater.fr/sp-ABC", "principal": "etudiant1", "attributes": [ { "name": "uid", "values": [ "etudiant1" ] }, { "name": "mail", "values": [ "etudiant1@example.org" ] }, { "name": "eduPersonPrincipalName", "values": [ "etudiant1@univ-test.fr" ] } ] }
Le résultat de la commande aacli.sh
indique les attributs mail
, uid
et eduPersonPrincipalName
.
La configuration permettant l'extraction et la diffusion de ces attributs utilisateur est donc correcte.
4. Test de votre IdP avec un service non fédéré
Comme vous avez pu le constater précédemment, votre connexion fonctionnait, mais aucun attribut n'était renvoyé par votre IDP.
A présent vous pouvez voir que les 3 attributs pour lesquels nous avons autorisé la diffusion sont bien affichés.
- /opt/shibboleth-idp/conf/attribute-resolver-ldap.xml
- /opt/shibboleth-idp/conf/services.xml
- /opt/shibboleth-idp/conf/attribute-filter.xml