Serveur d'authentification basé
sur un annuaire LDAP
Date de publication : 08/08/2006 , Date de mise à jour : 17/10/2006
Par
julp (Autres articles)
LDAP permet la centralisation de l'authentification et ce quelque soit le service
proposé (ftp, ssh, boîte mail, ...). Outre l'avantage de la centralisation, les
utilisateurs ne possèdent qu'un seul mot de passe pour accéder à l'ensemble des
services qui leur sont offerts.
Cet article se limite à la mise en place de l'authentification système basée sur
LDAP pour des systèmes Linux et FreeBSD.
1. Mise en place du serveur LDAP
1.1. Installation d'OpenLDAP
1.2. Configuration du serveur LDAP
1.3. Configuration du client LDAP
1.4. Paramétrage du pare-feu
2. Configuration des clients
2.1. Définitions
2.1.1. PAM
2.1.2. NSS
2.2. Cas d'un client Linux
2.2.1. Installation des modules PAM et NSS
2.2.2. Configuration de PAM
2.2.2.1. Autoriser les utilisateurs LDAP à s'authentifier sur la machine
2.2.2.2. Autoriser les utilisateurs LDAP à utiliser SSH
2.2.3. Configuration de NSS
2.3. Cas d'un client FreeBSD
2.3.1. Installation des modules PAM et NSS
2.3.2. Configuration de PAM
2.3.2.1. Autoriser les utilisateurs LDAP à s'authentifier sur la machine
2.3.2.2. Autoriser les utilisateurs LDAP à utiliser SSH
2.3.3. Configuration de NSS
3. Phase de test
3.1. Le jeu de test
3.2. Démarrage du serveur LDAP
3.3. Test de l'authentification
4. Autoriser le changement de mot de passe avec la commande passwd
4.1. Modification de la configuration du serveur LDAP
4.2. Configuration des clients FreeBSD
4.3. Configuration des clients Linux
Remerciements
1. Mise en place du serveur LDAP
1.1. Installation d'OpenLDAP
Installation directe de l'annuaire, le système de ports s'occupera pour
nous des dépendances :
cd /usr/ports/net/openldap<version>-server
make install
ln -s /usr/local/etc/openldap/ldap.conf /usr/local/etc/ldap.conf
ln -s /usr/local/etc/openldap/ldap.conf /etc/ldap.conf
|
 |
