Vous êtes sur la page 1sur 23

Introduction aux annuaires LDAP avec OpenLDAP

Philippe Latu
philippe.latu(at)inetdoc.net
https://www.inetdoc.net

Résumé

Dans ce support de travaux pratiques, on explore le service


d'annuaire LDAP. On présente succinctement les éléments
constitutifs d'un annuaire puis on étudie la configuration d'un
service d'annuaire basé sur le logiciel OpenLDAP. Ensuite, on
étudie la configuration de l'accès aux entrées de l'annuaire depuis
un poste client. Les informations délivrées par l'annuaire sont les
propriétés de comptes utilisateurs stockées dans la classe d'objet
posixAccount.

Table des matières


1. Copyright et Licence .......................................................................................................................... 1
2. Principes d'un annuaire LDAP ........................................................................................................... 2
3. Configuration du serveur LDAP ......................................................................................................... 3
3.1. Installation du serveur LDAP ................................................................................................. 3
3.2. Analyse de la configuration du service LDAP ........................................................................ 5
3.3. Réinitialisation de la base de l'annuaire LDAP ...................................................................... 7
3.4. Composition d'un nouvel annuaire LDAP ............................................................................... 9
4. Configuration de l'accès client au serveur LDAP ............................................................................ 14
4.1. Interrogation à distance de l'annuaire LDAP ....................................................................... 14
4.2. Configuration Name Service Switch ..................................................................................... 15
5. Accès à l'annuaire LDAP depuis un service web ............................................................................ 20
6. Documents de référence ................................................................................................................. 23

1. Copyright et Licence
Copyright (c) 2000,2022 Philippe Latu.
Permission is granted to copy, distribute and/or modify this document under the
terms of the GNU Free Documentation License, Version 1.3 or any later version
published by the Free Software Foundation; with no Invariant Sections, no
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included
in the section entitled "GNU Free Documentation License".

Copyright (c) 2000,2022 Philippe Latu.


Permission est accordée de copier, distribuer et/ou modifier ce document selon
les termes de la Licence de Documentation Libre GNU (GNU Free Documentation
License), version 1.3 ou toute version ultérieure publiée par la Free Software
Foundation ; sans Sections Invariables ; sans Texte de Première de Couverture,
et sans Texte de Quatrième de Couverture. Une copie de la présente Licence est
incluse dans la section intitulée « Licence de Documentation Libre GNU ».

Méta-information
Ce document est écrit avec DocBook XML sur un système Debian GNU/Linux. Il est disponible en version
imprimable au format PDF : sysadm-net.ldap.qa.pdf.

Conventions typographiques
Tous les exemples d'exécution des commandes sont précédés d'une invite utilisateur ou prompt
spécifique au niveau des droits utilisateurs nécessaires sur le système.

• Toute commande précédée de l'invite $ ne nécessite aucun privilège particulier et peut être utilisée
au niveau utilisateur simple.

Introduction aux annuaires LDAP avec OpenLDAP page 1 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

• Toute commande précédée de l'invite # nécessite les privilèges du super-utilisateur.

2. Principes d'un annuaire LDAP


Dans l'histoire des systèmes Unix, les services de nommage ont connu de nombreuses évolutions avec
le développement de l'Internet et des volumes d'informations à partager.
Au début des années 80, un premier service baptisé Network Information Service (NIS) a vu le jour.
Ce service est une méthode de distribution de la base de données des utilisateurs, de fichiers de
configuration, d'authentification et d'autres données entre les hôtes d'un réseau local. Le logiciel
NIS développé par Sun Microsystems™ fonctionne sur le mode Client/Serveur à partir d'une base
de données «à plat» (flat bindery base). Son utilisation est étudiée dans le support de travaux
pratiques Introduction au service NIS. Avec un service NIS, il n'est pas possible de constituer des
groupes logiques ayant des attributs propres. Cette limitation est rapidement devenue critique avec
l'augmentation du nombres des utilisateurs et des clients.
D'autres services plus complets tels que NIS+ ou kerberos qui n'assure que la partie authentification
ont été développés par la suite. Depuis quelques années, les annuaires LDAP ou Lightweight Directory
Access Protocol se sont imposés comme étant l'outil d'échange universel des paramètres utilisateurs.
Pour définir ce qu'est le service LDAP, on peut retenir les caractéristiques suivantes.

• Un service de publication d'annuaire

• Un protocole d'accès aux annuaires de type X.500 ou Lightweight Directory Access Protocol

• Un dépôt de données basées sur des attributs ou un «genre» de base de données

• Un logiciel optimisé pour les recherches avancées et les lectures

• Une implémentation client/serveur

• Un mécanisme extensible de schémas de description de classes d'objets

Les entrées (Directory Service Entry) d'un annuaire LDAP sont distribuées suivant une arborescence
(Directory Information Tree) hiérarchisée que l'on peut voir comme un système de fichiers avec
ses répertoires et ses fichiers. Au sommet de l'arborescence on trouve un nom de racine (Domain
Component) ou suffixe.

Arborescence LDAP élémentaire - vue complète


L'adresse d'une entrée de l'annuaire LDAP est appelée : distinguished name ou dn. En reprenant
l'exemple d'arborescence ci-dessus, les adresses des différentes entrées sont notées comme suit.

• dn: dc=lab,dc=stri

• dn: ou=lab1,dc=lab,dc=stri

dn: ou=lab2,dc=lab,dc=stri

• dn: cn=etu1,ou=lab1,dc=lab,dc=stri

Introduction aux annuaires LDAP avec OpenLDAP page 2 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

dn: cn=etu2,ou=lab1,dc=lab,dc=stri

dn: cn=etu3,ou=lab2,dc=lab,dc=stri

dn: cn=etu4,ou=lab2,dc=lab,dc=stri

L'adresse de chaque entrée appartient à une classe d'objet (ObjectClass) spécifiée dans un schéma
(schema). En reprenant les mêmes exemples d'entrées, on peut associer les classes d'objets
correspondantes.

entry objectclass
o: lab.stri organisation

dc: lab dcObject

dc: stri dcObject

ou: lab1 organisationalUnit

cn: etu1 inetOrgPerson

sn: etu1

Un schéma peut être vu comme un ensemble de règles qui décrivent la nature des données stockées.
C'est un outil qui aide à maintenir la cohérence, la qualité et qui évite la duplication des données dans
l'annuaire. Les attributs des classes d'objets déterminent les règles qui doivent être appliquées à une
entrée. Un schéma contient les éléments suivants.

• Les attributs requis

• Les attributs autorisés

• Les règles de comparaison des attributs

• Les valeurs limites qu'un attribut peut recevoir

• Les restrictions sur les informations qui peuvent être enregistrées

