Articles taggés shibboleth
Monter rapidement un OpenLDAP avec des comptes de tests
0Je ne suis pas expert sur le sujet de la gestion d’identités mais il y a une chose dont je suis sûr, c’est que si je veux profiter d’une grande communauté, OpenLDAP est un bon choix. Notre architecture shibboleth s’appuiera donc sur OpenLDAP comme Metadata provider.
Alors c’est parti pour l’installation d’un OpenLDAP avec un ou deux comptes de tests et de quoi modifier tout ça à la volée.
Installation
Il me faut deux choses : un OpenLDAP et un outil pour le modifier. Si sur de la prod j’apprécie ldapvi, j’vais tenter un clickodrôme : Apache Directory studio.
Il me semble que l’OpenLDAP fournit par la distrib est souvent naze, mais c’est du test, pas de la prod. L’objectif ici et d’arriver RAPIDEMENT à un résultat (pour rappel je suis sur ubuntu 11.04)
sudo aptitude install slapd ldap-utils
On ajoute ensuite les schémas classiques à notre annuaire fraichement installé :
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
Il reste à créer un fichier de configuration par défaut (changez ce qui est en gras), je l’appelle « initial.ldif » :
# Load dynamic backend modules
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
#olcModuleload: back_hdb
# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=geekstuff,dc=fr
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=geekstuff,dc=fr
olcRootPW: {SSHA}eeJU9hDKOAZCQK/OScKAbxt2OslkshaL
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=geekstuff,dc=fr" write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=geekstuff,dc=fr" write by * read
Le « {SSHA}eeJU9hDKOAZCQK/OScKAbxt2OslkshaL » doit être remplacé par un mot de passe chiffré. Je vous propose d’utiliser la commande slappasswd pour générer le votre à partir d’un mot de passe.
On importe maintenant ce fichier (oui je sais on a déjà configurer des choses via dpkg, mais là au moins je suis certain).
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f initial.ldif
Le tip du jour. Si vous avez l’erreur suivante :
ldap_add: Other (e.g., implementation specific) error (80) additional info: <olcModuleLoad> handler exited with 1
C’est parce que vous tentez de charger un module déjà chargé. Il suffit de commenter la ligne « olcModuleload: back_hdb » dans le fichier initial.ldif juste avant son import (en mettant un simple « # » devant la ligne). Je n’ai pas encore validé que le backend restait le bon après ce choix.
Vous devriez avoir ceci en retour :
SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=module,cn=config" adding new entry "olcDatabase=hdb,cn=config"
Bon, avant de passer à la partie graphique, on va voir comment ajouter un utilisateur depuis un fichier de LDIF tel que celui ci-dessous. Il contient un groupe et un utilisateur (et il est pompé de la doc d’ubuntu-fr l’une de mes sources pour ce howto), je l’appelle import.ldif :
# Create top-level object in domain
dn: dc=geekstuff,dc=fr
objectClass: top
objectClass: dcObject
objectclass: organization
o: Geekstuff
description: Top domain geekstuff
# Admin user.
dn: cn=admin,dc=geekstuff,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: {SSHA}eeJU9hDKOAZCQK/OScKAbxt2OslkshaL
# Ci-dessous deux "ou" classiques en LDAP, il est preferable de les avoir.
dn: ou=people,dc=geekstuff,dc=fr
objectClass: organizationalUnit
ou: people
dn: ou=groups,dc=geekstuff,dc=fr
objectClass: organizationalUnit
ou: groups
dn: uid=elegall,ou=people,dc=geekstuff,dc=fr
objectClass: inetOrgPerson
uid: elegall
sn: Le Gall
givenName: Erwan
cn: Erwan Le Gall
displayName: Erwan Le Gall
userPassword: {SSHA}eeJU9hDKOAZCQK/OScKAbxt2OslkshaL
mail: elegall@localhost
o: Geekstuff
dn: cn=sales,ou=groups,dc=geekstuff,dc=fr
objectClass: groupOfNames
cn: sales
Et on l’inclue dans notre annuaire :
sudo ldapadd -x -D cn=admin,dc=geekstuff,dc=fr -W -f import.ldif
Ouf. Bon, en graphique plutôt ?
sudo aptitude install openjdk-6-jdk wget -O - http://archive.apache.org/dist/directory/studio/stable/1.5.3.v20100330/ApacheDirectoryStudio-linux-x86_64-1.5.3.v20100330.tar.gz.md5 2>/dev/null md5sum ApacheDirectoryStudio-linux-x86_64-1.5.3.v20100330.tar.gz # Vérifier l'intégrité du téléchargement tar xvzf ApacheDirectoryStudio-linux-x86_64-1.5.3.v20100330.tar.gz sudo mv ApacheDirectoryStudio-linux-x86_64-1.5.3.v20100330 /opt/ApacheDS ln -s /opt/ApacheDS/ApacheDirectoryStudio /usr/local/bin/ ApacheDirectoryStudio
It works !
Peupler l’annuaire
Sur ApacheDS, choisissez, cliquez sur le menu en bas à gauche et choisissez « Connexions ». Cliquez ensuite sur l’icone « LDAP ». Choisissez ensuite un nom pour votre connexion puis :
- Nom d’hôte : localhost
- Port : 389
- Choisir une connexion sans chiffrement
Testez les paramètres réseau et passez à l’étape suivante. Notre cn de connexion est « cn=admin,dc=geekstuff,dc=fr« , c’est à présent ce que l’on va renseigner.
Il suffit de valider pour profiter de la belle interface d’Apache Directory Studio. L’utilisation se passe de commentaires (et c’est assez pratique pour changer un ou deux attributs).
Ok. Ce tuto n’est pas des meilleurs (trop long et il faut que je le revalide entièrement). Je pense que j’en referais un avec quelques fichier et un script qui réalisera les étapes initiales, nécessaires à la génération du DIT et au remplissage de celui-ci. Quoi qu’il en soit, le prochain article traitera sans doute de l’interconnexion de l’IdP de Shibboleth avec notre annuaire LDAP fraîchement installé.
Shibboleth et jetty sur ubuntu 11.04
1Juste parce que je n’ai pas moyen de faire tourner une debian dans une VM sur mon desktop… Déjà que faire tourner un serveur d’appli c’est pas gagné.
Installation des prérequis
En gros, il s’agit du serveur d’authentification sur lequel les services renverront l’utilisateur. Pour simplifier, mon LDAP tournera sur la même machine.
Prérequis 1 : Un serveur d’appli Java
Parce que c’est plus fun, on le fait avec un jetty, ça me donne l’occase de regarder si c’est vraiment plus light que Tomcat. À la mode « le gars qui n’y connaît rien à java », j’installe la version fournie par ubuntu.
sudo aptitude install openjdk-6-jdk jetty [...] Le répertoire personnel `/usr/share/jetty' n'a pas été créé. * Not starting jetty - edit /etc/default/jetty and change NO_START to be 0 (or comment it out). [...]
Ok, démarrons les hostilités : Le coup du « Le répertoire personnel n’a pas été créé » c’est de la flûte : c’est le adduser qui devrait dire « le répertoire existe déjà ». Pour la seconde ligne, ça parle de soit non ?
sudo sed -i "s/NO_START=1/NO_START=0/" /etc/default/jetty
Ok, facile à installer Jetty. C’est pour ça que les devs doivent aimer en fait.
Bon, je me suis fais avoir. Après une lecture plus attentive de la doc de shibboleth, il me faut une version de jetty comprise entre la 7.0 et la 7.3.0 Ni plus, ni moins… C’est fun java hein ?
C’est reparti (après avoir fait un purge de mon paquet jetty initialement installé).
sudo aptitude install openjdk-6-jdk
C’est parti à la recherche d’un jetty compatible. On va prendre la 7.3.0 dans le doute :
wget http://dist.codehaus.org/jetty/jetty-hightide-7.3.0/jetty-hightide-7.3.0.v20110203.tar.gz wget -O - http://dist.codehaus.org/jetty/jetty-hightide-7.3.0/jetty-hightide-7.3.0.v20110203.tar.gz.md5 2>/dev/null md5sum jetty-hightide-7.3.0.v20110203.tar.gz
On vérifie le résultat et on continue :
tar xvzf jetty-hightide-7.3.0.v20110203.tar.gz sudo mv jetty-hightide-7.3.0.v20110203 /opt
vala… pas dur.
Prérequis 2 : un certificat ssl
Un petit rappel ne fait pas de mal, en plus sous ubuntu il n’y a rien à faire :
sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/private/localhost.pem
Il faut simplement indiquer ne nom d’hôte… facile non ?
Installation de l’IdP
Ok, on est dans le vif du sujet. Il s’agit d’une webapp, l’installation n’a donc aucun intérêt. Je prends la dernière version à ce jour :
wget http://www.shibboleth.net/downloads/identity-provider/latest/shibboleth-identityprovider-2.3.0-bin.zip wget -O - http://www.shibboleth.net/downloads/identity-provider/latest/shibboleth-identityprovider-2.3.0-bin.zip.md5 2>/dev/null md5sum shibboleth-identityprovider-2.3.0-bin.zip
On continue en extrayant le contenu de l’archive :
jar -xf shibboleth-identityprovider-2.3.0-bin.zip cd shibboleth-identityprovider-2.3.0/ sudo sh ./install.sh
Ok si vous obtenez un :
Error: JAVA_HOME is not defined correctly.
Le truc habituel… le script d’installation vérifie que le fichier « /usr/bin/java » soit bien exécutable. Sauf que c’est un lien symbolique, donc il ne l’est pas. Le truc que je fais ? Je bourrine un peu en ajoutant cette ligne au début du script install.sh :
JAVA_HOME="/usr/lib/jvm/java-6-openjdk/jre"
On relance et on répond qu’on veut l’installer dans « /opt/shibboleth-idp » comme proposé par défaut (ça me va bien). On met à nouveau le nom d’hôte. Dernière question sur un mot de passe pour le keystore, attention, il s’affiche en clair quand vous le saisissez.
Maintenant on copie le war dans notre serveur d’appli, facile « cp » je commence à maîtriser j’crois :
sudo cp /opt/shibboleth-idp/war/idp.war /var/lib/jetty/webapps/
Et on déploie tout ça (magie des serveurs d’appli, toujours inconnue des admins classiques) :
sudo /etc/init.d/jetty start tail -n 2000 -f /var/log/jetty/*.stderrout.log
Et VLAN, malédiction du java (c’est là ou un admin classique commence à rouspéter « java quelle daube ») : une stacktrace. Mais pour une fois c’est parlant : « Error creating bean with name ‘shibboleth.OpensamlConfig’ defined in URL [file:/opt/shibboleth-idp/conf/internal.xml]« … Il suffit de configurer notre nouveau joujou.
Un peu de doc : https://wiki.shibboleth.net/confluence/display/SHIB2/IdPJetty7Prepare
export JETTY_HOME=/opt/jetty-hightide-7.3.0.v20110203/
mkdir $JETTY_HOME/lib/endorsed
ln -s /opt/shibboleth-idp/lib/*.jar $JETTY_HOME/lib/endorsed/
ln -s /opt/shibboleth-idp/lib/endorsed/* $JETTY_HOME/lib/endorsed/
cd $JETTY_HOME
echo "etc/shib-delegatessl.xml" >> start.ini
echo "-Djava.endorsed.dirs=${JETTY_HOME}lib/endorsed" >> start.ini
echo "-Xmx512m" >> start.ini # Ne pas hésiter à augmenter le 512 si on a plus de ram
echo "-XX:MaxPermSize=128m" >> start.ini
wget http://shibboleth.internet2.edu/downloads/maven2/edu/internet2/middleware/security/jetty7/jetty7-dta-ssl/1.0.0/jetty7-dta-ssl-1.0.0.jar -O ${JETTY_HOME}/lib/ext/jetty7-dta-ssl-1.0.0.jar
OK maintenant on créé le fichier $JETTY_HOME/etc/shib-delegatessl.xml et on le rempli avec les infos suivantes :
<Configure id="Server" class="org.eclipse.jetty.server.Server"> <Call name="addConnector"> <Arg> <New class="edu.internet2.middleware.security.jetty7.DelegateToApplicationSslSelectChannelConnector"> <Set name="keystore">/opt/shibboleth-idp/credentials/idp.jks</Set> <Set name="password">PASSWORD</Set> <Set name="port">8443</Set> <Set name="maxIdleTime">30000</Set> <Set name="acceptors">2</Set> <Set name="acceptQueueSize">100</Set> </New> </Arg> </Call> </Configure>
Cela est utilisé pour écouter les connexion directes des services providers qui ne passeront pas par le serveur web. Si vous voulez plus de détail, je vous redirige vers la doc de shibboleth. Attention : dans le fichier ci-dessus j’ai repris le chemin du répertoire d’installation de l’IdP de shibboleth, si vous n’avez pas le même, pensez à le changer. Il faut également changer le « PASSWORD » avec le mot de passe rentré pour le keystore lors de l’installation de l’IdP.
Presque fini : on déclare l’emplacement du war pour que Jetty le déploie. Il faut éditer le fichier $JETTY_HOME/contexts/idp.xml avec les informations suivantes :
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="war">/opt/shibboleth-idp/war/idp.war</Set> <Set name="contextPath">/idp</Set> <Set name="extractWAR">false</Set> <Set name="copyWebDir">false</Set> </Configure>
Attention : encore une fois vous retrouvez le « /opt/shibboleth-idp » dans le contenu du fichier.
OK gogogo !
sudo java -jar start.jar
Pour vérifier : https://localhost:8080/idp/profile/Status : si le mot « ok » apparaît, c’est gagné.
Il reste à configurer le tout. Et ça fera sans doutes l’objet de mon prochain article. Seule différence : je ferais peut-être les manips sur un tomcat, pas parce que je n’aime pas jetty, mais parce que tomcat est la brique « standard » là où je bosse. Enfin, je pense pas que ça change grand chose et je m’amuserai même sans doute à préconfigurer sur jetty pour valider sur tomcat.
To be continued.