Installation et Utilisation de OpenLDAP sous Debian

Oussama Hammami, 2010-10-10

Switzernet

 

 

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 (ssh) basée sur LDAP pour Debian. 

 

Présentation rapide. 1

Préparation. 2

Modifier Hostname. 2

Mettre à jour le gestionnaire de paquets. 2

1 Serveur OpenLDAP.. 2

1.1 Installation des paquets. 2

1.2 Configuration du démon. 3

1.3 Quelques tests. 4

1.4 Création de l’annuaire. 5

2 Configuration des clients. 5

2.1 Authentification sur l’annuaire LDAP.. 6

NSS - Name Service Switch. 6

PAM - Pluggable Authentication Module. 7

Référence. 8

 

Présentation rapide

Une base LDAP est une base de données où les informations sont enregistrées de manière hiérarchique sous forme d’arbre et non sous forme tabulaire.

Une base LDAP est optimisée pour la lecture d’un nombre important de petits enregistrements et convient donc parfaitement pour stocker des annuaires ou des profils utilisateurs.

Le système LDAP utilise des schémas (/etc/ldap/schema) pour décrire des objets.

 

Chaque objet contient plusieurs attributs (obligatoires ou facultatifs). Et chaque objet peut hériter des attributs d’un autre objet. Exemple :

 L’objet « person » a comme attributs : commonName, surname,

 L’objet fils « organizationalPerson » dérivé de l’objet « person » ajoute les attributs : title, PostalAddress,…

 

Les objets et les attributs sont normalisés pour assurer les échanges entre les logiciels.

Chaque donnée enregistrée dans la base est identifiée par son DN (Distinguished Name). Ce DN est comparable au chemin complet d’un fichier. Exemple : dc=switzernet,dc=com

 

Pour ajouter ou modifier des données dans la base, il est possible d’utiliser le format LDIF.

Préparation

Ce document suppose que le serveur est déjà installé avec une Debian Etch propre.

Modifier Hostname

# hostname

ks34189.kimsufi.com

# hostname ldap.switzernet.com

 

 Ainsi, sur un système basé sur Debian, nous pouvons aussi éditer le fichier /etc/hostname et remplacez le nom du système, puis exécutez

 

# vi /etc/hostname

ldap.switzernet.com

 

# /etc/init.d/hostname.sh

# hostname

ldap.switzernet.com

Mettre à jour le gestionnaire de paquets

# aptitude update

1 Serveur OpenLDAP

1.1 Installation des paquets

L’implémentation LDAP la plus répandue actuellement dans le monde libre est OpenLDAP, disponible dans le paquet Debian "slapd". On peut également installer le paquet "ldap-utils" qui fournit quelques outils permettant de manipuler les annuaires.

 

# aptitude install slapd ldap-utils

 

Lors de la configuration de slapd, debconf demande simplement le mot de passe administrateur de l’annuaire. Il utilise ensuite le nom de domaine configuré sur la machine pour définir la racine de l’annuaire LDAP. Par exemple, si la machine locale s’appelle ldap.switzernet.com, debconf va construire une arborescence LDAP ayant pour racine dc=switzernet,dc=com.

 

Les fichiers de configurations se trouvent dans le répertoire "/etc/ldap/". On trouve, entre autre, le fichier slapd.conf qui est le fichier de configuration du démon et ldap.conf qui est le fichier de configuration pour les utilitaires installés précédemment avec le paquet ldap-utils.

 

La configuration initiale générée par debconf permet déjà de faire un premier test pour vérifier que le serveur fonctionne bien. On peut par exemple utiliser la commande slapcat qui va afficher le contenu de l’annuaire au format LDIF. Pour l’instant l’annuaire n’est pas très consistant, mais par la suite, il est préférable de re-diriger la sortie standard de slapcat dans less afin de pouvoir exploiter le résultat de la commande.

 

# slapcat | less

 

Notons que cette commande affiche un dump de l’annuaire sur la sortie standard en utilisant directement des fichiers de. Elle permet donc de visualiser le contenu de l’annuaire mais ne valide en aucun cas que le service fonctionne correctement. L’interrogation de l’annuaire en utilisant le protocole TCP dédié à cet effet avec la commande "ldapsearch" est décrite plus loin.

1.2 Configuration du démon