3. Configuration du serveur LDAP


Avant d'aborder la configuration du service LDAP, il faut passer par les étapes rituelles de sélection
et d'installation des paquets contenant les outils logiciels du service. Ensuite, il faut identifier les
processus, les numéros de ports ouverts et les fichiers de configuration à éditer.

3.1. Installation du serveur LDAP

Q1. Quels sont les paquets Debian relatifs au service LDAP ?


Interroger la base de données des paquets pour obtenir les informations demandées.

Dans la requête ci-dessous, on privilégie la recherche dans les champs de description des
paquets.

Introduction aux annuaires LDAP avec OpenLDAP page 3 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

$ aptitude search '?description(OpenLDAP)'


p collectd-core - démon de statistiques et surveillance – système central
p golang-openldap-dev - OpenLDAP client integration for Go, using cgo
p ldap-git-backup - Back up LDAP database in an Git repository
p ldap-utils - OpenLDAP utilities
p ldapscripts - Add and remove users and groups (stored in a LDAP directory)
p libdbd-ldap-perl - Perl extension for LDAP access via an SQL/Perl DBI interface
i A libldap-2.4-2 - Bibliothèques OpenLDAP
i A libldap-common - fichiers communs OpenLDAP pour les bibliothèques
p libldap2-dev - bibliothèques de développement pour OpenLDAP
p liblmdb-dev - Lightning Memory-Mapped Database development files
p liblmdb0 - Lightning Memory-Mapped Database shared library
p libmozilla-ldap-perl - LDAP Perl module for the OpenLDAP C SDK
p libnet-ldapapi-perl - Perl bindings for OpenLDAP C API
p libsasl2-modules-ldap - Cyrus SASL - pluggable authentication modules (LDAP)
p lmdb-doc - Lightning Memory-Mapped Database doxygen documentation
p lmdb-utils - Lightning Memory-Mapped Database Utilities
p lua-ldap - LDAP library for the Lua language
p python-django-python3-ldap - Django LDAP user authentication backend (Python2 version)
p python-ldap - LDAP interface module for Python
p python-ldap-dbg - LDAP interface module for Python (debug extension)
p python-lmdb - Python binding for LMDB Lightning Memory-Mapped Database
p python-pyldap - implements an LDAP client - Python 2.7
p python-pyldap-doc - implements an LDAP client - doc
p python3-django-python3-ldap - Django LDAP user authentication backend (Python3 version)
p python3-lmdb - Python 3 binding for LMDB Lightning Memory-Mapped Database
p python3-pyldap - implements an LDAP client - Python 3.x
p ruby-ldap - OpenLDAP library binding for Ruby
p schema2ldif - Tool for converting OpenLDAP-style schemas to the LDIF format
p slapd - OpenLDAP server (slapd)
p smbldap-tools - Scripts to manage Unix and Samba accounts stored on LDAP
p vbackup - utilitaire modulaire de sauvegarde

Q2. Quels sont les paquets Debian à installer pour mettre en œuvre un serveur LDAP ?
Dans liste obtenue en réponse à la question précédente, rechercher les paquets relatifs aux
utilitaires et au serveur.

Dans la liste ci-dessus, on retient deux paquets : ldap-utils et slapd.


# aptitude install slapd ldap-utils
Les NOUVEAUX paquets suivants vont être installés :
ldap-utils libltdl7{a} libodbc1{a} slapd
0 paquets mis à jour, 4 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 2 314 ko d'archives. Après dépaquetage, 19,0 Mo
seront utilisés.
Voulez-vous continuer ? [Y/n/?]

Lors de l'installation, deux écrans debconf demandent la saisie du mot de passe administrateur
du service LDAP.

Q3. Comment identifier le ou les processus correspondant au service installé ?


Utiliser une commande d'affichage de la liste des processus actifs sur le système pour identifier
le démon correspondant au serveur LDAP.

$ ps aux | grep l[d]ap


openldap 1303 0.0 0.1 1078732 5936 ? Ssl 19:22 0:00 \
/usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d

À partir de ces informations, on identifie le démon serveur slapd, le compte utilisateur et le groupe
système propriétaires du processus (openldap) et enfin le répertoire contenant les fichiers de
configuration /etc/ldap/slapd.d.

Q4. Comment identifier le ou les numéros de ports ouverts par le service installé ?
Utiliser une commande d'affichage de la liste des ports ouverts sur le système.

Voici deux exemples usuels.


# lsof -i | grep l[d]ap
slapd 1303 openldap 8u IPv4 22394 0t0 TCP *:ldap (LISTEN)
slapd 1303 openldap 9u IPv6 22395 0t0 TCP *:ldap (LISTEN)

Introduction aux annuaires LDAP avec OpenLDAP page 4 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# ss -tau | grep l[d]ap


tcp LISTEN 0 128 *:ldap *:*
tcp LISTEN 0 128 :::ldap :::*

Les numéros de port enregistrés pour le service LDAP sont disponibles dans le fichier /etc/
services.

$ grep ldap /etc/services


ldap 389/tcp # Lightweight Directory Access Protocol
ldap 389/udp
ldaps 636/tcp # LDAP over SSL
ldaps 636/udp

Relativement au indications données par les commandes lsof et ss, c'est le numéro de port 389
qui est ouvert en écoute lors de l'installation du paquet slapd.

3.2. Analyse de la configuration du service LDAP


Les versions récentes du logiciel OpenLDAP utilisent un mode de configuration basé sur un Directory
Information Tree ou DIT propre. Cette arborescence de configuration est pointée par le nom cn=config.
Elle est utilisée pour configurer dynamiquement le démon slapd, modifier les définitions de schéma,
les index, les listes de contrôle d'accès ACLs, etc. Ce mode de configuration présente un avantage
déterminant lorsque l'on exploite des annuaires volumineux : toutes les opérations se font sans
interruption de service.
Les documents fournis avec le paquet slapd contiennent des informations indispensables à l'analyse
du fonctionnement du service.

Q5. Quel est le mode de gestion de la configuration du service adopté depuis la version 2.4.23-3 du
paquet de la distribution Debian GNU/Linux ?
Consulter les fichiers de documentation fournis avec le paquet slapd.

Les documents relatifs au paquet slapd sont situés dans le répertoire /usr/share/doc/slapd/. Le
fichier README.Debian.gz contient un exemple d'instruction de consultation de la configuration du
service.
# ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config"

Q6. Quel est le gestionnaire de base de données (backend) proposé dans l'annuaire de
configuration ?
Reprendre la commande préconisée en réponse à la question précédente en utilisant le type de
base de donnée comme filtre.

Introduction aux annuaires LDAP avec OpenLDAP page 5 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" olcDatabase={1}mdb


SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: olcDatabase={1}mdb
# requesting: ALL
#

# {1}mdb, config
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=nodomain
olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to * by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=nodomain
olcRootPW: {SSHA}Hsonccb6iwsCLyvV5Qa8SNbwO9vNVVej
olcDbCheckpoint: 512 30
olcDbIndex: objectClass eq
olcDbIndex: cn,uid eq
olcDbIndex: uidNumber,gidNumber eq
olcDbIndex: member,memberUid eq
olcDbMaxSize: 1073741824

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Par définition, un annuaire LDAP est une base de données optimisée en lecture. Du point de
vue implémentation, les entrées sont stockées sous forme «binaire» et indexées à l'aide d'un
gestionnaire de base de données. Le gestionnaire d'arrière plan proposé par défaut est mdb. Il
s'agit d'une variante récente du gestionnaire Berkeley DB transactional backend.

Q7. Comment identifier le nom de l'annuaire fourni par défaut avec le paquet slapd ?
Rechercher la clé olcSuffix dans la configuration de l'annuaire.

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" olcSuffix | grep ^olcSuffix


SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcSuffix: dc=nodomain

Q8. Quels sont les schemas actifs avec la configuration courante du paquet slapd ?
Rechercher la clé olcSchemaConfig dans la configuration de l'annuaire.

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" olcSchemaConfig | grep ^cn


SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
cn: config
cn: module{0}
cn: schema
cn: {0}core
cn: {1}cosine
cn: {2}nis
cn: {3}inetorgperson

Q9. Où sont stockées les bases définies par défaut lors de l'installation du paquet slapd ?
Rechercher la clé olcDbDirectory dans la configuration de l'annuaire.

Introduction aux annuaires LDAP avec OpenLDAP page 6 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" olcDbDirectory |\


grep ^olcDbDirectory
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcDbDirectory: /var/lib/ldap

C'est dans le répertoire /var/lib/ldap que sont stockées les fichiers des bases Berkeley DB.
# ls -lAh /var/lib/ldap/
total 68K
-rw------- 1 openldap openldap 64K sept. 12 17:21 data.mdb
-rw------- 1 openldap openldap 8,0K sept. 12 17:21 lock.mdb

3.3. Réinitialisation de la base de l'annuaire LDAP


L'installation du paquet slapd implique l'installation d'un annuaire minimal avec une base associée.
Ce mode opératoire est nécessaire, ne serait-ce que pour accéder à la configuration du service et
tester la validité de l'installation. Après avoir traité les questions ci-dessus, on sait que l'installation est
fonctionnelle. On peut donc passer à l'initialisation de notre propre annuaire.

Note
Les manipulations proposées dans cette section permettent de reprendre à zéro la
configuration d'un annuaire LDAP. Il peut être utile de revenir à cette étape en cas de «doute»
sur l'intégrité de l'annuaire lors du traitement des questions des sections suivantes.

Q10. Comment arrêter le service LDAP ?


Utiliser les scripts fournis avec le gestionnaire de lancement des processus système.

Chaque processus système dispose d'un script de gestion de son lancement, arrêt (et|ou)
redémarrage. Avec le gestionnaire systemd, il faut faire une recherche dans la liste des services.
Une fois le service identifié, on l'arrête avec la commande systemctl.
# systemctl list-units | grep slapd
slapd.service loaded active running LSB: OpenLDAP standalone server

# systemctl stop slapd

Q11. Quels sont les éléments à supprimer pour pouvoir installer une nouvelle configuration et une
nouvelle base LDAP ?
Utiliser le résultat de la question sur la localisation des bases et la documentation fournie avec
le paquet slapd.

À partir des réponses aux questions ci-dessus, on sait que c'est le répertoire /var/lib/ldap/ qui
contient les bases. La lecture du fichier de documentation du paquet avec la commande # zless /
usr/share/doc/slapd/README.Debian.gz indique que les fichiers de configuration sont situés dans le
répertoire /etc/ldap/slapd.d/.
On supprime donc tous ces fichiers et répertoires.
# rm /var/lib/ldap/*
# rm -rf /etc/ldap/slapd.d

Q12. Comment reprendre à zéro la configuration du paquet slapd ?


Utiliser l'outil du gestionnaire de paquets Debian GNU/Linux qui permet la modification des
paramètres de configuration d'un service à l'aide de menus debconf.

C'est la commande dpkg-reconfigure qui sert à réviser les paramètres de configuration d'un
paquet. Voici une copie des écrans proposés avec le paquet slapd.
# dpkg-reconfigure slapd
No configuration file was found for slapd at /etc/ldap/slapd.conf. ... (warning).
Creating initial configuration... done.
Creating LDAP directory... done.
Starting OpenLDAP: slapd.

Introduction aux annuaires LDAP avec OpenLDAP page 7 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

Copie d'écran dpkg-reconfigure slapd - vue complète

Copie d'écran dpkg-reconfigure slapd - vue complète

Copie d'écran dpkg-reconfigure slapd - vue complète

Copie d'écran dpkg-reconfigure slapd - vue complète

Copie d'écran dpkg-reconfigure slapd - vue complète

Copie d'écran dpkg-reconfigure slapd - vue complète

Copie d'écran dpkg-reconfigure slapd - vue complète

Introduction aux annuaires LDAP avec OpenLDAP page 8 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

Copie d'écran dpkg-reconfigure slapd - vue complète

Q13. Comment valider la nouvelle configuration du paquet slapd ?


Reprendre la question sur le nom distinctif de l'annuaire.

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" olcSuffix | grep ^olcSuffix


SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcSuffix: dc=lab,dc=stri

3.4. Composition d'un nouvel annuaire LDAP


Une fois que les fichiers de configuration et de base de données du nouvel annuaire sont en place, on
peut passer à l'ajout de nouvelles entrées dans cet annuaire. Comme le fil conducteur de cette série de
travaux pratiques est la gestion d'une base de comptes utilisateurs, on doit ajouter les objets suivants.

• Deux unités organisationnelles : people et groups.

• Quatre compte utilisateurs : papa et maman Skywalker ainsi que leurs deux enfants

Toutes les manipulations sur les objets de l'annuaire utilisent un format de fichier texte particulier
baptisé LDIF pour LDAP Data Interchange Format. C'est un format de représentation des données
contenues dans un annuaire particulièrement utile pour les opérations de sauvegarde et de restauration
en volume.
Du point de vue formatage, chaque enregistrement doit être séparé du suivant par une ligne vide et
chaque attribut d'un enregistrement apparaît sur une ligne sous la forme «nomAttribut: valeur».

