4. Installer et configurer le serveur LDAP

Dans cette partie, vous allez installer les paquets du service OpenLDAP, vérifier son état, puis préparer une configuration reproductible.

4.1. Installer le service LDAP

Cette section vous guide pas à pas pour identifier les paquets Debian liés à LDAP, réaliser une installation non interactive de slapd, puis interpréter l’état du service obtenu.

Q112.

Quels sont les paquets Debian relatifs au service LDAP ?

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

apt search ^OpenLDAP
ldap-utils/testing,now 2.6.10+dfsg-1+b2 amd64 [installé]
  OpenLDAP utilities

libldap-common/testing 2.6.10+dfsg-1 all
  fichiers communs OpenLDAP pour les bibliothèques

libldap-dev/testing 2.6.10+dfsg-1+b2 amd64
  bibliothèques de développement pour OpenLDAP

libldap2/testing,now 2.6.10+dfsg-1+b2 amd64 [installé, automatique]
  Bibliothèques OpenLDAP

slapd/testing,now 2.6.10+dfsg-1+b2 amd64 [installé]
serveur OpenLDAP (slapd)

Q113.

Quels sont les paquets Debian à installer pour mettre en œuvre un serveur LDAP sans configuration initiale ?

Dans la liste obtenue en réponse à la question précédente, recherchez les paquets relatifs aux utilitaires et au serveur.

Recherchez ensuite les paramètres à utiliser pour une installation dite non interactive.

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

Créez le script slapd-install.sh avec le code ci-dessous :

#!/usr/bin/env bash

set -euo pipefail

# Non-interactive installation of slapd
export DEBIAN_FRONTEND=noninteractive

# Silent empty configuration of slapd
debconf-set-selections <<'EOF'
slapd slapd/no_configuration boolean true
EOF

# Install slapd and ldap-utils
apt update -qq
apt install -y --no-install-recommends slapd ldap-utils

Lancez le code avec les droits d'administration système.

sudo bash slapd-install.sh

Q114.

Comment vérifier l'état du service installé ? Comment interpréter le résultat ?

Utilisez la commande systemctl pour afficher les attributs du serveur LDAP.

systemctl status slapd
× slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; preset: enabled)
     Active: failed (Result: exit-code) since Sat 2026-05-09 09:55:20 CEST; 5h 8min ago
 Invocation: 4bd994d1ada0415cba3a274ab8c7fc3a
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
    Process: 7884 ExecStart=sh -c mkdir -p /run/slapd;          chown
                "$SLAPD_USER":"$SLAPD_GROUP" /run/slapd;          [ -d "$SLAPD_CONF" ] &&
                confflag=-F || confflag=-f;     exec /usr/sbin/slapd -d0
                ${SLAPD_SERVICES:+-h "$SLAPD_SERVICES"}>
   Main PID: 7884 (code=exited, status=1/FAILURE)
   Mem peak: 2M
        CPU: 36ms

