L'idée est d'utiliser un annuaire LDAP pour authentifier les utilisateurs qui se connecterons sur la machine Linux. L'approche classique sur des systèmes Unix pour avoir une base centrale d'utilisateurs est d'utiliser NIS. Nous allons voir comment utiliser une base LDAP pour faire le même travail.
Introduction
On suppose ici qu'un serveur LDAP tourne sans problème. Les entrées qui seront utilisées pour representer un compte doivent héritées des schémas posixAccount et shadowAccount. Ces schémas fournissent tous les attributs nécessaires pour remplacer les fichiers /etc/passwd et /etc/shadow. Pour changer le processus d'authentification classique, il faut installer PAM (Pluggable Authentification Module). C'est une bibliothèque qui permet de remplacer la source d'authentification par à peu près n'importe quoi (LDAP, SQL, fichier à plat, NIS, ...).
Installation des paquets
Installer les paquets suivants :
apt-get install libpam-ldap libpam0g libldap2 libpam-cracklib libnss-ldap nscd
Sous Debian lors de l'installation, répondre non à toutes les questions, puisque les fichiers de configuration seront écrasés par la suite.
Fichiers de configuration
/etc/pam.d/common-account
Le fichier common-account gère l'authorisation de connexion. On peut donner des restriction en fonction du login, de la date, de l'heure, etc. Modifier le fichier /etc/pam.d/common-account :
# Aucun paramètre n'est donnée pour la connexion
# c'est a dire que si l'utilisateur possede un compte
# local ou sur le ldap, il aura le droit de se connecter
account required pam_unix.so
account sufficient pam_ldap.so
/etc/pam.d/common-auth
Le fichier commmon-auth gère l'authentification. On y met les modules que l'on souhaite voir tester les couples login/mot de passe. Modifier le fichier /etc/pam.d/common-auth :
# Les variables d'environement par defaut sont placees dans /etc/security/pam_env.conf
auth required pam_env.so
# interroge le fichier /etc/passwd et si l'authentification est bonne, alors
# PAM retourne ok et quitte
auth sufficient pam_unix.so
# interroge le LDAP et si l'authentification est bonne, alors PAM retourne ok
# et quitte
auth sufficient pam_ldap.so use_first_pass
# si tout a echoue alors PAM retourne mauvaise authentification et quitte
auth required pam_deny.so
/etc/pam.d/common-password
Le fichier common-password gère le changement de mot de passe. Modifier le fichier /etc/pam.d/common-password :
password required pam_cracklib.so retry=3 minlen=6
password sufficient pam_unix.so use_authtok md5 shadow
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
/etc/pam.d/common-session
Le fichier common-session gère l'ouverture de session. Modifier le fichier /etc/pam.d/common-session :
# charge le fichier /etc/security/limits.conf et pose de limites pour
# l'utilisateur qui se connecte
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so
/etc/nsswitch.conf
Ici on met files avant ldap pour que le root de la machine cliente puisse se connecter en s'authentifiant avec un mot de passe local. Modifier le fichier /etc/nsswitch.conf, pour qu'il soit :
passwd: compat ldap
shadow: compat ldap
group: compat ldap
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
/etc/nscd.conf
L'intérêt d'installer nscd est d'avoir un meilleur temps de réponse lorsque l'on interroge un service qui doit accèder à la liste des utilisateurs. Modifiez le fichier /etc/nscd.conf, si nscd est installé. Le point sensible semble être les groupes.
# enable-cache : booleen yes ou no.
# positive-time-to-live : nombre de secondes après lesquelles
# les entrées mises en cache sont retirées.
# negative-time-to-live : pour les entrées non trouvées
# précédement, nombre de secondes après lesquelles les
# entrées mises en cache sont retirées.
# suggested-size : taille du hachage qui sera utilisé pour stocker
# les entrées. La taille doit être plus grande que le nombre de
# données que l'on veux stocker et être un nombre premier.
# check-files : test si les fichiers ont changé depuis la
# derniere fois.
enable-cache passwd yes
positive-time-to-live passwd 300
negative-time-to-live passwd 20
suggested-size passwd 3001
check-files passwd yes
enable-cache group yes
positive-time-to-live group 3600
negative-time-to-live group 20
suggested-size group 211
check-files group yes
enable-cache hosts no
positive-time-to-live hosts 3600
negative-time-to-live hosts 20
suggested-size hosts 211
check-files hosts yes
/etc/ldap/ldap.conf
Modifier le fichier /etc/ldap/ldap.conf (mode 644). Pour la prise en compte du TLS il faut télécharger le certificat de l'autorité de certification du serveur LDAP et le copier dans le répertoire /etc/ldap/ (ou ailleurs mais alors il faut modifier les lignes qui suivent). Attention : La clé du serveur est générée en fonction de son nom (FQDN), il faut donc toujours faire référence au serveur LDAP par son FQDN et pas par son IP si on veut faire du TLS !
# L'attribut BASE indique le DN de la base ldap
BASE dc=example,dc=com
# le nom du serveur
HOST ldap.example.com
# Les commande suivant indique sont utiles uniquement si
# on souhaite se connecter en TLS
TLS_CACERT /etc/ldap/cachain.txt
TLS_REQCERT demand
/etc/libnss-ldap.conf
Le fichier /etc/libnss-ldap.conf configure l'access de Name Service Switch au LDAP. Attention ce fichier doit être en mode 644 sinon au login le nom de l'utilisateur sera "I have no name!".
host ldap.example.com
base dc=example,dc=com
ldap_version 3
/etc/pam_ldap.conf
Le fichier /etc/pam_ldap.conf configure l'access de PAM au LDAP (mode 644) :
host ldap.example.com
base dc=exemple,dc=net
ldap_version 3
pam_password md5
# pour filter les personnes en fonction de certain de leur attributs LDAP on peut utiliser la directive suivant (a adapter)
#pam_filter &(attribut=valeur)(objectClass=person)
# utilise tls pour la connexion
ssl start_tls
# demande et verifie le certificat serveur
tls_checkpeer yes
# certificat CA du serveur
tls_cacertfile /etc/ldap/cachain.txt
NSCD
A la fin de la configuration il faut redemarrer NSCD, pour qu'il prenne en compte la base LDAP. Un restart ne suffit pas, car il faut invalider la base :
/etc/init.d/nscd stop
/etc/init.d/nscd start