Q14. Comment visualiser la liste des entrées contenues dans l'annuaire LDAP ?
Utiliser les pages de manuels de la commande ldapsearch et rechercher les informations sur les
méthodes d'authentification, la désignation de la base dans laquelle on effectue la recherche et
le nom distinctif utilisé pour se connecter à l'annuaire.

La commande ldapsearch propose plusieurs modes d'authentification qui influent sur la liste des
attributs affichés pour une même entrée. Dans notre exemple, ce sont les mots de passes qui
peuvent ne pas apparaître ou apparaître sous différentes formes.

• L'option -x évite le recours à la méthode SASL pour l'authentification.


# ldapsearch -LLL -x -H ldap:/// -b "dc=lab,dc=stri" -D cn=admin,dc=lab,dc=stri -W
Enter LDAP Password:
dn: dc=lab,dc=stri
objectClass: top
objectClass: dcObject
objectClass: organization
o: lab.stri
dc: lab

dn: cn=admin,dc=lab,dc=stri
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9Ykd1QVJVWi82UWt1WXhpd1QvS0ZVUHM5dkFpNVdwVU4=

• L'option -Y EXTERNAL utilise la méthode SASL du même nom.

Introduction aux annuaires LDAP avec OpenLDAP page 9 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "dc=lab,dc=stri" \


-D cn=admin,dc=lab,dc=stri -W
Enter LDAP Password:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: dc=lab,dc=stri
objectClass: top
objectClass: dcObject
objectClass: organization
o: lab.stri
dc: lab

dn: cn=admin,dc=lab,dc=stri
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

• L'option -LLL désactive l'affichage des commentaires et de la version LDIF utilisée dans la
réponse.

• L'option -b désigne le point de départ de la recherche.

• L'option -D désigne le nom distinctif de connexion à l'annuaire.

• L'option -W provoque l'affichage de l'invite de demande du mot passe correspondant au nom


distinctif utilisé.

Q15. Comment activer la journalisation des manipulations sur les entrées de l'annuaire LDAP ?
Rechercher l'entrée relative au niveau de journalisation dans le DIT et modifier sa valeur de façon
à obtenir un état dans les journaux système à chaque opération sur l'annuaire.
La modification de l'entrée du DIT doit se faire à l'aide d'un fichier LDIF approprié.

L'entrée à rechercher dans le DIT est baptisée olcLogLevel.


# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" olcLogLevel |\
grep ^olcLogLevel
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcLogLevel: none

on se propose de modifier la valeur none par stats de façon à journaliser les connexions,
les opérations et les résultats. Voici une copie du fichier LDIF permettant de réaliser cette
modification.
# cat setolcLogLevel2stats.ldif
# Set olcLogLevel 2 stats
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats

On applique ce changement de valeur avec la commande ldapmodify puis on vérifie que l'attribut
a bien reçu le paramètre.
# ldapmodify -Y EXTERNAL -H ldapi:/// -f setolcLogLevel2stats.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" olcLogLevel |\


grep ^olcLogLevel
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcLogLevel: stats

Enfin, on relève les traces de la dernière opération dans les journaux système.

Introduction aux annuaires LDAP avec OpenLDAP page 10 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# grep -5 olcLogLevel /var/log/syslog


slapd[4867]: conn=1004 op=0 BIND dn="" method=163
slapd[4867]: conn=1004 op=0 BIND authcid="gidNumber=0+uidNumber=0,\
cn=peercred,cn=external,cn=auth" \
authzid="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
slapd[4867]: conn=1004 op=0 BIND dn="gidNumber=0+uidNumber=0,\
cn=peercred,cn=external,cn=auth" \
mech=EXTERNAL sasl_ssf=0 ssf=71
slapd[4867]: conn=1004 op=0 RESULT tag=97 err=0 text=
slapd[4867]: conn=1004 op=1 SRCH base="cn=config" scope=2 deref=0 \
filter="(objectClass=*)"
slapd[4867]: conn=1004 op=1 SRCH attr=olcLogLevel
slapd[4867]: conn=1004 op=1 SEARCH RESULT tag=101 err=0 nentries=11 text=
slapd[4867]: conn=1004 op=2 UNBIND
slapd[4867]: conn=1004 fd=14 closed

Note

Dans le contexte des travaux pratiques, le nombre d'entrées de l'annuaire reste très limité
et la journalisation n'a pas d'impact mesurable sur les performances du système. Dans
un contexte d'exploitation réelle avec un annuaire comprenant au moins une dizaine de
milliers d'entrées, la situation est très différente et il faut limiter au maximum le recours à la
journalisation des transactions sur l'annuaire.

Pour ramener la valeur de l'attribut olcLogLevel à none, il suffit de créer un fichier LDIF avec la
directive correspondante.
# Set olcLogLevel 2 none
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: none

Q16. Quelle est la syntaxe du fichier LDIF qui permet d'ajouter les deux unités organisationnelles
(organisational unit) ?
Rechercher un tutoriel LDIF en ligne donnant un exemple de fichier LDIF avec une ou plusieurs
entrées ou:.

Voici un exemple de fichier LDIF contenant les déclarations des deux unités organisationnelles
à ajouter.
# cat ou.ldif
dn: ou=people,dc=lab,dc=stri
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=lab,dc=stri
objectClass: organizationalUnit
ou: groups

Q17. Quelle est la commande à utiliser pour ajouter une ou plusieurs entrées dans l'annuaire ?
Rechercher dans la liste des programmes fournis avec le paquet des outils LDAP.

C'est la commande ldapadd qui est utile dans notre contexte. On l'utilise en mode
d'authentification simple avec le fichier LDIF ci-dessus pour compléter l'annuaire.
# ldapadd -cxWD cn=admin,dc=lab,dc=stri -f ou.ldif
Enter LDAP Password:
adding new entry "ou=people,dc=lab,dc=stri"

adding new entry "ou=groups,dc=lab,dc=stri"

On vérifie ensuite que les deux nouvelles entrées sont bien présentes dans l'annuaire.

Introduction aux annuaires LDAP avec OpenLDAP page 11 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# ldapsearch -LLL -x -H ldap:/// -b "dc=lab,dc=stri" -D cn=admin,dc=lab,dc=stri -W


Enter LDAP Password:
dn: dc=lab,dc=stri
objectClass: top
objectClass: dcObject
objectClass: organization
o: lab.stri
dc: lab

dn: cn=admin,dc=lab,dc=stri
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9Ykd1QVJVWi82UWt1WXhpd1QvS0ZVUHM5dkFpNVdwVU4=

dn: ou=people,dc=lab,dc=stri
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=lab,dc=stri
objectClass: organizationalUnit
ou: groups

Q18. Quelle est la commande à utiliser pour saisir manuellement un mot de passe et obtenir la chaîne
chiffrée correspondante ?
Rechercher dans la liste des programmes fournis avec les paquets de la distribution puis
consulter les pages de manuels correspondantes.