mai 09 09:55:20 ldap-srvr systemd[1]: Starting slapd.service - OpenLDAP Server Daemon...
mai 09 09:55:20 ldap-srvr slapd[7884]: @(#) $OpenLDAP: slapd 2.6.10+dfsg-1+b2 (Apr 29 2026 10:11:22) $
                                               Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>
mai 09 09:55:20 ldap-srvr slapd[7884]: could not stat config file "/etc/ldap/slapd.conf": No such file or directory (2)
mai 09 09:55:20 ldap-srvr slapd[7884]: slapd destroy: freeing system resources.
mai 09 09:55:20 ldap-srvr slapd[7884]: slapd stopped.
mai 09 09:55:20 ldap-srvr slapd[7884]: connections_destroy: nothing to destroy.
mai 09 09:55:20 ldap-srvr systemd[1]: slapd.service: Main process exited, code=exited, status=1/FAILURE
mai 09 09:55:20 ldap-srvr systemd[1]: slapd.service: Failed with result 'exit-code'.
mai 09 09:55:20 ldap-srvr systemd[1]: Failed to start slapd.service - OpenLDAP Server Daemon.

Les informations de la copie d'écran ci-dessus, montrent que le service a été lancé et est en échec (failed). La partie journalisation donne la raison de cet échec avec l'absence du fichier du configuration /etc/ldap/slapd.conf.

Cette situation est normale dans la mesure où vous avez procédé à une installation silencieuse du serveur OpenLDAP sans application d'une configuration initiale.

L’échec observé au démarrage de slapd confirme qu’aucune configuration n’a encore été fournie : c’est le point de départ attendu pour construire ensuite une configuration cohérente via un fichier LDIF de bootstrap.

4.2. Configurer le service LDAP

Dans cette section, vous allez générer une configuration minimale de la base cn=config à l’aide d’un fichier LDIF, afin de rendre le démon slapd opérationnel avec un domaine défini lab.local et un compte administrateur dédié.

Q115.

Comment générer une configuration minimale pour lancer correctement le service ?

Préparez la suite des instructions de création du fichier bootstrap-config.ldif dans lequel on met en place l'arbre de configuration cn=config.

À partir des documentations Debian, définissez les répertoires système de stockage de la configuration, des schémas et de la base de données.

Définissez aussi le contexte du domaine lab.local ainsi que le mot de passe de l'administrateur de l'annuaire LDAP.

En l'état actuel, le paquet slapd est installé mais aucune configuration n’est fournie. Le démon ne peut pas démarrer correctement tant qu’un jeu de fichiers de configuration n’a pas été injecté dans cn=config.

L’objectif est donc de :

  • Générer le fichier LDIF de bootstrap bootstrap-config.ldif avec toute la configuration initiale.

  • Initialiser la configuration cn=config à partir de ce LDIF.

  • Finaliser l’installation du paquet Debian slapd et démarrer le service.

Créez le script prepare-apply-bootstrap-ldif.sh avec le code ci-dessous :

#!/usr/bin/env bash

set -euo pipefail

readonly DOMAIN="lab.local"
readonly SUFFIX="dc=${DOMAIN%%.*},dc=${DOMAIN#*.}"
readonly SLAPD_CONFIG_DIR="/etc/ldap/slapd.d"
readonly SLAPD_DATA_DIR="/var/lib/ldap"

readonly LDAP_BOOTSTRAP_FILE="${HOME}/bootstrap-config.ldif"

ADMIN_PASS=$(openssl rand -base64 28 | cut -c -24)
rm -f "${HOME}"/.ldap_admin_pass
echo -n "${ADMIN_PASS}" | tee "${HOME}"/.ldap_admin_pass >/dev/null
chmod 400 "${HOME}"/.ldap_admin_pass
ROOT_HASH="$(sudo slappasswd -o module-load=argon2.la -h "{ARGON2}" -s "${ADMIN_PASS}")"

rm -f "${LDAP_BOOTSTRAP_FILE}"
cat <<EOF >"${LDAP_BOOTSTRAP_FILE}"
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcPidFile: /var/run/slapd/slapd.pid
olcLogLevel: none
olcToolThreads: 1
olcPasswordHash: {ARGON2}

dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema

include: file:///etc/ldap/schema/core.ldif
include: file:///etc/ldap/schema/cosine.ldif
include: file:///etc/ldap/schema/nis.ldif
include: file:///etc/ldap/schema/inetorgperson.ldif

dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: back_mdb
olcModuleLoad: argon2

dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * none

dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * none

dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: ${SLAPD_DATA_DIR}
olcDbMaxSize: 1073741824
olcSuffix: ${SUFFIX}
olcRootDN: cn=admin,${SUFFIX}
olcRootPW: ${ROOT_HASH}
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break
olcAccess: {1}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {2}to attrs=shadowLastChange by self write by * read
olcAccess: {3}to * by users read by * none
olcDbIndex: objectClass eq
olcDbIndex: uid eq
olcDbIndex: cn,sn,mail eq,sub
olcDbIndex: uidNumber,gidNumber eq
olcDbIndex: member,memberUid eq
EOF

# Create the directories if they do not exist
sudo mkdir -p "${SLAPD_CONFIG_DIR}" "${SLAPD_DATA_DIR}"

# Import the LDIF file to initialize the LDAP server configuration
sudo slapadd -F "${SLAPD_CONFIG_DIR}" -n0 -l "${LDAP_BOOTSTRAP_FILE}"

# Set the correct permissions for the LDAP data and configuration directories
sudo chown -R openldap:openldap "${SLAPD_CONFIG_DIR}" "${SLAPD_DATA_DIR}"

# Resume package configuration and restart
sudo dpkg --configure --pending
sudo systemctl restart slapd

Lancez le script avec les droits d'administration système.

bash prepare-apply-bootstrap-ldif.sh

Les instructions de configuration de l'annuaire LDAP méritent des explications. Voir Section 4.2, « Configurer le service LDAP ».

Q116.

Qu'est-ce que le format LDIF ?

LDIF (LDAP Data Interchange Format) est un format texte utilisé pour décrire :

  • Des entrées LDAP (DN, attributs, valeurs).

  • Des opérations de modification sur un annuaire (ajout, suppression, modification).

Le format est très simple :

  • Chaque entrée commence par une ligne Distinguished Name dn:.

  • Les lignes suivantes décrivent les attributs : attribut: valeur.

  • Les entrées sont séparées par des lignes vides.

Dans le Heredoc ci-dessus, LDIF est utilisé pour décrire la configuration du serveur lui‑même (arbre cn=config), et non des données applicatives (utilisateurs, groupes, etc.).

Q117.

Qu'est que la configuration dynamique d'OpenLDAP ?

OpenLDAP utilise une base spéciale, cn=config, pour stocker sa configuration. Cette base est elle‑même gérée via LDAP (et donc via LDIF), et contient :

  • La configuration globale : dn: cn=config.

  • Les schémas : dn: cn=schema,cn=config.

  • Les modules : dn: cn=module{…},cn=config.

  • Les bases de données : dn: olcDatabase={…}*,cn=config.

Lorsque Debian installe slapd sans configuration, cette base cn=config est vide. Le Heredoc a pour rôle de créer cette base à partir d'un fichier LDIF de bootstrap.

Q118.

Quel est l'état du service LDAP et comment identifier le ou les numéros de ports ouverts en écoute ?

Commencez par reprendre la question précédente Q : Q114 et vérifiez que le service est actif.

Utilisez les commandes ss ou lsof pour afficher la liste des ports ouverts par le service LDAP.

Maintenant que la configuration minimale avec la définition du domaine de travaux pratiques est en place, le service slapd est actif.

systemctl status slapd.service
systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; preset: enabled)
     Active: active (running) since Sun 2026-05-10 09:01:59 CEST; 15min ago
 Invocation: 6a61af75f66c4347aa716857b7a9bc3d
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
   Main PID: 1064 (slapd)
      Tasks: 2 (limit: 974)
     Memory: 10.6M (peak: 10.6M)
        CPU: 36ms
     CGroup: /system.slice/slapd.service
             └─1064 /usr/sbin/slapd -d0 -h "ldap:/// ldapi:///" -u openldap -g openldap

