====== CASsification via PAM ====== Tuto en cours de rédaction ..... ===== Objectif et intérêt de la démarche ===== Nous souhaitons CASsifier un serveur que ce soit un serveur imap, Jabber (XMPP) ou autre ....... Par CASsifier, j'entends faire en sorte que notre serveur accepte des tickets CAS et qu'il soit capable de les vérifier auprès du CAS en plus de l'identification classique via le LDAP. Je vous conseille de [[braveo:docinstall:cas:proxying:presentation|lire l’aspect théorique d'abord]]. Nous n'allons bien entendu pas chercher une solution qui corresponde à chacun de ces services (ce serait un peu long :-)), par contre il existe un point commun entre tous ces services (et même la majorité des applications, serveurs ftp par exemple). Ce point commun c'est [[http://fr.wikipedia.org/wiki/Pluggable_Authentication_Modules|Pluggable Authentication Modules]] **PAM**. PAM est conçu comme son nom l'indique pour gérer l'authentification et il est possible de relier des applications tel qu'un serveur imap (dovecot) ou un serveur XMPP (ejabberd) à ce module PAM. Pour ce faire nous allons mettre au point un **pile d'authentification PAM** de la façon suivante : * On vérifie si les identifiant ne sont pas déjà dans le cache (pam_ccreds) * Si le mot de passe a la structure d'un ticket de CAS (commençant par ST ou PT), on vérifie la validité du ticket auprès du CAS (pam_cas) * Sinon si l'étape précédente échoue, on va vérifier les identifiants auprès du LDAP (pam_ldap) * .... on peut rajouter autre chose si on veux se compliquer la vie :-) mais on ne va pas le faire * Enfin en tout dernier on met en cache l'identification, car je vous rappelle qu'on ticket n'est valide qu'une seule fois (pam_ccreds) Voilà il y a plus qu'a tout installer ;-) //courage c'est pas si long que ça .....// \\ \\ ===== pam_ldap ===== Installation des paquets : apt-get install libpam-ldap Configuration de libnss-ldap : URI du ldap : ldap://ldap.mdl29:389/ Base DN : dc=mdl29,dc=net Version : 3 (la dernière) SuperUilisateur: cn=admin,dc=mdl29,dc=net (ou ne rien mettre si on ne veut pas passer par le super utilisateur) Mot de passe : ******* (ou ne rien mettre si on ne veut pas passer par le super utilisateur) Modification des mot de passes locaux : non La base de données LDAP demande-t-elle une identification ? : Non //Cette conf est ensuite dispo ici /etc/pam_ldap.conf// Pour tester, //getent passwwd// devrait retourner les utilisateurs contenus dans LDAP. Si ça ne fonctionne pas allez chercher les logs ici : ///var/log/auth.log// Vou pouvez aussi ajouter dans ///etc/pam_ldap.conf// : debug 9 Autres docs utilisées : * http://wiki.debian.org/LDAP/PAM * http://wiki.debian.org/LDAP/NSS (si on veux un cache pas expliqué ici) * http://jfgiraud.free.fr/programmation/ldapauth/#pam * http://www.pascalou.org/linux/doc/authentification-ldap-3.html \\ \\ \\ ===== pam_cas ===== ==== Installation ==== On commence par télécharger les sources sur [[https://sourcesup.cru.fr/frs/?group_id=213&release_id=712|le site d'esup]]. Décompressez les sources (adaptez le commande en changeant la version) : tar xvzf Pam_cas-2.0.11-esup-X.X.X.tar.gz Compiler les sources (dossier //sources//), choisissez le bon make en fonction de votre OS, pour debian : cd sources cp Makefile.Redhat Makefile make Nous allons aussi utiliser l'outil de test castest, il faut donc le compiler aussi : make test Si vous avez une architecture 64bit, vous allez devoir modifier/patcher le Makefile (plus d'info [[https://dokuwicri.univ-reims.fr/wiki/doku.php?id=mail:preparer_pam_et_cyrus-sasl_pour_l_authentification_cas|ici]]) : diff Makefile.redhat Makefile 8c8 < CPFLAGS = -O2 --- > CPFLAGS = -O2 -fPIC 49a50,53 > > install: > install -s -o0 -g0 -m644 pam_cas.so $(DESTDIR)/lib/security > install -m640 ../pam_cas.conf $(DESTDIR)/etc/security J'ai généré un {{:braveo:docinstall:cas:pam-cas_-_patch.diff|fichier patch}}, pour l'appliquer (dans le dossier source) : patch -p0 < patch.diff Vérifiez bien que la librairie, pam_cas.so est généré, vous pouvez aussi tester castest avec un ./castest qui normalement devrait générer un erreur. Vous allez ensuite copier le module pam_cas.so dans /lib/security/ : cp pam_cas.so /lib/security/pam_cas.so \\ \\ ==== Configuration === Le fichier de configuration est : **/etc/pam_cas.conf** Voici par exemple celui que nous utilisons : host cas.mdl29.net port 80 uriValidate /proxyValidate ssl no #LOG_DEBUG 10 #debug on trusted_ca /etc/pam.d/ssl/Gandi.pem Comme vous pouvez le constater, il est possible d'activer le débuggage et de régler son niveau, vous retrouverez les logs dans **/var/log/auth.log**. Vous trouverez plus de détail sur la configuration dans [[http://www.esup-portail.org/consortium/espace/SSO_1B/tech/cas/cas_pam.html|ce tuto d'esup]]. Nous avons étaient contrait d'utiliser le port 80 à cause d'un problème de certificat SSL (pris chez Gandhi) que la librairie n'acceptait pas. \\ \\ === On test === C'est maintenant que castest entre en action (à exécuter dans le dossier sources) : ./castest "imap://192.168.10.143" "ticket=ST-224-DFL5XDQ5s1Gf7PoZwCBl-localhost" Castest fonction avec les arguments suivants : ./castest //// représente le libellé du service par exemple imap://mail.mdl29.net Pour générer un ticket au niveau du CAS vous pouvez utiliser une url du type : https://cas.mdl29.net/login?service=imap://mail.mdl29.net ou si le CAS n'est pas à la racine https://cas.mdl29.net/cas/login?service=imap://mail.mdl29.net Si vous rencontrez des problèmes, viellez vous référer à [[http://www.esup-portail.org/consortium/espace/SSO_1B/tech/cas/cas_pam.html|ce tuto d'esup]]. === Pile pam (simple) === Nous allons maintenant relier tout ceci à pam avec une petite pile pam. Une pile pam représente la successions de module d'identification par lesquels vont passer les identifiants. Si quelqu'un peut préciser la note précédente merci de le faire :) Exemple d'une pile pam (CAS puis ldap) : auth sufficient /lib/security/pam_cas.so -simap://mail.mdl29.net -f/etc/pam_cas.conf auth sufficient /lib/security/pam_ldap.so auth required /lib/security/pam_pwdb.so shadow nullok Voir pour mettre une petite procédure de test de la pile, via la commande login par exemple utilisant la pile /etc/pam.d/login, ainsi rappeler la présence du mode de débuggage ... Un problème se pose, souvenez-vous un ticket n'est valide qu'une seule fois, par conséquent si on prend l'exemple d'un serveur mail, il n'est pas concevable de demander un nouveau ticket à cette requête imap. La solution est simple mettre en cache le ticket, ce que nous allons faire avec pam_ccreds. \\ \\ === Sources utilisées === * http://www.esup-portail.org/consortium/espace/SSO_1B/tech/cas/cas_pam.html * https://dokuwicri.univ-reims.fr/wiki/doku.php?id=mail:preparer_pam_et_cyrus-sasl_pour_l_authentification_cas * http://www.esup-portail.org/pages/viewpage.action?pageId=3932348 \\ \\ \\ ===== Pam_ccreds ===== === Installer pam_ccreds : === apt-get install libpam-ccreds Vérifier rapidement si ///lib/security/pam_ccreds.so// existe, si oui continuer. \\ \\ \\ ===== Préparation de pile pam : ===== === La pile PAM que nous utilisons === Voici la pile PAM que nous utilisons pour dovecot, l'intégration de cette pile pam et la configuration de dovecot sont [[braveo:docinstall:cas:dovecot|ici]]. auth sufficient /lib/security/pam_ccreds.so action=validate service_specific auth [success=1 new_authtok_reqd=done default=ignore] /lib/security/pam_cas.so -simap://mail.mdl29.net -f/etc/pam_cas.conf auth [success=ok new_authtok_reqd=done default=die] /lib/security/pam_ldap.so auth optional /lib/security/pam_ccreds.so action=store timeout=300 service_specific #La suite ne traite pas de l'authentification elle peut donc être exclue : account required /lib/security/pam_ldap.so @include common-auth @include common-account @include common-session Changez le libellé du service en fonction de vos besoins. Cette pile peut certainement être amélioré, mais a le mérite de fonctionner FIXME \\ \\ === Comprendre la pile PAM === Une pile PAM c'est la suite des instructions que PAM va suivre pour authentifier un utilisateur, les identifiants vont passer dans les différentes librairies que nous avons installées en suivant certain règles. \\ __Je vous rappelle le déroulement :__ * On vérifie si les identifiant ne sont pas déjà dans le cache (pam_ccreds) * Si le mot de passe a la structure d'un ticket de CAS (commençant par ST ou PT), on vérifie la validité du ticket auprès du CAS (pam_cas) * Sinon si l'étape précédente échoue, on va vérifier les identifiants auprès du LDAP (pam_ldap) * .... on peut rajouter autre chose si on veut se compliquer la vie :-) mais on ne va pas le faire * Enfin en tout dernier on met en cache l'identification, car je vous rappelle qu'on ticket n'est valide qu'une seule fois (pam_ccreds) \\ Chacune de ces étapes sera représentée par une ligne Auth dans la pile PAM. \\ __A cela on ajoute quelques évidences :__ * Si pam_ccreds (ligne 1) retourne OK pas besoin de vérifier le reste sinon on continue, on l'indique par le mot clé : **sufficient** * pam_cas : * Si OK : il faut mettre en cache le ticket via pam_ccreds, on saute donc la ligne pam_ldap pour passer à la dernière ligne de mise en cache via pam_ccreds (dernière ligne) ceci est indiqué par : **success=1** si on veut sauter 2 lignes **success=2** .... * Sinon on continue dans la pile * pam_ldap, si OK, la pile est validée et c'est bon l'utilisateur est identifié, indiqué par : **success=ok** * pam_ccreds mise en cache : elle peut échouer ceci n'a pas d'importance d'ou le **optional** Pour plus d'informations je vous propose [[http://linux.die.net/man/5/pam.conf|cette doc]]. Maintenant qu'on a notre pile PAM, reste plus qu'à la tester et à la mettre en place sur un serveur imap par exemple. ===== Comment tester si c'est bon ? ===== On va se baser sur la commande **login** à laquelle correspond la pile PAM **/etc/pam.d/login** : On fait un backup de la pile login : cp /etc/pam.d/login /etc/pam.d/login.back Puis on met notre pile PAM (du paragraphe précédant) dans le fichier /etc/pam.d/login : nano /etc/pam.d/login Enfin on tente de se connecter avec la commande **login** : login Essayez avec un compte ldap. //Je vous conseille d'utiliser castest pour les test avec des tickets CAS.// Cette méthode ne semble pas fonctionner avec des tickets du CAS FIXME N'oubliez pas, les logs sont dans **/var/logs/auth.log**. Après avoir effectué vos tests vous **__devez impérativement restaurer la pile login d'origine__** : mv /etc/pam.d/login.back /etc/pam.d/login \\ \\ \\ \\ \\ \\ Prêts a poursuivre ? Appliquons cette pile à un serveur imap (dovecot) : [[braveo:docinstall:cas:dovecot| CASsification de dovecot]] \\ Ou a un serveur XMPP ejabberd [[braveo:docinstall:cas:dovecot| CASsification d'ejabberd]] ---- Rédigé par Benjamin Bernard \\ Source : très diverses, doc d'esup, échanges de mails ....