En effectuant une recherche par mot clé dans les pages de manuels du système, on peut
identifier l'outil recherché.
# man -k passwd | grep -i ldap
ldappasswd (1) - change the password of an LDAP entry
slappasswd (8) - OpenLDAP password utility

On utilise la commande slappasswd pour générer une chaîne chiffrée que l'on insère dans le
fichier LDIF des comptes utilisateurs.
# slappasswd
New password:
Re-enter new password:
{SSHA}LrPFvc6YekTGSEYiMezxYxcmE/0ZE/9L

Dans le contexte de ces travaux pratiques, on attribue le même mot de passe aux quatre comptes
utilisateurs.
Il existe une technique simple pour la génération de mots de passe utilisateurs aléatoires. Une
fois le mot de passe généré, il peut être transmis à l'utilisateur final par un «canal de confiance»
et implanté dans les attributs de l'annuaire relatifs au compte utilisateur.
# head -c 9 /dev/urandom | base64
piupfsRIU23u
# slappasswd -v -h "{SSHA}" -s piupfsRIU23u
{SSHA}PxK09I2Oi6ZA2bPP55Eptm9JRkJeP6oV

Q19. Quelle est la syntaxe du fichier LDIF qui permet d'ajouter les quatre utilisateurs avec leurs
attributs système : identifiants uid/gid, authentifiants login/passwd, etc ?
Rechercher un tutoriel LDIF en ligne donnant un exemple de fichier LDIF avec un exemple de
description des attributs d'un compte utilisateur.

Voici un exemple de fichier LDIF contenant les déclarations des quatre comptes utilisateurs à
ajouter.

Introduction aux annuaires LDAP avec OpenLDAP page 12 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# cat users.ldif
# Padmé Amidala
dn: uid=padme,ou=people,dc=lab,dc=stri
objectClass: inetOrgPerson
objectClass: shadowAccount
objectClass: posixAccount
cn: Padme
sn: Padmé Amidala Skywalker
uid: padme
uidNumber: 10000
gidNumber: 10000
loginShell: /bin/bash
homeDirectory: /ahome/padme
userPassword: {SSHA}LrPFvc6YekTGSEYiMezxYxcmE/0ZE/9L
gecos: Padme Amidala Skywalker

# Anakin Skywalker
dn: uid=anakin,ou=people,dc=lab,dc=stri
objectClass: inetOrgPerson
objectClass: shadowAccount
objectClass: posixAccount
cn: Anakin
sn: Anakin Skywalker
uid: anakin
uidNumber: 10001
gidNumber: 10001
loginShell: /bin/bash
homeDirectory: /ahome/anakin
userPassword: {SSHA}LrPFvc6YekTGSEYiMezxYxcmE/0ZE/9L
gecos: Anakin Skywalker

# Leia Organa Skywalker


dn: uid=leia,ou=people,dc=lab,dc=stri
objectClass: inetOrgPerson
objectClass: shadowAccount
objectClass: posixAccount
cn: Leia
sn: Leia Organa
uid: leia
uidNumber: 10002
gidNumber: 10002
loginShell: /bin/bash
homeDirectory: /ahome/leia
userPassword: {SSHA}LrPFvc6YekTGSEYiMezxYxcmE/0ZE/9L
gecos: Leia Organa Skywalker

# Luke Skywalker
dn: uid=luke,ou=people,dc=lab,dc=stri
objectClass: inetOrgPerson
objectClass: shadowAccount
objectClass: posixAccount
cn: Luke
sn: Luke Skywalker
uid: luke
uidNumber: 10003
gidNumber: 10003
loginShell: /bin/bash
homeDirectory: /ahome/luke
userPassword: {SSHA}LrPFvc6YekTGSEYiMezxYxcmE/0ZE/9L
gecos: Luke Skywalker

Comme dans le cas précédent, on utilise la commande ldapadd en mode d'authentification


simple pour insérer les comptes dans l'annuaire.
# ldapadd -cxWD cn=admin,dc=lab,dc=stri -f users.ldif
Enter LDAP Password:
adding new entry "uid=padme,ou=people,dc=lab,dc=stri"

adding new entry "uid=anakin,ou=people,dc=lab,dc=stri"

adding new entry "uid=leia,ou=people,dc=lab,dc=stri"

adding new entry "uid=luke,ou=people,dc=lab,dc=stri"

Le résultat de la commande # ldapsearch -LLL -x -H ldap:/// -b "dc=lab,dc=stri" -D


cn=admin,dc=lab,dc=stri -W doit faire apparaître les nouvelles entrées de l'annuaire.

Introduction aux annuaires LDAP avec OpenLDAP page 13 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

4. Configuration de l'accès client au serveur LDAP


Dans cette section, on suppose qu'un annuaire LDAP existe et qu'il contient des comptes utilisateurs.
On se propose de configurer un poste client pour qu'il obtienne de façon transparente les informations
sur les comptes utilisateurs desservis par l'annuaire.

4.1. Interrogation à distance de l'annuaire LDAP


On reprend ici les requêtes de consultation des entrées de l'annuaire vues dans la Section  3.4,
«  Composition d'un nouvel annuaire LDAP  ». Cette fois-ci les requêtes sont émises depuis un hôte
réseau différent du serveur LDAP.

Q20. Quel est le paquet qui fournit, entre autres, la commande de consultation des entrées de
l'annuaire ?
Interroger la base de données des paquets pour obtenir les informations demandées.

# aptitude install ldap-utils

Le paquet ldap-utils apparaît à la question sur la liste des paquets relatifs au service LDAP. Si
on recherche les commandes présentes dans la liste des fichiers de ce paquet, on obtient les
informations suivantes.
$ dpkg -L ldap-utils | grep bin
/usr/bin
/usr/bin/ldapmodrdn
/usr/bin/ldappasswd
/usr/bin/ldapdelete
/usr/bin/ldapsearch
/usr/bin/ldapmodify
/usr/bin/ldapexop
/usr/bin/ldapurl
/usr/bin/ldapcompare
/usr/bin/ldapwhoami
/usr/bin/ldapadd

Une fois ce paquet installé, il est possible d'utiliser toutes les commandes disponibles pour
manipuler les enregistrements de l'annuaire.

Q21. Quelle est la syntaxe d'interrogation de l'annuaire qui permet d'obtenir tous les attributs de
l'enregistrement correspondant à un utilisateur particulier ?

On reprend la commande ldapsearch en spécifiant un attribut uid particulier.


