(à part les aptitude install toussa, le howto fonctionne sûrement sur d'autres distributions, voir sur les BSD utilisant pam, comme FreeBSD ou NetBSD)
La documentation sur comment qu'on installe LDAP sous Debian existe, mais elle est relativement épaisse et éparpillée dans le wiki Debian, il n'y pas de documentation sur comment monter de l'authentification LDAP pas à pas, de plus la documentation française est quasiment inexistante. C'est pourquoi j'ai décidé d'écrire ce document.
Je pense que je n'apprends rien à personne, mais LDAP (lightweight directory access protocol), est un protocole reposant principalement sur TCP/IP qui permet l'interrogation et la modification de services d'annuaire. LDAP fonctionne sur un modèle de structure arborescente dont chacun des noeuds est constitué d'attributs associés à leurs valeurs.
Pour la base de l'annuaire LDAP (la racine de l'arbre), on utilise souvent le nommage DNS, c'est le modèle par défaut de slapd sous debian. Exemple d'un arbre basé sur le nommage DNS:
dc=org # on utilise le tld comme premier noeud
\
dc=gcu-squad # le nom de domaine (sans le tld bien sûr)
/ \
ou=people ou=groups # équivalents de /etc/passwd et /etc/group
/ \ \
uid=semial uid=root cn=wheel # entrées
| | \
différentes infos sur numéro gid etc
chaque utilisateur
(shell, homedir, mot
de passe, etc)
Prenons l'exemple d'une école, avec une salle informatique sous linux qui contient une quarantaine de pc, pas complètement homogène (disons qu'il reste une dizaine de stations sun de l'année dernière, il y a 4 ppc, etc.).
Lorsqu'un prof/élève allume une machine, elle boote, et monte le /home de la machine posé sur un serveur, en nfs comme ça chacun peut retrouver ses documents même en changeant d'ordinateur.
Or, si chacun a son propre $HOME, il faut que chacun des 200 élèves + 10 profs ait une entrée dans /etc/passwd, et ça, c'est pas terrible, surtout si il faut répliquer le fichier sur chaque machine lors d'un ajout/suppression d'utilisateur.
Vous allez me répondre “mais oui mais on monte le /etc/passwd blah en nfs lol”. C'est déjà plutôt sale, et 210 utilisateurs dans /etc/passwd, ça risque de prendre longtemps à parser quand /bin/login, sshd, pam, toussa viendront à le lire.
Peut-être aussi que vous avez 2 boxes et 3 users mais que votre poil ne brille pas, et vous voulez y remédier.
Dans ce morceau de parchemin, nous utiliserons la distribution dubien, debian.
On installe slapd:
sudo aptitude install slapd ldap-utils
Debconf va créer le compte administrateur LDAP et le DN (Distinguished Name) racine selon vos réponses à ses questions. Admettons que nous utiliserons gcu-squad.org comme domaine, le DN racine sera dc=gcu-squad,dc=org et donc l'admin sera cn=admin,dc=gcu-squad,dc=org.
Si vous avez déjà des comptes dans /etc/passwd, lisez ce qui suit, sinon ajoutez-en un et procédez à une “migration”.
Installons les scrips de migration:
aptitude install migrationtools
Éditez /etc/migrationtools/migrate_common.ph Modifiez
$DEFAULT_MAIL_DOMAIN = "gcu-squad.org";
$DEFAULT_BASE = "dc=gcu-squad,dc=org";
$EXTENDED_SCHEMA = 1;
# ne pas migrer les comptes systèmes
$IGNORE_UID_BELOW = 1000;
$IGNORE_GID_BELOW = 1000;
$IGNORE_UID_ABOVE = 9999;
$IGNORE_GID_ABOVE = 9999;
# on commente la stuff kerberos
#if ($EXTENDED_SCHEMA) {
# $DEFAULT_REALM = $DEFAULT_MAIL_DOMAIN;
# $DEFAULT_REALM =~ tr/a-z/A-Z/;
#}
On commence la migration:
cd /usr/share/migrationtools ./migrate_passwd.pl /etc/passwd | grep -v 'objectClass: account' > /tmp/passwd.ldif ./migrate_group.pl /etc/group /tmp/group.ldif
Fichier /tmp/base.ldif pour créer les 2 branches dans l'annuaire (People et Group) :
dn: ou=People,dc=my,dc=home ou: People objectClass: top objectClass: organizationalUnit dn: ou=Group,dc=gcu-squad,dc=org ou: Group objectClass: top objectClass: organizationalUnit
Maintenant on colle tout ça dans le serveur LDAP :
ldapadd -D 'cn=admin, dc=my, dc=home' -c -x -W -f /tmp/base.ldif ldapadd -D 'cn=admin, dc=my, dc=home' -c -x -W -f /tmp/group.ldif ldapadd -D 'cn=admin, dc=my, dc=home' -c -x -W -f /tmp/passwd.ldif
Et voilà, votre annuaire est peuplé.
Vérifiez que les paramètres suffix et rootdn ont été correctement renseignés par debconf :
<snip> suffix "dc=gcu-squad,dc=org" rootdn "cn=admin,dc=gcu-squad,dc=org" </snip>
On vérifie aussi que les ACL sont correctes :
<snip>
access to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=gcu-squad,dc=org" write
by anonymous auth
by self write
access to dn.base="" by * read
access to *
by dn="cn=admin,dc=gcu-squad,dc=org" write
by * read
</snip>
Et voilà, /etc/init.d/slapd restart.
C'est super classe d'avoir un annuaire LDAP avec un tas de gens dedans, mais c'est encore mieux si on l'utilise. Nous allons donc configurer pam et nss pour utiliser LDAP à la place de de /etc/passwd (en fait, on va quand même garder /etc/passwd pour le root et les comptes système).
Nécéssaire à la connexion de pam et nss à ldap:
sudo aptitude install libnss-ldap libpam-ldap
Configuration de nss: vim /etc/libnss-ldap.conf
host ip.du.serveur.ldap base dc=gcu-squad,dc=org ldap_version 3 rootbinddn cn=admin,dc=gcu-squad,dc=org
ensuite vim /etc/nsswitch.conf
passwd: compat ldap group: compat ldap shadow: compat ldap hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis
Il faut mettre le mot de passe du compte admin ldap dans /etc/libnss-ldap.secret
# echo -n 'monpasskilestbien' > /etc/libnss-ldap.secret
N'UTILISEZ QUE ECHO -N ET NON UN ÉDITEUR DE TEXTE
En théorie, nss est configuré, supprimez de /etc/passwd un utilisateur qui a été importé dans la base LDAP, et faites
getent passwd
Si une ligne contient l'utilisateur, c'est bon, sinon, c'est que l'utilisateur a été mal importé dans l'annuaire ou qu'il y a un problème.
Il est possible que vous ayez à relancer les services qui ont mis en cache ce nsswitch.conf, du genre sshd.
Cette partie est valide pour debian en tout cas, pour les autres distributions je ne sais pas.
Votre fichier /etc/pam.d/common-account doit ressembler à ça :
account required pam_unix.so account sufficient pam_ldap.so
Et /etc/pam.d/common-auth :
auth required pam_unix.so nullok_secure auth sufficient pam_ldap.so use_first_pass
/etc/pam.d/common-password :
password sufficient pam_ldap.so password required pam_unix.so nullok obscure min=4 max=8 md5
Et voilà, reste à tester tout ça.
Les users ayant été dupliqués et non déplacés depuis /etc/passwd, il est important de supprimer de /etc/passwd l'utilisateur que vous voulez tester. N'utilisez pas vim /etc/passwd mais vipw, merci.
Une fois l'utilisateur supprimé, on essaie de se logger avec celui-ci :
john@gcu-squad.org:~$ su - mike Password: mike@gcu-squad.org:~$
Pour encore plus de fun voyez postfix_ldap.
TODO: ssl, auth ldap avec dovecot
Truc en clicka-convi pour ajouter des utilisateurs facilement. http://diradmin.open-it.org/
Tout petit bout de codaz en python avec le module ldap, ajoute un utilisateur système standard dans la base LDAP. Le code est très simple, à vous d'adapter selon vos besoins.