Le projet LDAP Tool Box rassemble de nombreux outils destinés à simplifier l’administration des annuaires LDAP, le slogan du projet étant d’ailleurs “Even LDAP administrators need help”.

Logo LTB hexagone

Nous allons présenter slapd-cli, l’utilitaire inclus dans les paquets OpenLDAP LTB et qui permet la gestion du service et bien d’autres choses que nous allons vous faire découvrir dans cet article.

Historique

Le projet communautaire OpenLDAP se concentre sur le développement du logiciel, en langage C, et livre à chaque nouvelle version uniquement le code source, qu’il faut compiler.

Logo OpenLDAP

Sur ce point le projet LTB, à l’instar d’autres distributions ou éditeurs, fournit des paquets afin de simplifier le déploiement d’OpenLDAP sur les serveurs.

Mais au-delà du code source qu’il faut compiler, il manque également des outils comme un script de démarrage et d’arrêt du processus. Depuis un OpenLDAP “vanilla”, démarrer le service nécessite de taper une commande comme :

slapd -h "ldap://*:389 ldaps://*:636' -F /opt/openldap/slapd.d -u ldap -g ldap

Pas forcément très pratique, même si on sait se servir de son historique shell…

Le projet LTB a donc décidé de fournir un outil pour masquer cette complexité. À l’origine, systemd n’était pas encore adopté et ces opérations étaient faites par des scripts d’init. Les permières versions de slapd-cli se nommaient alors openldap-initscript et démarrer le service revenait alors à taper cette commande :

service slapd start

Un peu plus intuitif donc !

Outre les actions de démarrage, arrêt et relance, le projet LTB a commencé à ajouter des commandes pour vérifier la configuration, sauvegarder les données ou la configuration, ou bien les restaurer. Très utile mais pas vraiment lié au rôle des commandes d’init.

Depuis l’arrivée de systemd, qui s’est imposé sur la majeure partie des distributions, les développeurs du projet LTB ont donc choisi de décoreller les actions de gestion du service (appelées par systemctl) et les autres actions. L’utilitaire a alors été renommé slapd-cli, slapd comme le nom du binaire principal d’OpenLDAP, et cli comme Command Line Interface.

Le script est configurable dans le fichier slapd-cli.conf situé par défaut dans /usr/local/openldap/etc/openldap/.

Gestion du service

Arrêt et redémarrage

Ce sont les actions gérées nativement par systemd, on peut donc utiliser au choix la commande systemctl ou la commande slapd-cli pour les lancer.

Démarrer OpenLDAP :

systemctl start slapd-ltb
sldap-cli start

Stopper OpenLDAP :

systemctl stop slapd-ltb
sldap-cli stop

Redémarrer OpenLDAP :

systemctl restart slapd-ltb
sldap-cli restart

Par défaut OpenLDAP écoutera en ldap://, ldaps:// et ldapi://. Mais cela est bien entendu configurable :

IP="*"
PORT="389"
SSLIP="*"
SSLPORT="636"
LDAPI_SOCKETDIR="/var/run/slapd"
LDAPI_SOCKETURL="%2Fvar%2Frun%2Fslapd%2Fldapi"
SLAPD_SERVICES="ldap://$IP:$PORT ldaps://$SSLIP:$SSLPORT ldapi://$LDAPI_SOCKETURL"

Statut

L’affichage du statut du service sera différent entre les deux commandes :