# ldapsearch -LLL -H ldap://192.0.2.12 \
-b dc=lab,dc=stri -D cn=admin,dc=lab,dc=stri -W uid=padme
Enter LDAP Password:
dn: uid=padme,ou=people,dc=lab,dc=stri
objectClass: inetOrgPerson
objectClass: shadowAccount
objectClass: posixAccount
cn: Padme
sn:: UGFkbcOpIEFtaWRhbGEgU2t5d2Fsa2Vy
uid: padme
uidNumber: 10000
gidNumber: 10000
loginShell: /bin/bash
homeDirectory: /ahome/padme
userPassword:: e1NTSEF9THJQRnZjNllla1RHU0VZaU1lenhZeGNtRS8wWkUvOUw=
gecos: Padme Amidala Skywalker

Q22. Quelle est la syntaxe de la commande permettant de changer le mot de passe de l'utilisateur
dont on an affiché les attributs à la question précédente ?

On utilise la commande ldappasswd fournie par le paquet ldap-utils comme dans le cas de
la commande de recherche. Après consultation des pages de manuels, on obtient la syntaxe
suivante.

Introduction aux annuaires LDAP avec OpenLDAP page 14 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# ldappasswd -x -H ldap://192.0.2.12 \
-D cn=admin,dc=lab,dc=stri -W -S uid=padme,ou=people,dc=lab,dc=stri
New password:
Re-enter new password:
Enter LDAP Password:

En posant exactement la même requête que dans la question précédente, on peut vérifier que
le mot de passe utilisateur a bien été modifié.
# ldapsearch -LLL -H ldap://192.0.2.12 \
-b dc=lab,dc=stri -D cn=admin,dc=lab,dc=stri -W uid=padme
Enter LDAP Password:
dn: uid=padme,ou=people,dc=lab,dc=stri
objectClass: inetOrgPerson
objectClass: shadowAccount
objectClass: posixAccount
cn: Padme
sn:: UGFkbcOpIEFtaWRhbGEgU2t5d2Fsa2Vy
uid: padme
uidNumber: 10000
gidNumber: 10000
loginShell: /bin/bash
homeDirectory: /ahome/padme
gecos: Padme Amidala Skywalker
userPassword:: e1NTSEF9blZYUG9NTTNOdVdoZWFSOTBMZFBkY1lGZGRvSEVlTEY=

4.2. Configuration Name Service Switch


Les manipulations présentées ici ont pour but de rendre transparent l'accès aux attributs des comptes
utilisateurs. Le mécanisme Name Service Switch assure un aiguillage de l'accès à ces attributs entre
les fichiers locaux et les différents services réseau disponibles. Ici, l'annuaire LDAP constitue un dépôt
de référence pour le stockage des attributs des comptes utilisateurs.

Q23. Quel est le nom du paquet relatif au mécanisme Name Service Switch permettant d'accéder aux
ressources de l'annuaire LDAP ?
Rechercher dans les bases du gestionnaire de paquets un paquet dont le nom débute par la
chaîne libnss.

La liste ci-dessous permet d'identifier le paquet libnss-ldapd.


# aptitude search ^libnss-
p libnss-cache - NSS module for using nsscache-generated files
p libnss-db - Module NSS pour utiliser des bases de données Berkeley
comme service de noms
p libnss-docker - nss module for finding Docker containers
p libnss-extrausers - nss module to have an additional passwd, shadow and
group file
p libnss-gw-name - nss module that names the current gateway’s IP address
p libnss-ldap - NSS module for using LDAP as a naming service
p libnss-ldapd - NSS module for using LDAP as a naming service
p libnss-libvirt - nss plugin providing IP add ress resolution for virtual
machines
p libnss-lwres - NSS module for using bind9's lwres as a naming service
i A libnss-mdns - module NSS pour la résolution de nom Multicast DNS
p libnss-myhostname - nss module providing fallback resolution for the
current hostname
p libnss-mymachines - nss module to resolve hostnames for local container
instances
v libnss-pgsql1 -
p libnss-pgsql2 - NSS module for using PostgreSQL as a naming service
p libnss-rainbow2 - nss library for rainbow
p libnss-resolve - module NSS pour la résolution de nom avec
systemd-resolved
p libnss-securepass - NSS (Name Service Switch) module for Securepass
p libnss-sss - Nss library for the System Security Services Daemon
p libnss-systemd - nss module providing dynamic user and group name
resolution
p libnss-winbind - greffons d'intégration de service de nom pour Samba
p libnss-wrapper - NSS wrapper library

Introduction aux annuaires LDAP avec OpenLDAP page 15 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

Avertissement
Relativement au paquet libnss-ldap, le paquet libnss-ldapd modifie directement les
paramètres des fichiers /etc/pam.d/common-*.

Q24. Quels sont les paquets supplémentaires qui sont ajoutés lors de l'installation des bibliothèques
LDAP pour le mécanisme Name Service Switch ?
Utiliser les informations fournies par le gestionnaire de paquets pour chaque ajout.

Le lancement de l'installation du paquet libnss-ldapd donne la liste suivante.


# aptitude install libnss-ldapd
Les NOUVEAUX paquets suivants vont être installés :
libnss-ldapd libpam-ldapd{a} nscd{a} nslcd{a} nslcd-utils{a}
0 paquets mis à jour, 5 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 669 ko d'archives. Après dépaquetage,
1 286 ko seront utilisés.
Voulez-vous continuer ? [Y/n/?]

Plusieurs paquets supplémentaires apparaissent :

• libpam-ldapd fournit les fonctions PAM nécessaires à l'authentification, aux autorisations et à


la gestion de session via un annuaire LDAP.

• nscd(Name Service Cache Daemon) est un démon qui gère la recherche des mots de passe,
des groupes et hôtes des programmes en cours d’exécution, et met en cache le résultat pour
une prochaine recherche.

• nslcdfournit una autre démon pour la collecte des informations sur les comptes utilisateurs
depuis un serveur LDAP.

• nslcd-utils fournit des outils pour l'interrogation et la mise à jour des entrées d'annuaire LDAP.

Avertissement
Pour les besoins des travaux pratiques ou de la mise au point de l'authentification via LDAP,
il est utile de désactiver les services de cache qui ne sont utiles qu'en exploitation avec un
grand nombre d'entrées dans l'annuaire.
# systemctl stop nscd

Q25. Quel est le rôle de l'interface entre les fonctions PAM (Pluggable Authentication Modules) et
l'annuaire LDAP ?

Par définition, PAM est un mécanisme qui permet d'intégrer différents modes d'authentification
en les rendant transparents vis à vis de l'utilisateur et des logiciels qui accèdent aux ressources
du système. Dans le contexte de ces travaux pratiques, il s'agit de permettre à l'utilisateur de
se connecter, d'accéder au système de fichiers, de changer son mot de passe, etc sans avoir à
lancer des commandes spécifiques.

