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