Avant de commencer à remplir et utiliser l’annuaire, il faut configurer une base et définir les droits d’accès. Toute cette configuration se fait dans slapd.conf. Ce fichier est divisé en plusieurs parties : d’abord une partie générale pour la configuration du démon puis une partie spécifique à chaque annuaire hébergé sur le serveur.

 

Dans un premier temps, il n’est pas nécessaire de faire de modifications dans la partie générale, debconf s’est chargé de faire une configuration minimale en fonction des réponses données lors de l’installation du paquet. On peut cependant examiner rapidement une section intéressante du fichier de configuration, la définition des ACLs :

 

access to attrs=userPassword

        by dn="cn=admin,dc=switzernet,dc=com " write

        by anonymous auth

        by self write

        by * none

 

access to dn.base="" by * read

 

access to *

        by dn="cn=admin,dc=switzernet,dc=com" write

        by * read

 

La configuration ci-dessus permet à l’administrateur d’éditer l’ensemble de l’annuaire alors que les utilisateurs anonymes peuvent simplement y accéder en lecture seule.

 

Cependant si on veut avoir l’accès root sur la base depuis un programme externe (ex : PHP), il faut ajouter manuellement le login de l’administrateur (admin avec le rappel de la racine) et son mot de passe :

 

rootdn   "cn=admin,dc=switzernet,dc=com"

rootpw   Your_Password # le mot de passe en clair

 

Pour plus de sécurité, il est préférable de générer un mot de passe crypté en utilisant la commande :

 

# slappasswd

New password:

Re-enter new password:

{SSHA}5y67xJ/t7esuGKUD7TQPcgykd8xiYMO2

 

Ensuite, il faut copier la chaîne cryptée à la place du mot de passe en clair

Il ne faut pas oublier de restarter le démon après chaque modification de son fichier de configuration (/etc/ldap/sldap.conf) avec la commande

# /etc/init.d/sldap restart

1.3 Quelques tests

Vérification de lancement du serveur :

# ps aux | grep ldap

openldap  6173  0.0  0.2 140424  5572 ?        Ssl  14:42   0:00 /usr/sbin/slapd -g openldap -u openldap -f /etc/ldap/slapd.conf

root     11731  0.0  0.0   3928   540 pts/0    S+   16:38   0:00 grep ldap

 

# netstat -autp | grep l[d]ap

tcp        0      0 *:ldap                  *:*                     LISTEN      6173/slapd

tcp6       0      0 [::]:ldap               [::]:*                  LISTEN      6173/slapd

 

L’annuaire est maintenant disponible sut le port 389 en TCP. Pour valider le bon fonctionnement du service, on peut interroger l’annuaire avec la commande ldapsearch fournie par le paquet ldap-utils installé précédemment. Par exemple, pour faire une requête LDAP :

 

# ldapsearch -x -H ldap://ldap.switzernet.com -b "cn=admin,dc=switzernet,dc=com" "(objectclass=*)"

 

Depuis n’importe quelle machine :

 

$ telnet ldap.switzernet.com 389

Trying 91.121.27.205...

Connected to ldap.switzernet.com.

Escape character is '^]'.

telnet> quit

Connection closed.

1.4 Création de l’annuaire

Addgroup.ldif

dn: cn=superGroup,dc=Switzernet,dc=com

objectClass: posixGroup

objectClass: top

cn: normalgroup

gidNumber: 1000

 

dn: cn=normalGroup,dc=Switzernet,dc=com

objectClass: posixGroup

objectClass: top

cn: normalgroup

gidNumber: 1001

 

Commande pour ajouter nos deux groups :

 

# ldapadd -x -D "cn=admin,dc=switzernet,dc=com" -w Your_Password -f Addgroup.ldif

 

Adduser.ldif

dn: cn=Oussama Hammami,dc=switzernet,dc=com

uid: oussama.hammami

objectClass: account

objectClass: posixAccount

objectClass: top

objectClass: shadowAccount

userPassword: 123456

loginShell: /bin/bash

uidNumber: 2000

gidNumber: 1000

homeDirectory: /home/oussama.hammami

host: mr1.switzernet.com

host: mr2.switzernet.com

host: astrad2.switzernet.com

 

Commande pour ajouter cet utilisateur :

 

# ldapadd -x -D "cn=admin,dc=switzernet,dc=com" -w Your_Password -f Adduser.ldif

 