Prenez dans la mesure du possible la dernière version disponible.
|
1.2. Configuration du serveur LDAP
Pour plus de commodités, nous allons démarrer le serveur LDAP au
démarrage de la machine. Pour cela rajouter les lignes ci-dessous
dans votre fichier /etc/rc.conf :
slapd_enable="YES"
slapd_flags="-h ldap://<votre adresse IP réseau>"
|
Vous trouverez ci-dessous le fichier de configuration du serveur LDAP
(/usr/local/etc/openldap/slapd.conf) commenté. Nous supposerons
que la racine du serveur LDAP est dc=developpez,dc=com.
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
access to attr=userPassword
by dn="cn=manager,dc=developpez,dc=com" write
by dn="cn=proxyuser,dc=developpez,dc=com" read
by self write
by anonymous auth
by * none
access to attrs=uidNumber,gidNumber
by dn="cn=manager,dc=developpez,dc=com" write
by dn="cn=proxyuser,dc=developpez,dc=com" read
by * read
access to *
by dn="cn=manager,dc=developpez,dc=com" write
by self write
by * read
database bdb
suffix "dc=developpez,dc=com"
rootdn "cn=manager,dc=developpez,dc=com"
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
directory /var/db/openldap-data
index objectClass eq
index cn,sn,uid,displayName pres,sub,eq
index uidNumber,gidNumber eq
|
1.3. Configuration du client LDAP
Cette étape n'est en rien vitale au bon fonctionnement de l'annuaire
mais elle vous permettra d'écrire des lignes de commandes plus courtes
lorsque vous devrez vérifier le bon fonctionnement de l'annuaire ou bien
effectuer des tâches administratives. En effet, le fichier /usr/local/etc/openldap/ldap.conf
permet de spécifier des valeurs par défaut :
base dc=developpez,dc=com
uri ldap://127.0.0.1/
ldap_version 3
|
1.4. Paramétrage du pare-feu
Les ports utilisés par défaut par LDAP sont :
- le port 636 pour les connexions (tcp) SSL (protocole LDAPS)
- le port 389 pour les connexions (tcp) non sécurisées ou sécurisées utilisant TLS (protocole LDAP)
Pour les utilisateurs de pf qui veulent autoriser les requêtes LDAP
et LDAPS entrantes, voici la règle à rajouter :
int_net = "192.168.100.0/24"
tcpflags = "flags S/SFRA"
int_if = "sis0"
pass in quick on $int_if proto tcp from $int_net to $int_if port { ldap ldaps } $tcpflags keep state
|
2. Configuration des clients
2.1. Définitions
2.1.1. PAM
Pluggable Authentication Modules (en français :
modules d'authentification enfichables) est un mécanisme
d'authentification flexible, permettant par le biais de modules,
de définir des stratégies et de proposer différents médias comme
sources pour l'identification des utilisateurs (bases de données,
annuaire, clé USB, …). L'administrateur système n'est plus ainsi
limité aux fichiers /etc/passwd et /etc/shadow. L'authentification
via PAM ne concerne pas seulement l'accès au système mais tout
service que la machine héberge.
2.1.2. NSS
Name Service Switch (en français : commutateur
de services de nommages), permet de fournir à Linux/Unix non pas
des services d'authentification, mais des services de correspondances
entre noms, de toutes sortes (noms de machines, utilisateurs, groupes,
…), et les identifiants de ces mêmes objets pour la machine
(respectivement adresses IP, uid, gid dans l'exemple précédent).
NSS, fonctionne de manière similaire à PAM, c'est-à-dire sur la base
de modules.
2.2. Cas d'un client Linux
2.2.1. Installation des modules PAM et NSS
Le gestionnaire de paquets étant spécifique à chaque distribution,
je vous laisse donc le soin de trouver et installer les paquets
nommés pam_ldap et nss_ldap (openldap-client fera
partie des dépendances).
 |
La distribution dont sont tirés les fichiers de configuration est une
Mandriva (versions 9.0 et 2006).
|
2.2.2. Configuration de PAM
2.2.2.1. Autoriser les utilisateurs LDAP à s'authentifier sur la machine
Pour cela modifions /etc/pam.d/system-auth comme suit :
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_ldap.so
password required pam_cracklib.so retry=3 minlen=2 dcredit=0 ucredit=0
password sufficient pam_unix.so nullok use_authtok md5 shadow
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so
|
2.2.2.2. Autoriser les utilisateurs LDAP à utiliser SSH
Il suffit de modifier la configuration de ssh (fichier
/etc/ssh/sshd_config) pour rendre l'accès à SSH possible
du fait que le module PAM sshd inclus system-auth :
Puis redémarrez le démon sshd ou envoyez lui le signal HUP (1).
2.2.3. Configuration de NSS
Indiquons au système qu'il doit consulter l'annuaire pour trouver
les comptes utilisateur après toutefois avoir d'abord regardé dans
les fichiers. Pour cela, modifions /etc/nsswitch.conf pour
qu'il soit configuré ainsi :
hosts: files dns
networks: files
protocols: files
ethers: files
rpc: files
netmasks: files
bootparams: files
services: files
passwd: files ldap
group: files ldap
shadow: files ldap
netgroup: files
|
Pour éviter toute confusion, et parce que le fichier de configuration
du client LDAP et celui de NSS sont très proches, nous allons les lier :
mv /etc/openldap/ldap.conf /etc/openldap/ldap.conf.bak
ln -s /etc/ldap.conf /etc/openldap/ldap.conf
|
Nous pouvons maintenant préciser à quel emplacement précis le système
peut trouver les données relatives aux utilisateurs et groupes. Pour
cela éditez /etc/ldap.conf :
base dc=developpez,dc=com
uri ldap://votre adresse IP réseau ou nom la de machine (résolution par DNS ou /etc/hosts)/
ldap_version 3
rootbinddn cn=proxyuser,dc=developpez,dc=com
pam_password MD5
nss_base_passwd ou=Utilisateurs,dc=developpez,dc=com?one
nss_base_shadow ou=Utilisateurs,dc=developpez,dc=com?one
nss_base_group ou=Groupes,dc=developpez,dc=com?one
|
L'utilisateur cn=proxyuser,dc=developpez,dc=com va permettre aux
machines clientes de se connecter à votre annuaire afin de vérifier
que l'utilisateur qui s'y connecte fourni un couple, login et mot
de passe, valide. Afin de protéger les mots de passe stockés dans
l'annuaire, bien qu'ils soient hashés, ceux-ci ne seront lisibles
qu'à un nombre restreint d'utilisateurs, dont il fait partie. Ce
compte est protégé par un mot de passe définit à 'proxy'
pour l'exemple. Cependant, il va falloir le fournir pour que NSS
procède aux vérifications :
echo "proxy" > /etc/ldap.secret
chmod u=rw,go= /etc/ldap.secret
|
2.3. Cas d'un client FreeBSD
2.3.1. Installation des modules PAM et NSS
Une fois de plus l'installation se fait simplement avec le
système de ports :
cd /usr/ports/security/pam_ldap
make install
cd /usr/ports/net/nss_ldap
make install
|
2.3.2. Configuration de PAM
2.3.2.1. Autoriser les utilisateurs LDAP à s'authentifier sur la machine
Pour les accès locaux, il nous faut modifier quelque peu /etc/pam.d/system :
auth sufficient pam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
auth sufficient /usr/local/lib/pam_ldap.so no_warn try_first_pass
auth required pam_unix.so no_warn try_first_pass nullok
account sufficient /usr/local/lib/pam_ldap.so
account required pam_login_access.so
account required pam_unix.so
session required pam_lastlog.so no_fail
password sufficient /usr/local/lib/pam_ldap.so no_warn try_first_pass
password required pam_unix.so no_warn try_first_pass
|
2.3.2.2. Autoriser les utilisateurs LDAP à utiliser SSH
En ce qui concerne SSH, ça se passe dans /etc/pam.d/sshd :
auth required pam_nologin.so no_warn
auth sufficient pam_opie.so no_warn no_fake_prompts
auth requisite pam_opieaccess.so no_warn allow_local
auth sufficient /usr/local/lib/pam_ldap.so no_warn
auth required pam_unix.so no_warn try_first_pass
account required pam_login_access.so
account required pam_unix.so
session required pam_permit.so
password required pam_unix.so no_warn try_first_pass
|
2.3.3. Configuration de NSS
 |
D'un client Linux à un client FreeBSD peu de choses changent pour la
configuration de NSS. Les seules modifications à apporter concernent
les chemins des fichiers de configuration.
|
Pour indiquer au système de consulter l'annuaire pour trouver les
comptes utilisateur après avoir chercher dans les fichiers, nous
modifions /etc/nsswitch.conf ainsi :
hosts: files dns
networks: files
protocols: files
ethers: files
rpc: files
netmasks: files
bootparams: files
services: files
passwd: files ldap
group: files ldap
shadow: files ldap
netgroup: files
|
Les fichiers de configuration du client LDAP et de NSS étant
sensiblement identiques, nous allons les lier pour qu'ils soient plus
faciles à maintenir :
mv /usr/local/etc/nss_ldap.conf /usr/local/etc/nss_ldap.conf.bak
ln -s /usr/local/etc/ldap.conf /usr/local/etc/nss_ldap.conf
|
Editons /usr/local/etc/ldap.conf afin de préciser à quel
emplacement précis le système pourra trouver les données relatives
aux utilisateurs et groupes dans l'annuaire.
base dc=developpez,dc=com
uri ldap://votre adresse IP réseau ou nom la de machine (résolution par DNS ou /etc/hosts)/
ldap_version 3
rootbinddn cn=proxyuser,dc=developpez,dc=com
pam_password MD5
nss_base_passwd ou=Utilisateurs,dc=developpez,dc=com?one
nss_base_shadow ou=Utilisateurs,dc=developpez,dc=com?one
nss_base_group ou=Groupes,dc=developpez,dc=com?one
|
La machine cliente aura recours à l'utilisateur LDAP nommé
cn=proxyuser,dc=developpez,dc=com afin de vérifier que la personne
qui s'authentifie sur ce système fourni un couple, login et mot de
passe, valide. Ce compte nécessitant un mot de passe (valeur
'proxy' dans cet exemple) pour pouvoir consulter l'annuaire,
il faut le fournir à NSS pour qu'il puisse procéder aux vérifications :
echo "proxy" > /usr/local/etc/ldap.secret
chmod u=rw,go= /usr/local/etc/ldap.secret
|
3. Phase de test
3.1. Le jeu de test
dn: dc=developpez,dc=com
dc: developpez
objectclass: top
objectclass: domain
objectclass: domainRelatedObject
description: Mon annuaire
associatedDomain: developpez.com
structuralObjectClass: domain
dn: ou=Utilisateurs,dc=developpez,dc=com
objectclass: top
objectclass: organizationalUnit
ou: Utilisateurs
description: Les utilisateurs
structuralObjectClass: organizationalUnit
dn: ou=Groupes,dc=developpez,dc=com
objectclass: top
objectclass: organizationalUnit
ou: Groupes
description: Les groupes
structuralObjectClass: organizationalUnit
dn: cn=Patrick Poivre d'Arvor,ou=Utilisateurs,dc=developpez,dc=com
cn: Patrick Poivre d'Arvor
sn: ppda
objectclass: top
objectclass: person
objectclass: posixAccount
objectclass: shadowAccount
uid: ppda
uidnumber: 2000
gidnumber: 2000
gecos: Patrick Poivre d'Arvor
loginShell: /bin/csh
homeDirectory: /home/ppda
userpassword: {MD5}tcIIRTe2hjtHpCz0Usaupw==
dn: cn=LdapUsers,ou=Groupes,dc=developpez,dc=com
objectclass: top
objectclass: posixGroup
gidNumber: 2000
cn: LdapUsers
memberUid: ppda
dn: cn=proxyuser,dc=developpez,dc=com
objectClass: top
objectClass: person
cn: proxyuser
sn: proxyuser
userPassword: {MD5}QxOH63Ji4c/HmxJeuKZ8YA==
|
Pour ajouter ce jeu de test (qui serait ici stocké dans un fichier
sous le nom de test.ldif), voici la commande à taper (à exécuter sur
la machine hébergeant le serveur LDAP) :
3.2. Démarrage du serveur LDAP
L'ultime étape avant le démarrage du serveur LDAP afin d'assurer son
bon fonctionnement est de modifier le propriétaire des fichiers où
sont stockées les données. Le dossier correspondant est désigné par
directory (valeur par défaut : /var/db/openldap-data)
dans votre fichier /usr/local/etc/openldap/slapd.conf. Voici
donc la commande à exécuter :
chown -R ldap:ldap /var/db/openldap-data
|
Tout est désormais prêt pour le démarrage du serveur LDAP :
/usr/local/etc/rc.d/slapd.sh start
|
3.3. Test de l'authentification
Afin de vérifier que le tout fonctionne, essayez tout d'abord de vous
loguer en tant que "ppda" sur une console virtuelle, par un
su - ppda ou encore avec la commande id ppda à partir
d'une de vos machines clientes.
4. Autoriser le changement de mot de passe avec la commande passwd
4.1. Modification de la configuration du serveur LDAP
Concernant l'annuaire il faut donner à l'utilisateur
cn=proxyuser,dc=developpez,dc=com les droits d'écriture sur les
attributs userPassword. Il faut alors changer l'ACL suivante dans
le fichier de configuration de l'annuaire
(/usr/local/etc/openldap/slapd.conf) :
access to attr=userPassword
by dn="cn=manager,dc=developpez,dc=com" write
by dn="cn=proxyuser,dc=developpez,dc=com" read
by self write
by anonymous auth
by * none
|
En :
access to attr=userPassword
by dn="cn=manager,dc=developpez,dc=com" write
by dn="cn=proxyuser,dc=developpez,dc=com" write
by self write
by anonymous auth
by * none
|
4.2. Configuration des clients FreeBSD
Par défaut, le programme passwd refuse le changement de mot de passe
par l'utilisation de modules PAM. Pour changer ce comportement, nous
devons en modifier quelque peu sa source. Pour cela, éditez
/usr/src/usr.bin/passwd/passwd.c afin de changer :
errx(1,
"Sorry, `passwd' can only change passwords for local or NIS users.");
|
En :
fprintf(stderr, "Now you can change password via PAM\n");
|
Puis recompiler le programme passwd :
Enfin modifions /etc/pam.d/passwd tel que :
password sufficient pam_unix.so no_warn try_first_pass nullok
password sufficient /usr/local/lib/pam_ldap.so use_first_pass
|
4.3. Configuration des clients Linux
Aucune modification supplémentaire à apporter.
Remerciements
Je remercie
Katyucha pour sa relecture attentive.


Copyright © 2006 julp. Aucune reproduction, même partielle, ne peut être faite
de ce site et de l'ensemble de son contenu : textes, documents, images, etc
sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.