Dans cette partie, vous allez installer les paquets du service OpenLDAP, vérifier son état, puis préparer une configuration reproductible.
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.
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.
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 À 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 |
|
En l'état actuel, le paquet L’objectif est donc de :
Créez le script #!/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 :
Le format est très simple :
Dans le Heredoc ci-dessus, LDIF est utilisé pour décrire la configuration du serveur lui‑même (arbre |
|
|
Q117. |
Qu'est que la configuration dynamique d'OpenLDAP ? |
|
OpenLDAP utilise une base spéciale,
Lorsque Debian installe |
|
|
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 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 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 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.
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_mdbcharge 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
Argon2dans 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
olcAccessdéfinit une règle d’accès : ici, les accès de gestion sont autorisés à l'utilisateurrootvia l’authentificationpeercred(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
rootviapeercred.
-
- 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,subAprè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.).
-
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.