Un petit test vite fait même si le message est positif

 

ldapsearch -x -b "dc=switzernet,dc=com" "objectclass=*"

2 Configuration des clients

Maintenant que l’annuaire est en place et qu’il contient un utilisateur, il faut configurer les clients qui souhaitent utiliser cet annuaire. Si l’annuaire a bien été conçu, il peut être utilisé pour beaucoup des fonctions différentes. La première étant l’authentification. L’avantage de LDAP est qu’on peut l’utiliser comme support d’authentification pour un grand nombre de services et avoir ainsi une base des utilisateurs centralisée.

2.1 Authentification sur l’annuaire LDAP

Actuellement, la plupart des applications utilisent une librairie pour obtenir des informations sur les utilisateurs et une autre pour réaliser leurs authentifications. La première tâche est confiée à NSS (Name Service Switch) qui se charge de fournir une liste des utilisateurs, des groupes, etc. L’authentification est par contre confiée à PAM (Pluggable Authentication Module) qui va alors vérifier la validité des identifiants et proposer différentes actions a exécuter lorsqu’un utilisateur s’authentifie.

 

Pour authentifier un utilisateur sur un annuaire LDAP, il faut donc ajouter le support LDAP à NSS et à PAM. Ceci est réalisé grâce aux deux librairies libnss-ldap et libpam-ldap.

 

Le système est maintenant capable de chercher des utilisateurs dans l’annuaire, il ne reste plus qu’à les authentifier par l’intermédiaire de PAM.

NSS - Name Service Switch

# aptitude install libnss-ldap

 

 

 

 

 

 

 

 

En premier lieu, on indique à NSS qu’il faut chercher les utilisateurs dans l’annuaire LDAP. Pour cela, il suffit d’éditer le fichier /etc/nsswitch.conf et de modifier les trois lignes ci-dessous. Notons qu’avec la configuration suivante, le système va d’abord utiliser les listes d’utilisateurs locales (/etc/passwd, /etc/group, ...) avant de chercher dans l’annuaire. Ceci permet d’utiliser les deux types de comptes simultanément et permet d’éviter les problèmes en cas d’indisponibilité du serveur LDAP.

 

/etc/nsswitch.conf

passwd: compat ldap

group:  compat ldap

shadow: compat ldap

 

Maintenant que NSS sait qu’il faut utiliser LDAP pour chercher les utilisateurs qui ne sont pas déclaré localement, il faut configurer le module libnss-ldap pour lui donner les paramètres du serveur LDAP à utiliser. Si vous avez répondu correctement aux questions de debconf, la configuration doit être opérationnelle. On peut cependant vérifier les trois lignes suivantes dans le fichier /etc/libnss-ldap.conf :

 

/etc/libnss-ldap.conf

base dc=switzernet,dc=com

uri ldap://ldap.switzernet.com

ldap_version 3

port 389

 

Si tout c’est passé correctement, on peut maintenant consulter les informations d’un utilisateur LDAP en exécutant la commande suivante :

 

getent passwd oussama.hammami

oussama.hammami:x:2000:1000:Oussama Hammami:/home/oussama.hammami:/bin/bash

 

Pour information, le paquet nscd a peut-être été installé en même temps que la librairie libnss-ldap. Ce paquet permet de mettre en cache les requêtes de NSS vers LDAP afin de minimiser la charge de l’annuaire. En conséquence, si de nombreuses modifications sont faites pendant la période de test du serveur, les résultats peuvent être erronés. Sur un système en production.

# /etc/init.d/nscd restart

PAM - Pluggable Authentication Module

# aptitude install libpam-ldap

 

Comme pour la librairie libnss-ldap, la configuration est normalement opérationnelle suite aux questions de debconf mais on peut toujours vérifier les éléments suivants dans le fichier /etc/pam_ldap.conf :

base dc=switzernet,dc=com

uri ldap://ldap.switzernet.com

ldap_version 3

port 389

pam_filter host=astrad2.switzernet.com

 

- configuration de /etc/ldap/ldap.conf

BASE dc=switzernet,dc=com

URI ldap://ldap.switzernet.com

 

- configuration de /etc/pam.d/common-auth

auth    sufficient      /lib/security/pam_ldap.so

