Migration OpenLDAP 2.2 vers OpenLDAP 2.4

Parfois, certains serveurs sont là depuis tellement longtemps qu'on n'y prête même plus attention. Et pourtant, il arrive qu'ils fassent tourner des applications assez sensible, parfois même critique.

C'est le cas de ce serveur OpenLDAP qui tourne sur une RedHat 5, sans licence (donc sans yum) et dont la version …

Parfois, certains serveurs sont là depuis tellement longtemps qu'on n'y prête même plus attention. Et pourtant, il arrive qu'ils fassent tourner des applications assez sensible, parfois même critique.

C'est le cas de ce serveur OpenLDAP qui tourne sur une RedHat 5, sans licence (donc sans yum) et dont la version 2.2 d'OpenLDAP installée a été compilée dans /usr/local. Typiquement le genre de serveur dont personne ne veut s'occuper parce qu'il est difficile à maintenir et il est également difficile de s'en débarrasser car il faut pouvoir sortir les applications qui y tournent.

Avec un collègue nous nous sommes donc attelé à cette tâche, non sans peine. Il n'était à priori pas difficile de sortir un annuaire OpenLDAP 2.2 vers un nouvel annuaire OpenLDAP 2.2 mais l’intérêt de cette manipulation était assez limité. Nous avons donc décidé de migrer vers la version 2.4 d'OpenLDAP proposée dans les dépôts de CentOS 7. Nous souhaitions également profiter de cette migration pour passer d'une configuration fichier (slapd.conf) à une configuration en base (olc, en gros OpenLDAP stock sa configuration dans une base LDAP). Voici la méthode employée pour réussir cette opération :

La première étape est de récupérer les informations dont nous avons besoin sur l'ancien serveur. Nous avons besoin de son fichier de configuration (slapd.conf, que nous allons renommer vieuxslapd.conf) et du contenu de la base. Pour cela nous allons utiliser l'outil slapcat qui va générer un fichier ldif. Ces 2 fichiers seront à transférer sur le nouveau serveur. Si vous utilisez des schémas spécifique, il faudra également les récupérer.

[aldevar@vieuxserveur]# slapcat -f /chemin/vers/vieuwslapd.conf -l /tmp/vieuxslap.ldif

Sur notre nouvelle machine CentOS 7, à jour, on installe openldap-servers et openldap-clients

[aldevar@serveur]# yum -y install openldap-servers openldap-clients

Configuration des logs d'OpenLDAP

[aldevar@serveur]# echo "local4.*       /var/log/slapd.log" > /etc/rsyslog.d/slapd.conf
[aldevar@serveur]# systemctl restart rsyslog.service

Dans notre cas, il était nécessaire de nettoyer l'ancien fichier de configuration. | Pour vérifier si que le fichier de conf est valide, on utilise slaptest

[aldevar@serveur]# slaptest -f vieuxslapd.conf

Celui ci nous retourne des erreurs que nous corrigeons.

[aldevar@serveur]# sed -i -e "s/attr=/attrs=/g" vieuxslapd.conf
[aldevar@serveur]# sed -i -e "/pidfile/d" /root/vieuxslapd.conf
[aldevar@serveur]# sed -i -e "/argsfile/d" /root/vieuxslapd.conf
[aldevar@serveur]# sed -i -e "s;directory /var/ldap/annuaireldap;directory /var/lib/ldap;" /root/vieuxslapd.conf

Nous utilisons le schéma de samba, pour le récupérer nous installons samba

[aldevar@serveur]# yum -y install samba

On copie les fichiers schéma récupérés sur l'ancien serveur dans le bon répertoire :

[aldevar@serveur]# cp *.schema /etc/openldap/schema/
[aldevar@serveur]# chown ldap. /etc/openldap/schema/*

Maintenant, nous allons corriger une incompatibilité sur laquelle nous avons bloqué un bon moment. OpenLDAP ajoute pour chaque entrée un attribut entryUUID qu'il provisionne automatiquement. Entre la version 2.2 et notre version 2.4, la format de la valeur d'entryUUID a changé. Il est passé d'une suite de caractères aléatoire à 4 série de caractères hexadécimaux séparés par des -. Tant que nous n'avions pas trouver de solution à cette incompatibilité, aucune entrée de ne pouvait être ajoutée dans notre nouvelle base. C'est d’ailleurs la raison pour laquelle nous ne pouvions pas mettre en place de synchronisation entre les 2 instances.

La solution, radicale et rapide est de supprimer les entrées entryUUID

[aldevar@serveur]# sed -i -e "/entryUUID/d" vieuxslap.ldif

Une fois ces étapes effectuée, nous devrions être prêt pour tester l'import des données. Pour cela, nous utilisons l'outil slapadd qui à l'avantage de pouvoir travailler sans daemon ldap actif. En lui fournissant le fichier de configuration il est capable d'écrire directement dans les fichiers de la base. Dans un premier temps, nous le lançons avec l'option -u afin de le lancer en mode dry-run.

[aldevar@serveur]# slapadd -f vieuxslapd.conf  -c -u -o schema-check=yes -l vieuxslap.ldif

Si cette commande ne sort pas d'erreurs, on peut la faire en réelle.

[aldevar@serveur]# slapadd -f vieuxslapd.conf  -c -o schema-check=yes -l vieuxslap.ldif

A partir de là, on dispose d'une base ldap fonctionnelle et si on lance la daemon slapd en lui fournissant le fichier de configuration, tout devrait fonctionner.

[aldevar@serveur]# slapd -u ldap -f vieuxslapd.conf

Mais, comme je l'ai dit plus haut, la bonne pratique est plutôt de stocker la configuration en base olc. Cette base se trouve dans /etc/openldap/slapd.d et contient déjà de quoi faire fonctionner un slapd basique mais vide. L'utilitaire slaptest que nous avons utilisé pour vérifier le fichier de configuration est également utilisé pour faire cette migration. En lui fournissant d'un coté le fichier de configuration et de l'autre le dossier de destination, il va transformer le contenu du fichier en instructions ldif.

Avant tout, on supprime le contenu actuel du répertoire.

[aldevar@serveur]# rm -Rf /etc/openldap/slapd.d/*

On lance la migration de la configuration

[aldevar@serveur]# slaptest -f vieuxslapd.conf -F /etc/openldap/slapd.d/

0n corrige les droits pour que le daemon puisse travailler

[aldevar@serveur]# chown -R ldap. /etc/openldap/slapd.d/

Enfin, on importe le fichier DB_CONFIG afin d'avoir des performances normales sur la base

[aldevar@serveur]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
[aldevar@serveur]# chown ldap. /var/lib/ldap/DB_CONFIG

Pour finir, on peut démarrer le daemon

[aldevar@serveur]# systemctl start slapd
[aldevar@serveur]# systemctl enable slapd