systemctl status slapd-ltb
● slapd-ltb.service - OpenLDAP LTB startup script
     Loaded: loaded (/lib/systemd/system/slapd-ltb.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-05-31 13:44:39 UTC; 1 weeks 0 days ago
       Docs: https://ltb-project.org/documentation
    Process: 237824 ExecStart=/usr/local/openldap/sbin/slapd-cli start (code=exited, status=0/SUCCESS)
   Main PID: 237850 (slapd)
      Tasks: 18 (limit: 2318)
     Memory: 161.9M
        CPU: 1h 45min 37.739s
     CGroup: /system.slice/slapd-ltb.service
             └─237850 /usr/local/openldap/libexec/slapd -h ldap://127.0.0.1:389 ldapi://%2Fvar%2Frun%2Fslapd%2Fldapi -F /usr/local/openldap/etc/openldap/slapd.d
slapd-cli status
slapd-cli: [INFO] Using /usr/local/openldap/etc/openldap/slapd-cli.conf for configuration
slapd-cli: [INFO] LDAP Tool Box slapd-cli script version 3.4
slapd-cli: [INFO] Process OpenLDAP is running (PID 237850)
slapd-cli: [INFO] Detected OpenLDAP version: slapd 2.5.18 (May 20 2024 22:00:00)
slapd-cli: [INFO] Listening to services ldap://127.0.0.1:389 ldapi://%2Fvar%2Frun%2Fslapd%2Fldapi
slapd-cli: [INFO] Process usage:  1.0% CPU /  8.1% MEM
slapd-cli: [INFO] Detected suffix: dc=example,dc=com

On voit qu’avec slapd-cli on peut retrouver rapidement la version d’OpenLDAP ainsi que le suffixe des données.

Mode debug

Bien qu’il soit possible d’investiguer un problème en regardant les logs, OpenLDAP possède la faculté de démarrer en foreground et d’afficher ses logs dans la console :

slapd-cli debug

Le niveau de verbosité est configurable dans le paramètre DEBUG_LEVEL. Pour le niveau maximum :

DEBUG_LEVEL="-1"

Index

Si vous modifiez la configuration des index vous devrez réindexer vos données.

Pour être tout à fait exact, cela est nécessaire sauf si vous avez modifié la configuration directement dans cn=config, car dans ce cas OpenLDAP lance automatiquement en tâche de fond l’indexation voulue.

Dans le cas contraire, cette commande fera le travail :

slapd-cli reindex

Sauvegardes et restauration

C’est certainement l’une des fonctionnalités les plus appréciées de slapd-cli : pouvoir exporter et importer ses données et configuration en une seule ligne de commande

Configuration

Sauvegarder la configuration :

slapd-cli backupconfig
slapd-cli: [INFO] Using /usr/local/openldap/etc/openldap/slapd-cli.conf for configuration
slapd-cli: [INFO] Launching OpenLDAP configuration backup...
slapd-cli: [OK] Configuration saved in /var/backups/openldap/config-20240614153530.ldif

Restaurer la dernière configuration :

slapd-cli restoreconfig
slapd-cli: [INFO] Using /usr/local/openldap/etc/openldap/slapd-cli.conf for configuration
slapd-cli: [INFO] Halting OpenLDAP...
slapd-cli: [OK] OpenLDAP stopped
slapd-cli: [INFO] No data backup done
slapd-cli: [INFO] Launching OpenLDAP configuration restore...
slapd-cli: [INFO] Restore configuration file /var/backups/openldap/config-20240614153530.ldif
Closing DB...
slapd-cli: [OK] Configuration restored
slapd-cli: [INFO] Launching OpenLDAP configuration test...
slapd-cli: [OK] OpenLDAP configuration test successful
slapd-cli: [INFO] Launching OpenLDAP...
slapd-cli: [OK] File descriptor limit set to 1024
slapd-cli: [OK] OpenLDAP started

Données

Sauvegarder les données :

slapd-cli backup
slapd-cli: [INFO] Using /usr/local/openldap/etc/openldap/slapd-cli.conf for configuration
slapd-cli: [INFO] Launching OpenLDAP database backup...
slapd-cli: [OK] data saved in /var/backups/openldap/openldap-data-20240614153819.ldif

Restaurer les données depuis la dernière sauvegarde :

slapd-cli restore
slapd-cli: [INFO] Using /usr/local/openldap/etc/openldap/slapd-cli.conf for configuration
slapd-cli: [INFO] Halting OpenLDAP...
slapd-cli: [OK] OpenLDAP stopped
slapd-cli: [INFO] No data backup done
slapd-cli: [INFO] Launching OpenLDAP database restore...
slapd-cli: [INFO] Restore file /var/backups/openldap/openldap-data-20240614153819.ldif for dc=example,dc=com
Closing DB...
slapd-cli: [OK] Data restored for dc=example,dc=com
slapd-cli: [INFO] Launching OpenLDAP...
slapd-cli: [OK] File descriptor limit set to 1024
slapd-cli: [OK] OpenLDAP started

Paramétrage

Comme les autres actions, la sauvegarde/restauration peut se paramétrer :

BACKUP_AT_SHUTDOWN="0"
BACKUP_PATH="/var/backups/openldap"
BACKUP_SUFFIX="`date +%Y%m%d%H%M%S`.ldif"
BACKUP_COMPRESS_EXT="" # gz, bz2, ...
BACKUP_COMPRESS_BIN="" # /bin/gzip, /bin/bzip2, ...
BACKUP_UNCOMPRESS_BIN="" # /bin/gunzip, /bin/bunzip2, ...
UMASK="umask"
MASK="0027"

En plus de ces options, les dernières version de slapd-cli permettent de purger automatiquement les sauvegardes trop anciennes :

BACKUP_CONFIG_DELETE_AFTER_DAYS="10"
BACKUP_DATA_DELETE_AFTER_DAYS="30"

slapd.conf ou cn=config ?

Choisir son format de configuration

C’est un sujet qui anime encore beaucoup les discussions autour d’OpenLDAP. Depuis la version 2.3, le fichier slapd.conf laisse la place à un nouveau format, cn=config, dont l’avantage est de permettre une modification à chaud des paramètres de configuration.

Les préconisations de l’équipe OpenLDAP sont d’adopter ce nouveau format, l’ancien devant être supprimé dans une prochaine version. Mais face aux réactions de la communauté, les développeurs ont consenti à conserver la possibilité d’utiliser cet ancien format de fichier, toujours présent aujourd’hui dans les versions 2.5 et 2.6.

Quoi qu’il en soit, vous pouvez choisir quel format adopter avec slapd-cli en configurant soit SLAPD_CONF, soit SLAPD_CONF_DIR. Si les deux sont configurés, c’est le mode cn=config qui sera choisi :

SLAPD_PATH="/usr/local/openldap"
SLAPD_CONF="$SLAPD_PATH/etc/openldap/slapd.conf"
SLAPD_CONF_DIR="SLAPD_PATH/etc/openldap/slapd.d"

Initialisation de la configuration

Si vous n’avez pas préparé votre configuration, vous pouvez utiliser celle fournie par l’outil.

Il y a le choix entre les deux modes de stockage, ce qui est géré par des fichiers templates :

CONFIG_FLAT_TEMPLATE_FILE="config-template-${SLAPD_VERSION}.conf"
CONFIG_LDIF_TEMPLATE_FILE="config-template-${SLAPD_VERSION}.ldif"

Reste ensuite à les paramétrer :

CONFIG_SUFFIX="dc=my-domain,dc=com"
CONFIG_FQDN="ldap.my-domain.com"
CONFIG_LOGLEVEL="256"
CONFIG_LOGFILE="/var/log/slapd-ltb/slapd.log"
CONFIG_MANAGERROOTDN="cn=Manager,dc=my-domain,dc=com"
CONFIG_MANAGERROOTPW="secret"
CONFIG_CONFIGROOTDN="cn=config"
CONFIG_CONFIGROOTPW="secret"
CONFIG_MONITORROOTDN="cn=monitor"
CONFIG_MONITORROOTPW="secret"
CONFIG_DATADIR="${SLAPD_PATH}/var/openldap-data"

Puis importer, pour le mode slapd.conf :

slapd-cli importflatconfigtemplate

Ou pour le mode cn=config :

slapd-cli importldifconfigtemplate

Tester la configuration

Pour vérifier que la syntaxe de la configuration est correcte :

slapd-cli configtest

Convertir la configuration

Pour aider au passage à cn=config, l’outil fournit une commande pour la conversion :

slapd-cli convertconfig /path/to/slapd.conf config.ldif

Conversion automatique au démarrage

Bien que l’avis des développeurs LTB sur le choix du backend de configuration soit en phase avec celui des développeurs d’OpenLDAP, c’est-à-dire de privilégier l’usage uniquement de cn=config, l’utilitaire slapd-cli possède une option permettant de continuer à maintenir sa configuration dans le fichier slapd.conf, mais de convertir à la volée ce fichier dans le mode cn=config lors du démarrage :

CONVERT_CONF_AT_STARTUP="1"

Attention : cela écrasera tous les changements ayant été faits directement dans cn=config !

Statut de la synchronisation

Le projet LTB fournit déjà un script de supervision pour surveiller le statut de la synchronisation OpenLDAP (Check Syncrepl Status).

Pour l’avoir en ligne de commande :

slapd-cli checksync
slapd-cli: [INFO] Using /usr/local/openldap/etc/openldap/slapd-cli.conf for configuration
slapd-cli: [INFO] Checking synchronization...
Suffix: dc=example,dc=com
detected providers:
rid="001" provider="ldaps://ldap2.example.com" type="refreshAndPersist" retry="5 5 300 +" bindmethod="simple" binddn="cn=syncrepl,ou=dsa,dc=example,dc=com" credentials="secret" searchbase="dc=example,dc=com"

Checking contextCSN for suffix dc=example,dc=com on remote host ldaps://ldap2.example.com
  Checking SID #001#
    INFO: remote (20240614155432.671536Z#000000#001#000000) and local (20240614155432.671536Z#000000#001#000000) contextCSN found and synchronized
  Checking SID #002#
    INFO: remote (20240614155433.416314Z#000000#002#000000) and local (20240614155433.416314Z#000000#002#000000) contextCSN found and synchronized
slapd-cli: [OK] Local directory synchronized to every declared provider

Afin d’éviter les faux positifs, une tolérance est configurable dans la comparaison des dates :

TOLERANCE_CSN=1000000 # 1s of tolerance when comparing contextCSN

Injecttion de données de test

Si vous ne savez pas comment initialiser vos données, slapd_cli propose d’injecter des entrées de test dans l’annuaire, en construisant l’arbre complet.

Un fichier template est utilisé, adapté en fonction de la version d’OpenLDAP :

  • data-template-2.5.ldif
  • data-template-2.6.ldif

Celui-ci contient les principales branches, la configuration de la politique des mots de passe, ainsi qu’un compte de service. Tout cela est configurable :

DATA_TEMPLATE_FILE="data-template-${SLAPD_VERSION}.ldif"
DATA_SUFFIX="dc=my-domain,dc=com"
DATA_ORGANIZATION="My Organization"
DATA_SERVICEACCOUNT_DN="cn=my-account,ou=accounts,ou=infrastructure,${DATA_SUFFIX}"
DATA_SERVICEACCOUNT_PW="secret"

Les utilisateurs sont ensuite créés également en fonction de la configuration :

DATA_ADMIN_DJACKSON_DN="uid=daniel.jackson,ou=people,${DATA_SUFFIX}"
DATA_ADMIN_DJACKSON_PW="secret"
DATA_ADMIN_DJACKSON_UID="daniel.jackson"
DATA_ADMIN_DJACKSON_SN="Jackson"
DATA_ADMIN_DJACKSON_GN="Daniel"
DATA_ADMIN_DJACKSON_MAIL="daniel.jackson@my-example.com"
DATA_USER_JONEILL_DN="uid=jack.oneill,ou=people,${DATA_SUFFIX}"
DATA_USER_JONEILL_PW="secret"
DATA_USER_JONEILL_UID="jack.oneill"
DATA_USER_JONEILL_SN="O Neill"
DATA_USER_JONEILL_GN="Jack"
DATA_USER_JONEILL_MAIL="jack.oneill@my-example.com"
DATA_USER_SCARTER_DN="uid=samantha.carter,ou=people,${DATA_SUFFIX}"
DATA_USER_SCARTER_PW="secret"
DATA_USER_SCARTER_UID="samantha.carter"
DATA_USER_SCARTER_SN="Carter"
DATA_USER_SCARTER_GN="Samantha"
DATA_USER_SCARTER_MAIL="samantha.carter@my-example.com"
DATA_USER_TEALC_DN="uid=tealc,ou=people,${DATA_SUFFIX}"
DATA_USER_TEALC_PW="secret"
DATA_USER_TEALC_UID="tealc"
DATA_USER_TEALC_SN="Jaffa"
DATA_USER_TEALC_GN="TealC"
DATA_USER_TEALC_MAIL="tealc@my-example.com"
DATA_ORGANIZATIONS="SG1,SG2"

Et il est bien entendu possible d’ajouter plus de comptes, en reprenant le modèle ci-dessus.

Pour importer ces données :

slapd-cli importdatatemplate

Pour les experts

Protocole Proxy

Si vous utilisez OpenLDAP derrière HAProxy, vous êtes certainement confronté à ce problème : les adresses IP stockées dans les logs d’OpenLDAP sont celles des serveurs HAProxy, et pas les adresses réelles des clients LDAP.

Depuis OpenLDAP 2.5, il est possible d’activer le protocole proxy (pldap:// et pldaps://) et de récupérer les adresses IP correctes.

Configurer ce protocole dans slapd-cli.conf :

PIP="*"
PPORT="8389"
PSSLIP="*"
PSSLPORT="8636"

SLAPD_SERVICES="ldap://$IP:$PORT ldaps://$SSLIP:$SSLPORT ldapi://$LDAPI_SOCKETURL pldap://$PIP:$PPORT pldaps://$PSSLIP:$PSSLPORT"

Puis adapter la configuration de HAProxy pour utiliser le protocole proxy v2, par exemple :

 backend openldap_servers
     balance roundrobin
     server openldap1 openldap1:8389 check send-proxy-v2
     server openldap2 openldap2:8389 check send-proxy-v2

Dans les logs les bonnes adresses IP apparaitront :

proxyp(17): via IP=10.10.10.10:12345
conn=1000 fd=17 ACCEPT from IP=192.168.1.1:23456 (IP=0.0.0.0:8389)
conn=1000 op=0 BIND dn="" method=128
conn=1000 op=0 RESULT tag=97 err=0 qtime=0.000034 etime=0.000150 text=
conn=1000 fd=17 closed

Attention : il est recommandé de filtrer l’accès aux annuaires avec un pare-feu afin que seuls les serveurs HAProxy puissent y accéder.

Voir aussi la documentation LTB officielle.

Load Balancer

Depuis OpenLDAP 2.5 également un nouveau service est apparu : lload.

Il s’agit d’un équilibreur de charge (load balancer) spécialisé dans le protocole LDAP. Le service peut être géré à travers slapd-cli :

slapd-cli lloadstart
slapd-cli lloadstop
slapd-cli lloadstatus

Et le paramétrage associé :

LLOAD_IP="*"
LLOAD_PORT="3389"
LLOAD_SSLIP="*"
LLOAD_SSLPORT="6636"
LLOAD_SOCKETURL="%2Fvar%2Frun%2Fslapd%2Flload"
LLOAD_SERVICES="ldap://${LLOAD_IP}:${LLOAD_PORT} ldaps://${LLOAD_SSLIP}:${LLOAD_SSLPORT} ldapi://$LLOAD_SOCKETURL"
LLOAD_PID_FILE="$SLAPD_PATH/var/run/lload.pid"
LLOAD_CONF="$SLAPD_PATH/etc/openldap/lload.conf"
LLOAD_CONF_DIR=""

Conclusion

Nous espérons que cet article vous aura fait découvrir tout ce que ce petit outil peut faire pour vous !

Le plus simple est d’utiliser les paquets OpenLDAP LTB pour bénéficier simplement de slapd-cli et utiliser sa dernière version.