====== 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 ....