Annuaire LDAP avec OpenLDAP

Écrit par Alexandre Dos Reis
Créé le 2020-9-8, modifié le 2021-5-30.
OpenLDAP Version 2.4 - OpenLDAP Public Licence version 2.8 - Documentation

I. Présentation

LDAP pour Lightweight Directory Access Protocol est un annuaire qui executé au dessus de la couche TCP/IP. LDAP est devenu une norme pour les systèmes d’annuaire, incluant un modèle de données, un modèle de nommage, un modèle fonctionnel basé sur le protocole LDAP, un modèle de sécurité et un modèle de réplication. C'est une structure arborescente dont chacun des nœuds est constitué d'attributs associés à leurs valeurs. LDAP fournit un méchanisme pour connecter, rechercher et modifier les annuaires multi-réseaux.

Le nommage des éléments constituant l'arbre (racine, branches, feuilles) reflète souvent le modèle politique, géographique ou d'organisation de la structure représentée. La tendance actuelle est d'utiliser le nommage DNS pour les éléments de base de l'annuaire (racine et premières branches, domain components ou DC). Les branches plus profondes de l'annuaire peuvent représenter des unités d'organisation ou des groupes (organizational units ou OU), des personnes (common name ou CN voir user identifier UID). L'assemblage de tous les composants (du plus précis au plus général) d'un nom forme son distinguished name.

LDAP utilise l’approche orienté objet ce qui implique de définir l’objet, la classe et le mécanisme d’héritage.

Un client commence une session LDAP en se connectant sur le port TCP 389 du serveur.

a. Distinguished Name

L'api LDAP référence un objet LDAP par son distinguished name (ou DN). Un DN est une séquence de DN relatifs (ou RDN) connectés par des virgules.

Un RDN est un attribut associé à une valeur de la forme attribute=value, habituellement exprimé dans une chaine de charactère UTF-8. Le tableau suivant liste les différents attributs RDN et leur type :

Type d'attributChaîne de caractère
domainComponentDC
commonNameCN
organizationalUnitNameOU
organizationNameO
streetAddressSTREET
localityNameL
stateOrProvinceNameST
countryNameC
useridUID

Voici quelques exemples de Distinguished Name :

CN=François Deloffre,OU=Marketing,DC=WholesaleSystem,DC=COM
CN=Roselyne Bourcier,CN=admin,DC=corp,DC=WholesaleSystem,DC=COM

On remarque sur les 2 derniers DC tirent leur nom du nom de domaine de l'entreprise, ici wholesalesystem.com.

II. Scénario

Dans notre exemple, nous allons créer pour la société Rézo le domaine rezo.home avec un utilisateur nommé Jean Aimard ainsi qu'un administrateur LDAP nommé admin.

# organization for Rezo
dn: dc=rezo,dc=home
objectClass: dcObject
objectClass: organization
dc: rezo
o: Rezo
    dc=home            
        |            
    dc=rezo        
    /     \        
cn=admin    ou=posixaccounts    
                    \    
                    uid=jean.aimard

III. Topologie

MachineOSDistributionVersionRôleNom d'hôteIP
VM Virtual BoxGNU / LinuxDebian10.5Serveur LDAPldap172.16.150.20
VM Virtual BoxGNU / LinuxDebian10.5Client LDAPclientldap172.16.150.21

IV. Le daemon slapd - Serveur OpenLDAP

a. Configuration du nom d'hôte

Sur une nouvelle machine Debian, modifier les noms d’hôte dans les fichiers suivants :

/etc/hostname

ldap-server

/etc/hosts

127.0.0.1       localhost
127.0.1.1       ldap    ldap.rezo.home
172.16.150.20   ldap    ldap.rezo.home

b. Installation du paquet slapd

Cette commande permet d’éviter la configuration de slapd que l’on effectuera plus tard :

$
DEBIAN_FRONTEND=noninteractive apt -y install slapd

Les fichiers de la base de données sont situés dans ce dossier : /var/lib/ldap. À noter que ce dossier appartient à l’utilisateur openldap.

c. Configuration OpenLDAP

Éditer le fichier : /etc/ldap/ldap.conf

BASE dc=rezo,dc=home
URI ldap://ldap.rezo.home

# ou par l’ip directement, comme ceci :
# URI ldap://172.16.150.20

On execute la configuration de slapd qui avait été évitée lors de l’installation avec la commande suivante :

$
dpkg-reconfigure slapd

Voici la vidéo de la configuration slapd, on choisi le nom DNS, le nom de l'organisation, le mot de passe adminstrateur LDAP et la base de donnée :

d. Test du serveur LDAP

On active le daemon slapd au démarrage du serveur :

$
sudo systemctl enable slapd

On démarre slapd :

$
sudo systemctl start slapd

On vérifie que slapd écoute sur le port 389 par défaut, avec la commande suivante :

$
ss -lntpa
State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port
LISTEN   0        128              0.0.0.0:389            0.0.0.0:*       users:(("slapd",pid=458,fd=8))
ESTAB    0        0          172.16.150.20:389      172.16.150.21:43768   users:(("slapd",pid=458,fd=12))

