Cette doc explique la mise en place du service Shibboleth dans le cadre de la fédération d'identité Renater. Ce service permet aux utilisateurs d'un membre de la fédération de se connecter aux ressources (=applications, services, …) offert par les membres de la fédération d'identité Renater à l'aide de leur identifiant de connexion habituels.
Pour authentifié les utilisateurs, le service Shibboleth fait appel traditionnellement au service CAS de l'établissment. Une fois la personne connectée via le CAS, le service Shibboleth se connecte à l'annuaire LDAP de l'établissment pour récupérer les informations de l'utilisateur (appelé attributs). Ces informations sont fournies aux ressources de la fédération les réclamant.
L'installation se fait à partir des sources du logiciel Shibboleth téléchargeable ici : https://shibboleth.net/downloads/identity-provider/. Une fois le tar.gz récupéré, décompresser dans le dossier de votre choix de la machine, puis :
<!-- CAS Filter Configuration --> <context-param> <param-name>serverName</param-name> <param-value>[URL du service Shibboleth]</param-value> </context-param> <!-- CAS Authentication Filter --> <filter> <filter-name>CAS Authentication Filter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>[URL du service CAS]/login</param-value> </init-param> </filter> <!-- CAS Validation Filter --> <filter> <filter-name>CAS Validation Filter</filter-name> <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>[URL du service CAS]/casv3</param-value> </init-param> </filter> <!-- CAS HttpServletRequest Wrapper Filter --> <filter> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> </filter> <!-- CAS Assertion Thread Local Filter --> <filter> <filter-name>CAS Assertion Thread Local Filter</filter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> </filter> <!-- CAS Filter for Shibb RemoteUser --> <filter-mapping> <filter-name>CAS Authentication Filter</filter-name> <url-pattern>/Authn/RemoteUser</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Validation Filter</filter-name> <url-pattern>/Authn/RemoteUser</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <url-pattern>/Authn/RemoteUser</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Assertion Thread Local Filter</filter-name> <url-pattern>/Authn/RemoteUser</url-pattern> </filter-mapping>
Pour finir, lancer le script install.sh à la racine des sources et répondre au question qu'il pose :
Le script va s'occuper de générer le fichier idp.war ainsi que la configuration initiale de l'application et déployer le tout dans le dossier choisi. Corriger ensuite les droits du dossiers logs dans le répertoire de déployer pour faire en sorte que l'utilisateur du service Tomcat est les droits d'écriture dedans.
==== Configuration ====
=== Metadata de la fédération ===
La fédération fournis un fichier de metadata contenant l'ensemble des informations techniques des acteurs de la fédération d'identité. Ce fichier de metadata est téléchargé régulièrement par le service, validé à l'aide du certificat de signature de la fédération et chargé par le service.
Pour configurer les metadata de la fédération, il faut :
<metadata:MetadataProvider id="URLMD" xsi:type="metadata:FileBackedHTTPMetadataProvider" metadataURL="https://metadata.federation.renater.fr/renater/main/main-all-renater-metadata.xml" backingFile="/opt/shibboleth-idp245/metadata/main-all-renater-metadata.xml"> <metadata:MetadataFilter xsi:type="metadata:ChainingFilter"> <metadata:MetadataFilter xsi:type="metadata:RequiredValidUntil" maxValidityInterval="P0Y0M0DT0H0M0.000S" /> <metadata:MetadataFilter xsi:type="metadata:SignatureValidation" trustEngineRef="shibboleth.MetadataTrustEngine" requireSignedMetadata="true" /> <metadata:MetadataFilter xsi:type="metadata:EntityRoleWhiteList"> <metadata:RetainedRole>samlmd:SPSSODescriptor</metadata:RetainedRole> </metadata:MetadataFilter> </metadata:MetadataFilter> </metadata:MetadataProvider>
<security:TrustEngine id="shibboleth.MetadataTrustEngine" xsi:type="security:StaticExplicitKeySignature"> <security:Credential id="MyFederation1Credentials" xsi:type="security:X509Filesystem"> <security:Certificate>/opt/shibboleth-idp245/credentials/renater-metadata-signing-cert-2016.pem</security:Certificate> </security:Credential> </security:TrustEngine>
=== Attributs ===
== Récupération des attributs ==
La configuration de la récupération des attributs est défini dans le fichier conf/attribute-resolver.xml. Éditer ce fichier pour :
<resolver:AttributeDefinition id="eduPersonTargetedID" xsi:type="ad:SAML2NameID" nameIdFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" sourceAttributeID="persistentID"> <resolver:Dependency ref="storedId" /> <resolver:AttributeEncoder xsi:type="enc:SAML1XMLObject" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" /> <resolver:AttributeEncoder xsi:type="enc:SAML2XMLObject" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" friendlyName="eduPersonTargetedID" /> </resolver:AttributeDefinition>
<resolver:DataConnector id="myLDAP" xsi:type="dc:LDAPDirectory" ldapURL="ldap://ldap.univ.fr" baseDN="ou=people,dc=univ,dc=fr" principal="uid=shibboleth,ou=sysaccounts,dc=univ,dc=fr" principalCredential="xxxxxx"> <dc:FilterTemplate> <![CDATA[ (uid=$requestContext.principalName) ]]> </dc:FilterTemplate> </resolver:DataConnector>
<resolver:DataConnector id="storedId" xsi:type="dc:StoredId" xmlns="urn:mace:shibboleth:2.0:resolver:dc" generatedAttributeID="persistentID" sourceAttributeID="uid" salt="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"> <resolver:Dependency ref="myLDAP" /> <dc:ApplicationManagedConnection jdbcDriver="com.mysql.jdbc.Driver" jdbcURL="jdbc:mysql://localhost/shibboleth" jdbcUserName="shibboleth" jdbcPassword="xxxxxxx" /> </resolver:DataConnector>
Créer ensuite la base de données MySQL comme configurée et créer à l'intérieur la table shibpid avec la requête suivante :
CREATE TABLE `shibpid` ( `localEntity` text NOT NULL, `peerEntity` text NOT NULL, `principalName` VARCHAR(255) NOT NULL DEFAULT '', `localId` VARCHAR(255) NOT NULL, `persistentId` VARCHAR(36) NOT NULL, `peerProvidedId` VARCHAR(255) DEFAULT NULL, `creationDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deactivationDate` TIMESTAMP NULL DEFAULT NULL, KEY `persistentId` (`persistentId`), KEY `persistentId_2` (`persistentId`,`deactivationDate`), KEY `localEntity` (`localEntity`(16),`peerEntity`(16),`localId`), KEY `localEntity_2` (`localEntity`(16),`peerEntity`(16),`localId`,`deactivationDate`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
== Filtrage des accès aux attributs par les ressources de la fédération ==
Le filtrage d'accès aux attributs par les ressources de la fédération est configuré :
<!-- Règle permissive renvoyant l'attribut transientID à n'importe quel SP --> <AttributeFilterPolicy id="releaseTransientIdToAnyone"> <PolicyRequirementRule xsi:type="basic:ANY" /> <!-- identifiant utilisateur de session, opaque, généré automatiquement par l'IdP Shibboleth (anciennement appelé nameId dans la fédération du CRU) --> <AttributeRule attributeID="transientId"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule> </AttributeFilterPolicy> <!-- Règle d'envoi d'un attribut de type targetedID à tout SP de la fédération Education-Recherche--> <AttributeFilterPolicy id="releaseTargetedID"> <PolicyRequirementRule xsi:type="saml:AttributeRequesterInEntityGroup" groupID="https://federation.renater.fr/" /> <!-- identifiant utilisateur opaque, persistent et spécifique à un couple SP/IdP --> <AttributeRule attributeID="eduPersonTargetedID"> <PermitValueRule xsi:type="basic:ANY" /> </AttributeRule>
<srv:Service id="shibboleth.AttributeFilterEngine" xsi:type="attribute-afp:ShibbolethAttributeFilteringEngine" configurationResourcePollingFrequency="PT1H0M0.000S" configurationResourcePollingRetryAttempts="3" > <srv:ConfigurationResource url="https://federation.renater.fr/renater/filtres/renater-attribute-filters-all.xml" xsi:type="resource:FileBackedHttpResource" file="/opt/shibboleth-idp245/conf/renater-attribute-filters-all.xml"/> <srv:ConfigurationResource url="https://federation.renater.fr/renater/filtres/renater-attribute-filters-community.xml" xsi:type="resource:FileBackedHttpResource" file="/opt/shibboleth-idp245/conf/renater-attribute-filters-community.xml"/> <srv:ConfigurationResource url="https://federation.renater.fr/edugain/filtres/edugain-attribute-filters-all.xml" xsi:type="resource:FileBackedHttpResource" file="/opt/shibboleth-idp245/conf/edugain-attribute-filters-all.xml"/> <srv:ConfigurationResource file="/opt/shibboleth-idp245/conf/attribute-filter.xml" xsi:type="resource:FilesystemResource"/> </srv:Service>
Il est nécessaire ensuite de télécharger une première fois manuellement les fichiers de configuration fournis par la fédération et de les faire appartenir à l'utilisateur du service Tomcat :
wget -O /opt/shibboleth-idp245/conf/renater-attribute-filters-all.xml https://federation.renater.fr/renater/filtres/renater-attribute-filters-all.xml wget -O /opt/shibboleth-idp245/conf/renater-attribute-filters-community.xml https://federation.renater.fr/renater/filtres/renater-attribute-filters-community.xml wget -O /opt/shibboleth-idp245/conf/edugain-attribute-filters-all.xml https://federation.renater.fr/edugain/filtres/edugain-attribute-filters-all.xml chown tomcat: /opt/shibboleth-idp245/conf/renater-attribute-filters-all.xml /opt/shibboleth-idp245/conf/renater-attribute-filters-community.xml /opt/shibboleth-idp245/conf/edugain-attribute-filters-all.xml
===== Procédures =====
==== Remettre en place le couple clé privée/certificat d'une ancienne installation ====
Suite à une réinstallation, il peut être nécessaire de remettre en place un ancien couple clé privée/certificat d'une ancienne installation pour conserver celui décléré auprès de la fédération. Pour cela, il faut, alors que Tomcat est éteint :