Q26. Quelles sont les principales étapes de la configuration des paquets de bibliothèques NSS et
PAM ?
Lors de l'installation des principaux paquets de bibliothèques LDAP, on passe par une série
de menus debconf qu'il faut renseigner correctement pour accéder au serveur LDAP de façon
transparente.

Avertissement
En cas d'erreur de saisie dans la série de menus ci-dessous, il faut reprendre la configuration
de chacun des deux paquets individuellement. Classiquement, on passe par la commande
dpkg-reconfigure.

Introduction aux annuaires LDAP avec OpenLDAP page 16 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# dpkg-reconfigure libnss-ldapd
# dpkg-reconfigure libpam-ldapd
# dpkg-reconfigure nslcd

Copie d'écran configuration libnss-ldapd - vue complète

Copie d'écran configuration nslcd - vue complète

Copie d'écran configuration nslcd - vue complète

Copie d'écran configuration nslcd - vue complète

Copie d'écran configuration nslcd - vue complète

Introduction aux annuaires LDAP avec OpenLDAP page 17 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

Copie d'écran configuration nslcd - vue complète

Copie d'écran configuration nslcd - vue complète

Q27. Quelles sont les modifications apportées au fichier de configuration /etc/nsswitch.conf pour
activer l'accès aux ressources de l'annuaire LDAP ?
Lors de l'installation des paquets à l'étape précédente, le fichier /etc/nsswitch.conf a été modifié.

# grep ldap /etc/nsswitch.conf


passwd: compat ldap
group: compat ldap
shadow: compat ldap

Q28. Comment illustrer simplement le fonctionnement du mécanisme Name Service Switch intégrant
l'utilisation de l'annuaire LDAP ?
Rechercher la commande de récupération des entrées depuis les bases de données
d'administration dans les outils fournis avec les bibliothèques standard (paquet libc-bin).

La commande getent fournie avec le paquet libc-bin donne la liste des entrées accessibles pour
chaque catégorie du fichier de configuration. Voici un exemple pour la catégorie passwd qui fait
apparaître les entrées de l'annuaire LDAP à la suite des comptes utilisateurs système issus des
fichiers locaux.

Introduction aux annuaires LDAP avec OpenLDAP page 18 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# getent passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
Debian-exim:x:101:103::/var/spool/exim4:/bin/false
statd:x:102:65534::/var/lib/nfs:/bin/false
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
etu:x:1000:1000:Etudiant,,,:/home/etu:/bin/bash
rdnssd:x:104:65534::/var/run/rdnssd:/bin/false
systemd-timesync:x:105:108:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:106:109:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:107:110:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:108:111:systemd Bus Proxy,,,:/run/systemd:/bin/false
messagebus:x:109:113::/var/run/dbus:/bin/false
uuidd:x:100:101::/run/uuidd:/bin/false
_apt:x:110:65534::/nonexistent:/bin/false
avahi:x:111:116:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
nslcd:x:112:117:nslcd name service LDAP connection daemon,,,:/var/run/nslcd/:/usr/sbin/nologin
padme:x:10000:10000:Padme Amidala Skywalker:/ahome/padme:/bin/bash
anakin:x:10001:10001:Anakin Skywalker:/ahome/anakin:/bin/bash
leia:x:10002:10002:Leia Organa:/ahome/leia:/bin/bash
luke:x:10003:10003:Luke Skywalker:/ahome/luke:/bin/bash

Q29. Comment valider l'authentification d'un utilisateur déclaré dans l'annuaire LDAP ?
Choisir un service qui nécessite une authentification sur le système et qui utilise une entrée de
l'annuaire LDAP.

Avertissement

Après chaque manipulation sur la configuration des paquets libnss-ldapd et nslcd, il faut
impérativement relancer le démon de gestion du cache des services de noms : # systemctl
restart nscd.

Sans le redémarrage de ce démon, il est fréquent que les tests de connexion échouent alors
que la configuration système est correcte.

Les exemples de services nécessitant une authentification ne manquent pas. La commande su


qui permet de changer d'identité est le plus immédiat.
etu@LDAP-Client:~$ su luke
Mot de passe :
luke@LDAP-Client:/home/etu$ cd
bash: cd: /ahome/luke: Aucun fichier ou dossier de ce type

Dans les journaux du système, on retrouve les mêmes éléments.


# grep luke /var/log/auth.log
LDAP-Client su[1676]: pam_unix(su:auth): authentication failure; logname=etu
uid=1000 euid=0 tty=/dev/pts/0 ruser=etu rhost= user=luke
LDAP-Client su[1676]: Successful su for luke by etu
LDAP-Client su[1676]: + /dev/pts/0 etu:luke
LDAP-Client su[1676]: pam_unix(su:session): session opened for user luke by
etu(uid=1000)
LDAP-Client su[1676]: pam_unix(su:session): session closed for user luke

Voici un autre exemple d'accès avec SSH.

Introduction aux annuaires LDAP avec OpenLDAP page 19 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

$ ssh anakin@fe80::b8ad:caff:fefe:65%vlan10
Warning: Permanently added 'fe80::b8ad:caff:fefe:65%vlan10' (ECDSA) to the list
of known hosts.
anakin@fe80::b8ad:caff:fefe:65%vlan10's password:
Linux LDAP-Client 4.12.0-1-686-pae #1 SMP Debian 4.12.6-1 (2017-08-12) i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent


permitted by applicable law.
Could not chdir to home directory /ahome/anakin: No such file or directory

Il ne manque que l'accès au système de fichiers pour que la configuration soit vraiment
complète.

5. Accès à l'annuaire LDAP depuis un service web


Du point de vue métier, les manipulations à base de fichiers LDIF sont réservées aux traitements en
volume réalisés par les administrateurs système. Les développeurs disposent de bibliothèques fournies
avec les langages de programmation. Dans la plupart des cas, les développements ont pour but de
fournir une interface Web.
Le projet LDAP Tool Box propose un outil baptisé White Pages qui permet de constituer un
trombinoscope des utilisateurs enregistrés dans un annuaire LDAP.
L'objectif de cette section est d'installer le service web White Pages et de compléter les attributs des
utilisateurs de l'annuaire avec une photo.

Q30. Quel est le paquet à installer pour mettre en place le service Web White Pages ?
Rechercher sur le site LDAP Tool Box project, le lien de téléchargement direct du paquet Debian
pour le service White Pages.

Tout en bas de la page des téléchargements, on trouve un lien direct vers le paquet white-
pages_0.3-1_all.deb.

Après le téléchargement, l'installation nécessite quelques ajustements compte tenu des


