Table des matières
CASsification via PAM
Objectif et intérêt de la démarche
Nous souhaitons CASsifier un serveur que ce soit un serveur imap, Jabber (XMPP) ou autre …….
Je vous conseille de 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 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/NSS (si on veux un cache pas expliqué ici)
pam_cas
Installation
On commence par télécharger les sources sur 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
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 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 ce tuto d'esup.
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 <service> <ticket> <fichier_de_configuration>
<Service> représente le libellé du service par exemple imap://mail.mdl29.net
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 à ce tuto d'esup.
Pile pam (simple)
Nous allons maintenant relier tout ceci à pam avec une petite pile pam.
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
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
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 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.
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 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.
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) : CASsification de dovecot
Ou a un serveur XMPP ejabberd CASsification d'ejabberd
Rédigé par Benjamin Bernard
Source : très diverses, doc d'esup, échanges de mails ….