Encore un article concernant les mécanisme de SSO. Cette fois nous allons nous intéresser au produit SimpleSamlPhp, qui n’a de simple que le nom. Dans ce tutoriel, nous allons monter un Service Provider qui sera intégré dans une fédération d’identité.
Introduction
SimpleSamlPhp fait plus ou moins la même chose que Shibboleth. Il peut servir pour créer un IdP ou plus simplement un SP. Nous allons voir ici comment le configurer pour en faire un Service Provider fonctionnant dans notre fédération d’identité.
Dans la suite, le nom de fichiers sont donnés avec leur chemin complet depuis la racine de SimpleSamlPhp, c’est à dire /var/www/simplesamlphp.
Installation de SimpleSamlPhp
L’installation est plutôt légère car il s’agit d’une application PHP. On suppose que vous l’installez sur un serveur où Apache et PHP sont fonctionnels. On va commencer par récupérer les sources que l’on va installer dans /var/www/simplesamlphp.
Dans un shell connecté en root :
cd /var/www/
wget http://simplesamlphp.googlecode.com/files/simplesamlphp-1.10.0.tar.gz
tar zxvf simplesamlphp-1.10.0.tar.gz
rm -rf simplesamlphp-1.10.0.tar.gz
chown apache:apache simplesamlphp-1.10.0 -R
ln -s simplesamlphp-1.10.0 simplesamlphp
On va ensuite ajouter un alias dans chacun des vhosts Apache pour mapper l’URL https://<mon_sp>.<mon_domaine>/simplesaml sur le chemin /var/www/simplesamlphp/www. L’alias est le suivant :
Alias /simplesaml /var/www/simplesamlphp/www
Pensez à relancer votre Apache :
service httpd reload
Configuration du SP
Bon, on passe à la partie la plus compliquée, enfin moi j’en ai chier pour le faire marcher ce SP ! On va y aller pas à pas en commençant par le fichier config.php. Il y a des templates pour tous les fichiers de configuration :
cd /var/www/simplesamlphp/
cp -p config-templates/config.php config/
vim config/config.php
Modifier les valeurs suivantes :
'auth.adminpassword' => '<admin_pass>',
secretsalt' => '<random>',
'technicalcontact_name' => '<admin_name>',
'technicalcontact_email' => '<admin_mail>',
Il y a pleins d’autres options mais pour le moment nous avons besoin de modifier que celles ci. Donc la conf commune c’est ok, alors on passe au fichier qui décrit les différents SP, il s’appelle authsource.php et on le copie depuis le répertoire des templates :
cp -p config-templates/authsources.php config/
vim config/authsources.php
Par défaut, il y a un SP par défaut et une entrée pour l’interface d’administration. Soit on modifie le SP par défaut, soit on en rajoute un nouveau. Pour ma part, j’ai ajouté un SP, je sais pas si c’est la meilleure façon de faire. On déclare donc un SP minimal :
'<sp_name>' => array(
'saml:SP',
'entityID' => 'https://<sp_url>/sp',
'privatekey' => 'saml.pem',
'certificate' => 'saml.crt',
),
Le paramètre <sp_name> sert à identifier le SP en interne, c’est équivalent à l’application ID dans Shibboleth. Le paramètre EntityID est l’ID du SP dans les métadonnées de votre fédération. Les certificats et clés se trouvent dans /var/www/simplesamlphp/cert/, on utilise ici des certifs auto-signés, comme avec Shibboleth.
Ensuite, il faut fournir à SimpleSamlPhp les informations décrivant les ressources de la fédération, c’est à dire les métadonnées. Les briques utilisant Shibboleth s’appuient sur un fichier de métadonnées en XML. SimpleSamlPhp, lui, préfère des tableaux associatifs PHP contenus dans plusieurs fichiers. Je trouve ça naze qu’ils n’utilisent pas le même format. Pour tous vous dire même, j’ai râlé tout seul contre les développeurs de ce produit qui s’amusent à faire du spécifique, jusqu’au moment où j’ai découvert qu’ils fournissaient un outil de conversion :D Outil que l’on verra plus tard, pour le moment nous allons déclarer à la main un IdP, pour tester.
Tout se passe dans le fichier metadata/saml20-idp-remote.php (liste des IdP distants en version 2), il y a un template dans metadata-templates/ mais dans ce cas nous allons partir d’un fichier vierge :
cd /var/www/simplesamlphp/
vim metadata/saml20-idp-remote.php
Les métadonnées sont ici sous forme d’un grand tableau associatif PHP, il faut ajouter une entrée pour notre IdP :
$metadata['<mon_idp>/idp'] = array(
'SingleSignOnService' => 'https://<mon_idp>/shibboleth-idp/profile/SAML2/Redirect/SSO',
'certificate' => '<mon_idp>.crt'
);
La clé “<mon_idp>/idp” correspond au champs EntityID de votre IdP. Le certificat “<mon_idp>.crt” est le certificat publique de l’IdP et doit être dans le répertoire cert/. L’URL dans le champs “SingleSignOnService” est celle utilisant la méthode Redirect. Toutes ces infos peuvent être trouvées dans le fichier xml des métédonnées de votre fédération d’identité.
Bon là on est pas mal, on va tester notre service provider.
Tester notre SP SimpleSamlPhp
On suppose que votre SP est déclaré dans la fédération, que les métadonnées sont à jour sur le SP et sur l’IdP que vous allez utiliser. Rendez vous sur l’interface de SimpleSamlPhp :
https://<mon_sp>.<mon_domaine>/simplesaml/
Cliquez sur l’onglet “Authentification”, puis sur le lien “Tester les sources d’authentification configurées”. Dans les listes des SP, cliquez sur celui que vous avez créé plus haut. Vous arrivez sur le WAYF intégré de SimpleSamlPhp, sélectionnez votre IdP, authentifiez vous. Si tout est OK, vous allez retourner sur l’interface SimpleSamlPhp et plus particulièrement sur une page listant les infos récupérées par votre SP.
Gestion des métadonnées
Ça marche avec un IdP s’est cool mais maintenant il faut que ça marche avec tous les IdP de votre fédération. Pour cela, il faut convertir le fichier XML de métadonnées. L’outil s’appelle metadatrefresh et est en fait un module SimpleSamlPhp qu’il suffit d’activer et de le configurer :
cd /var/www/simplesamlphp/
touch module/metarefresh/enable
cp -p module/metarefresh/config-templates/config-metarefresh.php config/
vim config/config-metarefresh.php
Dans ce fichier de configuration, il y a deux paramètres à modifier :
'src' => 'https://<ma_fédération_identité>/metadata/<metadata>.xml',
'validateFingerprint' => '<fingerprint_cert_metadata>',
'outputDir' => 'metadata/metadata-<ma_fédération_identité>/',
Les métadonnées sont signées, il est nécessaire de vérifier le certificat présenté. Récupérer le certificat de votre fédération et calculer l’empreinte :
cd /tmp/
wget https://<ma_fédération_identité>/metadata/<metadata>.crt
openssl x509 -noout -fingerprint -in <metadata>.crt
Par le web, on va ensuite exécuter le script de génération des métadonnées. Rendez vous à l’URL suivante en étant connecté en admin :
https://<mon_sp>.<mon_domaine>/simplesaml/module.php/metarefresh/fetch.php
En sortie, il répond un truc du genre :
10:01:57.360Z [metarefresh]: Executing set [kalmar]
10:01:57.373Z [metarefresh]: In set [kalmar] loading source [https://<ma_fédération_identité>/metadata/<metadata>.xml]
10:02:03.054Z Writing: /var/www/simplesamlphp-1.10.0/metadata/metadata-<ma_fédération_identité>/saml20-idp-remote.php
10:02:03.119Z Writing: /var/www/simplesamlphp-1.10.0/metadata/metadata-<ma_fédération_identité>/saml20-sp-remote.php
10:02:03.280Z Writing: /var/www/simplesamlphp-1.10.0/metadata/metadata-<ma_fédération_identité>/shib13-idp-remote.php
10:02:03.376Z Writing: /var/www/simplesamlphp-1.10.0/metadata/metadata-<ma_fédération_identité>/shib13-sp-remote.php
10:02:03.526Z Writing: /var/www/simplesamlphp-1.10.0/metadata/metadata-<ma_fédération_identité>/attributeauthority-remote.php
On va dire à notre SimpleSamlPhp d’utiliser ces métadonnées, il faut éditer le fichier config/config.php :
cd /var/www/simplesamlphp/
vim config/config.php
Puis modifier le tableau qui a pour index “metadata.sources” :
'metadata.sources' => array(
array('type' => 'flatfile'),
array('type' => 'flatfile', 'directory' => 'metadata/metadata-<ma_fédération_identité>'),
),
Réécriture des attributs
Suivant ce que renvoi l’IdP et de comment est configuré votre fichier config/config-metarefresh.php, le nommage des attributs peut varier fortement. On va activer du mapping d’attributs, c’est à dire de la réécriture. Dans Shibboleth, il y a les mêmes mécanismes mais ils sont activés par défaut, c’est donc transparent pour l’utilisateur.
Il y a, en gros, trois nommages d’attributs : par OID (object identifier), par URN (uniform ressource name) et par nom humainement compréhensible. On va dire que l’on préfère travailler avec les noms, on doit donc traduire les OID et les URN vers les noms. Editer le fichier de configuration commune config/config.php :
cd /var/www/simplesamlphp/
vim config/config.php
Chercher la clé “authproc.sp”, ici sont définis les traitements effectués sur les attributs reçus par les SP. On ajoute donc une réécriture des attributs :
50 => array('class' => 'core:AttributeMap', 'oid2name'),
51 => array('class' => 'core:AttributeMap', 'urn2name'),
Visiblement, cela peut être déclarer dans le fichier config/config-metarefresh.php, il y a une section “authproc”.
Utilisation d’un WAYF externe
Le WAYF SimpleSamlPhp est suffisant mais vous avez sûrement déjà un service WAYF. On va donc modifier la configuration de notre SP pour qu’il utilise un WAYF externe. Editer le fichier config/authsources.php :
cd /var/www/simplesamlphp/
vim config/authsources.php
Dans la partie que l’on a ajouté au début, il faut ajouter le paramètre “discoURL” et mettre l’URL complète de son WAYF :
'<sp_name>' => array(
'saml:SP',
'entityID' => 'https://<sp_url>/sp',
'privatekey' => 'saml.pem',
'certificate' => 'saml.crt',
'discoURL' => 'https://<ma_federation>/wayf',
),
Conclusion
Voila, à ce stade, vous devez avoir un SP fonctionnel et intégré dans votre fédération. Je connais encore mal SimpleSamlPhp mais il y a pas mal de modules dont certains très intéressants. Il y a des outils de découverte automatique, des WAYF “intelligents” pouvant filtrer la logne liste d’IdP, etc. On verra ça plus tard ;-)
Références
- Doc d’installation officielle : http://simplesamlphp.org/docs/trunk/simplesamlphp-install
- Doc de conf pour un SP : http://simplesamlphp.org/docs/trunk/simplesamlphp-sp
- Doc pour générer les métadonnées : http://simplesamlphp.org/docs/1.5/simplesamlphp-automated_metadata
Et surtout, une documentation du CRU très très complète, j’aurai gagné beaucoup de temps si j’étais tombé dessus de suite :
https://www.cru.fr/documentation/federation/sp_simplesaml