dépendances des paquets entre les différentes versions du langage PHP.
# wget http://ltb-project.org/archives/white-pages_0.3-1_all.deb
<snip>

# dpkg -i white-pages_0.3-1_all.deb
<snip>

# aptitude -f install
<snip>

# aptitude install apache2 libapache2-mod-php


<snip>

Q31. Comment activer l'accès au service Web ?


Consulter les fichiers de documentation et de configuration fournis avec le paquet apache2.
Repérer les instructions d'activation et de désactivation d'un site. Retrouver les éléments
spécifiques à la configuration du service White Pages.

Cette question comprend plusieurs étapes.

1. Le paquet apache2 comprend une liste d'outils dédiés aux manipulations sur les sites et leur
configuration.
# dpkg -L apache2 | grep "bin.*a2"
/usr/sbin/a2enmod
/usr/sbin/a2query
/usr/sbin/a2disconf
/usr/sbin/a2dismod
/usr/sbin/a2dissite
/usr/sbin/a2enconf
/usr/sbin/a2ensite

Introduction aux annuaires LDAP avec OpenLDAP page 20 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

2. On utilise a2dissite pour désactiver le site par défaut et a2ensite pour activer les pages
blanches.
# a2dissite 000-default
<snip>

# a2ensite white-pages
<snip>

# apachectl configtest
<snip>
Syntax OK

# systemctl reload apache2


<snip>

La consultation de la page web donne le résultat suivant.

Copie d'écran service pages blanches - vue complète

3. Les paramètres du nouveau site sont donnés dans le fichier /etc/apache2/sites-available/


white-pages.conf.

Q32. Comment paramétrer l'accès à l'annuaire LDAP à partir du service Web ?


Identifier les fichiers de configuration fournis avec le paquet white-pages.

C'est le fichier /usr/share/white-pages/conf/config.inc.php qui contient les éléments d'accès à


l'annuaire LDAP. Voici un extrait de ce fichier avec les lignes utiles complétées avec le contexte
de ce support de travaux pratiques.
# grep ^\$ldap /usr/share/white-pages/conf/config.inc.php
$ldap_url = "ldap://localhost";
$ldap_starttls = false;
$ldap_binddn = "cn=admin,dc=lab,dc=stri";
$ldap_bindpw = "XXXXXX";
$ldap_base = "dc=lab,dc=stri";
$ldap_user_base = "ou=people,".$ldap_base;
$ldap_user_filter = "(objectClass=inetOrgPerson)";
$ldap_size_limit = 100;

Une fois le fichier modifié, il faut recharger le service Web avec la commande # systemctl reload
apache2.

La consultation de la rubrique Pages Blanches donne le résultat ci-dessous. L'intérêt de cette


manipulation est de montrer que l'on peut compléter les attributs d'un utilisateur de l'annuaire
avec une photo. Cette opération est l'objet des questions suivantes.

Introduction aux annuaires LDAP avec OpenLDAP page 21 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

Copie d'écran trombinoscope - vue complète

Q33. Quel est l'attribut de la classe inetOrgPerson qui correspond à une photo d'identité ?
Rechercher les options de la commande ldapsearch qui permettent d'extraire la liste des
attributs de la classe inetOrgPerson.

On obtient l'information en deux temps.

• On identifie le contexte de la classe recherchée en premier.


# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn=config" | grep -i inetorgperson
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn={3}inetorgperson,cn=schema,cn=config
cn: {3}inetorgperson
olcObjectClasses: {0}( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2

• Une fois le contexte connu avec précision, on peut extraire la liste des attributs relatifs à la
classe inetOrgPerson.
Dans la liste ci-dessous, on repère l'attribut jpegPhoto qui correspond à notre besoin.

Introduction aux annuaires LDAP avec OpenLDAP page 22 sur 23


Introduction aux annuaires LDAP avec OpenLDAP

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b "cn={3}inetorgperson,cn=schema,cn=config"


SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn={3}inetorgperson,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: {3}inetorgperson
olcAttributeTypes: {0}( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'RFC279
8: vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR cas
eIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcAttributeTypes: {1}( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC '
RFC2798: identifies a department within an organization' EQUALITY caseIgnoreM
atch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcAttributeTypes: {2}( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'RFC
2798: preferred name to be used when displaying entries' EQUALITY caseIgnoreM
atch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SI
NGLE-VALUE )
olcAttributeTypes: {3}( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'RF
C2798: numerically identifies an employee within an organization' EQUALITY ca
seIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.12
1.1.15 SINGLE-VALUE )
olcAttributeTypes: {4}( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'RFC2
798: type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgn
oreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
olcAttributeTypes: {5}( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'RFC2
798: a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 )
olcAttributeTypes: {6}( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC
'RFC2798: preferred written or spoken language for a person' EQUALITY caseIg
noreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.
15 SINGLE-VALUE )
olcAttributeTypes: {7}( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' D
ESC 'RFC2798: PKCS#7 SignedData used to support S/MIME' SYNTAX 1.3.6.1.4.1.14
66.115.121.1.5 )
olcAttributeTypes: {8}( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'RFC2
798: personal identity information, a PKCS #12 PFX' SYNTAX 1.3.6.1.4.1.1466.1
15.121.1.5 )
olcObjectClasses: {0}( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2
798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY
( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ em
ployeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ ini
tials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo
$ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ pre
ferredLanguage $ userSMIMECertificate $ userPKCS12 ) )

Q34. Quelle est la syntaxe du fichier LDIF qui permet de modifier l'attribut jpegPhoto d'un utilisateur
de l'annuaire ?
Rechercher un exemple de modification d'attribut avec la commande ldapmodify.
Rechercher aussi un fichier JPEG qui fasse office de photo d'identité.

Tout d'abord, on dépose le fichier JPEG à utiliser dans le dossier /var/tmp à titre d'exemple.
La syntaxe du fichier LDIF est relativement simple une fois que l'on a bien identifié le contexte.
# cat leia-photo.ldif
dn: uid=leia,ou=people,dc=lab,dc=stri
changetype: modify
add: jpegPhoto
jpegPhoto:<file:///var/tmp/leia.jpg

Enfin, on applique la modification dans l'annuaire LDAP.


# ldapmodify -x -H ldap:/// -D "cn=admin,dc=lab,dc=stri" -W -f leia-photo.ldif

Le résultat est visible sur la copie d'écran de navigateur Web ci-dessus.

6. Documents de référence
OpenLDAP Software 2.4 Administrator's Guide
La documentation officielle : OpenLDAP Software 2.4 Administrator's Guide constitue le point
d'entrée essentiel pour la mise en œuvre du service LDAP.

Introduction aux annuaires LDAP avec OpenLDAP page 23 sur 23

Vous aimerez peut-être aussi