e. Peuplement de l'annuaire

On installe un paquet utilitaire pou effectuer des commandes liées au service LDAP :

$
apt install ldap-utils

A l'aide d'un fichier ldif, on crée deux unités d'organisations ou OU puis un compte système avec son groupe primaire, le fichier s'appelera ou.ldid :

$
touch ou.ldif
dn: ou=posixaccounts,dc=rezo,dc=home
objectclass: OrganizationalUnit

dn: ou=posixgroups,dc=rezo,dc=home
objectclass: OrganizationalUnit

Ce fichier contient deux OU : posixaccounts (comptes Unix) et posixgroups (groupes Unix). L'objet OU contient deux attributs : le DN et l'objectclass qui indique que l'objet à ajouter est de type OrganizationalUnit. Les objectclass sont définis dans les schémas.

On ajoute les OrganizationalUnit dans l'annuaire :

$
ldapadd -x -H ldap://ldap.rezo.home -D 'cn=admin,dc=rezo,dc=home' -f ou.ldif -W

f. Vérification de l'entrée

On vérifie que cela a bien été prise en compte avec la commande ldapsearch permis par le paquet ldaputils :

$
ldapsearch -xLLL
dn: dc=rezo,dc=home
objectClass: top
objectClass: dcObject
objectClass: organization
o: rezo.home
dc: rezo

dn: cn=admin,dc=rezo,dc=home
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

dn: ou=posixaccounts,dc=rezo,dc=home
objectClass: organizationalUnit
ou: posixaccounts

dn: ou=posixgroups,dc=rezo,dc=home
objectClass: organizationalUnit
ou: posixgroups

V. Administration du serveur LDAP

Pour administrer ou simplement consulter des serveurs LDAP, il est préférable d'utiliser un navigateur LDAP, bien plus agréable visuellement parlant qu’en mode texte et ne nécessitant pas de rentrer des commandes LDAP trop longues et trop complexes.

Ainsi, l'application Apache Directory Studio est un navigateur LDAP issu de la communauté libre, disponible sur plusieurs OS (Mac, Linux et Windows), s’appuyant sur Java. Voici le lien du site officiel : directory.apache.org/studio

Mais d'autres solutions existent comme FusionDirectory développée par une équipe française, voici le site : fusiondirectory.org

VI. Apache Directory

Apache Directory Studio - Version 2.0.0 - Licensed under the Apache License, version 2.0.

a. Connexion à l'annuaire

Après avoir installer l'application depuis ce lien. Il faut configurer la connexion au serveur LDAP comme ceci :

Connexion à une annuaire LDAP

L'authentification fait référence au compte de l'administrateur LDAP qui a été configuré lors de l'installation OpenLDAP :

Connexion à une annuaire LDAP

b. Création d'un utilisateur

A gauche dans le navigateur LDAP, nous retrouvons ce que nous avons créé précédemment :

Connexion à une annuaire LDAP

Sur OU=posixaccounts, effectuer un clic-droit puis nouveau et nouvelle entrée puis Créer l'entrée à partir de zéro.

Ajouter les classes suivantes : InetOrgPerson, organizationalPerson, Person, posixAccount et top.

Pour le RDN, sélectionner uid et taper le nom de la personne séparé par un point : jean.aimard. Ensuite, il faut remplir les classes précédemment créés :

Description d'attributValeur
homeDirectory/home/jean.aimard
commonName ou cnjean.aimard
gidNumber2001
snjeana
uidNumber2001

Puis Terminer.

On réexecute la même chose pour l'OU posixgroups. Ajout des classes suivantes : posixGroup et top.

Pour le Relative Distinguished Name ou RDN, entrer jean.aimard. Il devrait manquer uniquement le gidNumber :

Description d'attributValeur
commonName ou cnjean.aimard
gidNumber2001

c. Vérifier la création de l'utilisateur

Maintenant qu'un utilisateur a été créé, sur le serveur ldap on devrait pouvoir retrouver l'entrée correspondante avec la même commande que précédemment :

$
ldapsearch -xLLL
dn: dc=rezo,dc=home
objectClass: top
objectClass: dcObject
objectClass: organization
o: rezo.home
dc: rezo

dn: cn=admin,dc=rezo,dc=home
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

dn: ou=posixaccounts,dc=rezo,dc=home
objectClass: organizationalUnit
ou: posixaccounts

dn: ou=posixgroups,dc=rezo,dc=home
objectClass: organizationalUnit
ou: posixgroups

dn: uid=jean.aimard,ou=posixaccounts,dc=rezo,dc=home
uid: jean.aimard
uidNumber: 2001
gecos: etudiant RT
mail: jean.aimard@rezo.home
homeDirectory: /home/jean.aimard
gidNumber: 2001
cn: jean.aimard
sn: jean.aimard
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
objectClass: posixAccount
loginShell: /bin/bash

dn: cn=jean.aimard,ou=posixgroups,dc=rezo,dc=home
gidNumber: 2001
cn: jean.aimard
objectClass: posixGroup
objectClass: top