mai 10 09:01:59 ldap-srvr systemd[1]: Starting slapd.service - OpenLDAP Server Daemon...
mai 10 09:01:59 ldap-srvr slapd[1064]: @(#) $OpenLDAP: slapd 2.6.10+dfsg-1+b2 (Apr 29 2026 10:11:22) $
                                               Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>
mai 10 09:01:59 ldap-srvr slapd[1064]: slapd starting
mai 10 09:01:59 ldap-srvr systemd[1]: Started slapd.service - OpenLDAP Server Daemon.

Pour afficher le numéro de port ouvert en écoute par le service LDAP, commencez par rechercher la correspondance entre le protocole et son numéro enregistré. Tous les numéros de port enregistrés 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

Avec la liste des numéros de ports, affichez les services en écoute.

ss -autn 'sport = :389'
Netid      State      Recv-Q     Send-Q     Local Address:Port    Peer Address:Port
tcp        LISTEN     0          2048             0.0.0.0:389          0.0.0.0:*
tcp        LISTEN     0          2048                [::]:389             [::]:*

L'affichage montre que le service LDAP est en écoute uniquement sur le port tcp/389.

La syntaxe équivalente de la commande lsof est la suivante :

sudo lsof -i tcp:389
COMMAND  PID     USER FD   TYPE DEVICE SIZE/OFF NODE NAME
slapd   1064 openldap 7u  IPv4  11359      0t0  TCP *:ldap (LISTEN)
slapd   1064 openldap 8u  IPv6  11360      0t0  TCP *:ldap (LISTEN)

Par défaut l'accès TLS au service n'est pas activé.

Une fois le script exécuté, l’annuaire LDAP dispose d’une configuration initiale dynamique, stockée dans cn=config. La section suivante vous aidera à analyser en détail cette configuration et à comprendre le rôle de chaque bloc LDIF.

4.3. Analyser la configuration du service LDAP

Le logiciel OpenLDAP utilise un mode de configuration basé sur un Directory Information Tree ou DIT propre appelé cn=config. Cette base de données indépendante 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.

Le fichier LDIF de bootstrap utilisé dans la question Q : Q115 a servi à composer cette configuration de la façon suivante :

Configuration globale
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcPidFile: /var/run/slapd/slapd.pid
olcLogLevel: none
olcToolThreads: 1
  • dn: cn=config : entrée racine de la configuration.

  • Fichiers PID et arguments pour le daemon.

  • olcLogLevel: none : niveau de journalisation (aucun log LDAP spécifique ici).

  • olcToolThreads : nombre de threads utilisés par certains utilitaires.

Conteneur des schémas et inclusion des schémas standard
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema

include: file:///etc/ldap/schema/core.ldif
include: file:///etc/ldap/schema/cosine.ldif
include: file:///etc/ldap/schema/nis.ldif
include: file:///etc/ldap/schema/inetorgperson.ldif
  • cn=schema,cn=config : conteneur pour les schémas.

  • Les directives include permettent d’inclure les schémas LDIF fournis par le paquet Debian (core, cosine, nis, inetorgperson).

  • Ces schémas définissent les classes d’objets et attributs de base qui seront disponibles dans l’annuaire.

Chargement du module back_mdb
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: back_mdb
  • On déclare un module list (olcModuleList).

  • olcModuleLoad: back_mdb charge le backend mdb, utilisé pour stocker les données LDAP.

    Sans ce module, la base mdb déclarée plus loin ne pourrait pas fonctionner.

Chargement du module argon2

Le chargement du module Argon2 dans la configuration OpenLDAP est indispensable pour remplacer l'algorithme historique SHA par un mécanisme de hachage moderne à « coût mémoire » (ou memory-hard), le seul capable de résister efficacement aux attaques par force brute menées à l'aide de puces spécialisées (GPU/ASIC).

Cette implémentation est préconisée par l'ANSSI dans ses recommandations sur le choix des paramètres cryptographiques, ainsi que par l'OWASP dans sa Password Hashing Cheat Sheet, qui érigent Argon2id en standard de référence pour le stockage sécurisé des mots de passe.

Base frontend
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * none
  • La base frontend est une couche spéciale qui s’applique globalement à toutes les bases.

  • La directive olcAccess définit une règle d’accès : ici, les accès de gestion sont autorisés à l'utilisateur root via l’authentification peercred (socket UNIX), et refusés aux autres (by * none).

Base config (accès à cn=config)
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * none
  • Cette entrée contrôle les accès à la base de configuration cn=config.

  • Même logique d’accès que pour frontend : uniquement root via peercred.

Base de données principale mdb
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: ${SLAPD_DATA_DIR}
olcDbMaxSize: 1073741824
olcSuffix: ${SUFFIX}
olcRootDN: cn=admin,${SUFFIX}
olcRootPW: ${ROOT_HASH}
olcDbIndex: objectClass eq
olcDbIndex: uid eq
olcDbIndex: cn,sn,mail eq,sub

Après expansion des variables :

  • olcDbDirectory: /var/lib/ldap : répertoire des données.

  • olcSuffix: dc=lab,dc=local : racine de l’annuaire.

  • olcRootDN: cn=admin,dc=lab,dc=local : DN de l’administrateur de cette base.

  • olcRootPW: ${ROOT_HASH} : Condensat du mot de passe de l'administrateur de l'annuaire.

  • olcDbMaxSize : taille maximum de la base mdb.

  • olcDbIndex : index LDAP pour améliorer les performances de recherche.

Cette entrée définit la base de données principale que vous utiliserez pour créer des entrées (utilisateurs, groupes, etc.).

Les documents fournis avec le paquet slapd contiennent des informations indispensables à l'analyse du fonctionnement du service. Ces documents sont placé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.

Q119.

Comment afficher l'état courant de la base de configuration de l'annuaire LDAP ?

Consultez les fichiers de documentation fournis avec le paquet slapd.

sudo ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config"
  • La commande ldapsearch appartient au paquet ldap-utils.

  • L'option -Y EXTERNAL indique le mécanisme SASL à utiliser pour l’authentification.

  • EXTERNAL signifie que l’identité est fournie par le canal de transport (ici, les credentials Unix sur le socket local), et non par un DN/mot de passe.

  • Combiné avec sudo et ldapi:///, cela permet de se connecter comme administrateur de la configuration sans fournir un DN ou un mot de passe.

  • L'option -H ldapi:/// spécifie l’URI du serveur LDAP à contacter en utilisant un socket Unix (local au système serveur).

  • L'option -b "cn=config" définit la base de recherche (base DN). Ici cn=config cible la base de configuration dynamique d’OpenLDAP, qui contient toutes les entrées de configuration (olcGlobal, olcDatabase, olcSchema, etc.).

Q120.

En analysant les paramètres de la base de données de l'annuaire (olcDatabase={1}mdb,cn=config), quels sont les attributs qui appliquent directement le principe de moindre privilège ?

Comment justifiez-vous leur configuration ?

L'application du principe de moindre privilège repose sur les règles de contrôle d'accès définies par les attributs olcAccess (Access Control Lists ou ACL).

sudo ldapsearch -Y EXTERNAL -H ldapi:/// \
    -b "olcDatabase={1}mdb,cn=config" \
    olcAccess
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={1}mdb,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
 ,cn=auth manage by * break
olcAccess: {1}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {2}to attrs=shadowLastChange by self write by * read
olcAccess: {3}to * by users read by * none

Concentrez vous sur les quatre dernières lignes du résultat numérotées de 0 à 3.

Protection administrative de la configuration (Règle {0})
  • L’attribut cible est la configuration même de l’annuaire, qui doit rester strictement réservée aux opérations d’administration système.

  • Seul le compte root local, identifié via le mécanisme SASL EXTERNAL sur le socket Unix, est autorisé à gérer l’intégralité de cette base (lecture, écriture et modifications structurelles).

  • by * none : Tout autre accès est refusé, ce qui empêche un compte applicatif ou un utilisateur standard de modifier la configuration centrale de slapd, même s’il dispose de droits étendus dans le DIT de données.

Protection stricte des données d'authentification (Règle {1})
  • L'attribut userPassword, qui contient l'empreinte hachée du mot de passe, fait l'objet d'une restriction maximale.

  • by self write : Seul le propriétaire du compte (ainsi que l'administrateur global) possède le droit de modifier son propre mot de passe.

  • by anonymous auth : Un utilisateur non authentifié a le droit de soumettre un mot de passe pour tenter de valider son identité.

  • by * none : Tout autre accès (lecture, recherche) est strictement bloqué pour le reste des utilisateurs, empêchant ainsi l'extraction de la base de mots de passe pour des attaques par force brute hors ligne.

Gestion de l'expiration des mots de passe (Règle {2})
  • by self write : Lorsqu'un utilisateur modifie son mot de passe, le système ne met pas seulement à jour l'attribut userPassword. Il doit également réinitialiser le compteur de date dans shadowLastChange.

  • by * read : Les systèmes clients qui interrogent l'annuaire doivent pouvoir lire cette information pour déterminer si le compte de l'utilisateur est expiré ou s'il faut le forcer à changer son mot de passe dès sa connexion.

Accès standard aux données publiques (Règle {3})

to * by users read by * none : Une fois les attributs sensibles verrouillés par les règles précédentes, le reste des données de l'annuaire (noms, prénoms, identifiants POSIX uidNumber/gidNumber) est laissé en lecture seule pour tous les utilisateurs authentifiés.

Le principe du moindre privilège est respecté car chaque entité (utilisateur connecté ou système tiers) ne dispose que des droits strictement nécessaires à son fonctionnement (s'authentifier ou consulter un carnet d'adresses), sans exposer les données critiques.

Q121.

Quel est le gestionnaire de base de données (backend) proposé dans l'annuaire de configuration ?

Utilisez à nouveau la commande de la question précédente et recherchez le type de base de donnée à l'aide d'un filtre.

sudo 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=lab,dc=local
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
 ,cn=auth manage by * break
olcAccess: {1}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {2}to attrs=shadowLastChange by self write by * read
olcAccess: {3}to * by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=lab,dc=local
olcRootPW: {ARGON2}$argon2id$v=19$m=7168,t=5,p=1$Wo3HKSAZ32g0YMW7LTw+6Q$IIKyjH
 C2HhmEjVowmDushuMEB0M7neNawRRpkFqKLhw
olcDbCheckpoint: 512 30
olcDbIndex: objectClass eq
olcDbIndex: uid eq
olcDbIndex: cn,sn,mail eq,sub
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 pour la lecture. D'un 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 moderne du gestionnaire Berkeley DB transactional backend.

Q122.

Comment identifier le nom de l'annuaire fourni par défaut avec le paquet slapd ?

Recherchez la clé olcSuffix dans la configuration de l'annuaire.

sudo 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=local

Q123.

Quels sont les référentiels ou schemas actifs avec la configuration courante du paquet slapd ?

Quel est le rôle de chacun des référentiels inclus dans la configuration ?

Recherchez la clé olcSchemaConfig dans la configuration de l'annuaire.

sudo 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

Voici quelques éléments sur les quatre schémas actuellement chargés :

🧱 {0}core : Le socle

C'est le schéma fondamental d'OpenLDAP (spécifié par les RFC du standard LDAPv3). Il définit les classes de base de la structure de l'annuaire comme organization, organizationalUnit, dcObject (les composants de domaine dc), ainsi que la classe basique person (qui impose juste un nom sn et un nom commun cn).

🏢 {1}cosine : L'extension administrative

Ce schéma, issu des standards X.500, permet d'enrichir les objets avec des données d'entreprise. Il ajoute des attributs très utiles pour la gestion administrative (numéro de bureau, titre, nom du gestionnaire), et constitue surtout un prérequis indispensable au schéma suivant.

🐧 {2}nis : Le référentiel Linux / POSIX

C'est le schéma le plus important pour votre scénario d'intégration système. NIS ou (Network Information Service) apporte la compatibilité avec les systèmes UNIX/Linux. Il définit les classes posixAccount et posixGroup. Celles-ci apportent les attributs indispensables à l'authentification système via NSS/PAM : uidNumber (identifiant utilisateur), gidNumber (identifiant de groupe), homeDirectory (répertoire personnel) et loginShell (interpréteur de commandes).

👤 {3}inetorgperson : Le standard pour les applications

C'est la classe d'objet la plus utilisée au monde pour représenter des utilisateurs dans les services Web. Elle hérite de la classe person et ajoute des attributs de communication modernes comme mail, givenName (prénom), mobile ou employeeNumber. C'est le référentiel par défaut de la majorité des applications Web (comme le service de trombinoscope de ce document) pour l'authentification.

Q124.

Où sont stockées les bases définies par défaut lors de l'installation du paquet slapd ?

Recherchez la clé olcDbDirectory dans la configuration de l'annuaire.

sudo ldapsearch -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

Les fichiers des bases Berkeley DB sont stockés dans le répertoire /var/lib/ldap.

sudo ls -lAh /var/lib/ldap/
total 48K
-rw------- 1 openldap openldap  44K 10 mai   15:29 data.mdb
-rw------- 1 openldap openldap 8,0K 10 mai   15:50 lock.mdb

En maîtrisant la lecture de ces entrées de la base de configuration cn=config, vous êtes désormais en mesure de relier chaque paramètre du fichier LDIF au comportement effectif du service slapd, et de poursuivre l’analyse à l’aide des outils en ligne de commande comme ldapsearch.