Authentification LDAP sur Debian Linux

(à part les aptitude install toussa, le howto fonctionne sûrement sur d'autres distributions, voir sur les BSD utilisant pam, comme FreeBSD ou NetBSD)

Introduction

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.

Saikoi ldappe?? ?

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)
 

A quoi ça sert ?

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.

Partie 1 - installation des trucs

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

Migrations des trucs depuis /etc/{passwd,group,shadow}

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

Configuration du truc ldap

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.

Mise en place des trucs dans les trucs de pam et nss

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

Installation d'autres trucs pour connecter les machins

Nécéssaire à la connexion de pam et nss à ldap:

sudo aptitude install libnss-ldap libpam-ldap

NSS

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.

pam

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.

Testage des trucs

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

Tools pour ajouter des trucs dans le truc ldap

directory-administrator

Truc en clicka-convi pour ajouter des utilisateurs facilement. http://diradmin.open-it.org/

LDAPadduser

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.

http://shound.org/~semial/codaz/ldapadduser.tgz

linux/auth_ldap.txt · Last modified: 2010/01/12 13:29 (external edit)