auth    required        /lib/security/pam_unix_auth.so try_first_pass

 

- configuration de /etc/pam.d/common-session

session required        pam_mkhomedir.so skel=/etc/skel umask=0077

session required        pam_unix.so

 

- configuration de /etc/pam.d/common-account

account         sufficient      pam_ldap.so

account         required        pam_unix.so try_first_pass

 

- configuration de /etc/pam.d/common-password

password        sufficient      pam_ldap.so

password        required        pam_unix.so nullok obscure min=4 max=8 md5 try_first_pass

 

En principe, il est maintenant possible de s’authentifier correctement sur une machine cliente en utilisant un des utilisateurs créés dans l’annuaire. Il est également possible de modifier le mot de passe de chacun en utilisant la commande bien connue password : le mot de passe sera mis à jour directement dans l’annuaire.

 

3 Quelques outils

3.1 slapcat

L’utilitaire slapcat déjà été utilisé pour vérifier le contenu de l’annuaire dans cette page. Il peut également servir à générer un dump de l’annuaire pour réaliser des sauvegardes par exemple. La commande ci-dessous génère par exemple undump de l’annuaire et l’enregistre dans un fichier daté :

 

# slapcat > `date +ldap_dump_%Y%m%d_%H%M%S`

3.2 ldappasswd

Le mot de passe de l’administrateur LDAP renseigné lors de la configuration du paquet slapd est toujours modifiable en utilisant la commande suivante (en remplaçant "new_passwd" et "old_passwd" par les valeurs désirées) :

 

# ldappasswd -s new_passwd -D "cn=admin,dc=switzernet,dc=com" -w old_passwd -x cn=admin,dc=switzernet,dc=com

Notons que la commande ldappasswd est fournie pour le paquet ldap-utils.

3.3 ldapvi

Pour les adeptes de l’éditeur VI, il existe un outil très intéressant permettant d’éditer le contenu d’un annuaire LDAP avec VI : ldapvi. Il est disponible dans les dépôts officiels Debian dans le paquet du même nom :

 

# aptitude install ldapvi

 

Il est alors possible d’éditer l’annuaire sans être obliger de générer un fichier LDIF et d’utiliser les commandes ldapmodify ou ldapadd. Par exemple, pour éditer un annuaire avec un accès total, utilisez la commande suivante :

 

# ldapvi --discover --host ldap.switzernet.com --user "cn=admin,dc=switzernet,dc=com" --password "ldap_password"

 

Pour appliquer les modifications, il suffit de quitter VI avec la commande habituelle : ESC :wq.

Référence

Installation et Utilisation de OpenLDAP sous Debian

http://www.coagul.org/spip.php?article172

 

Serveur ssh avec authentification ldap

http://www.404blog.net/?p=38

 

LDAP Auth on Debian Sarge HOWTO

http://moduli.net/sysadmin/sarge-ldap-auth-howto.html

 

Authentification LDAP

http://damstux.free.fr/wiki/index.php?title=Authentification_LDAP

 

Mise en oeuvre de l'authentification système par LDAP

http://www.it-sudparis.eu/s2ia/user/procacci/ldap/Ldap_int010.html

 

How-To set up a LDAP server and its clients

http://www.debuntu.org/ldap-server-and-linux-ldap-clients-p2

 

LDAP authentication howto

http://iptables.gen.tr/2010/01/ldap-authentication-howto/

 

LDAPClientAuthentication

https://help.ubuntu.com/community/LDAPClientAuthentication

 

Serveur d'authentification basésur un annuaire LDAP

http://julp.developpez.com/freebsd/authentification-ldap/

 

Installation et configuration d’un serveur LDAP

http://blog.thelinuxfr.org/Installation-et-configuration-d-un.html

 

Tutoriel sur les serveurs

http://www.linux-france.org/prj/edu/archinet/systeme/index.html

 

Ldap Authentication on Debian

http://www.jukie.net/~bart/ldap/ldap-authentication-on-debian/

 

Installation d’un serveur d’annuaire OpenLDAP

http://aternatik.org/articles-et-ressources/ldap-17/Installation-d-un-serveur-d,051

 

LDAP pas à pas en 20 min

http://uid.free.fr/Ldap/ldap.html

 

Annuaire LDAP - MDS

http://www.vogelweith.com/debian_server/050_openldap.php