Version française. English version available here.
Le backup des données est un élément crucial dans l'exploitation du SI.
Les annuaires LDAP n'échappent pas à la règle et il est important de maîtriser la sauvegarde et la restauration de leur contenu.
On va parler ici de l'annuaire Forgerock DS (DS pour Directory Server, autrefois on disait opendj c'était plus simple pour les recherches sur Google, mais c'est la vie).
Le backstage de Forgerock propose plusieurs KB à ce sujet:
Le contenu de l'article suivant est orienté vers une version Forgerock DS 6.5 de l'annuaire . On notera que la version 7 apporte son lot de nouveautés sur le backup comme indiqué sur https://backstage.forgerock.com/docs/ds/7/release-notes/whats-new.html#whats-new-700 "New, simplified implementation with cloud storage support". Nous discuterons probablement de ces nouveautés dans un autre article.
Comme indiqué dans la première KB que j'ai listée ci-dessus, le backup d'un DS nécessite la sauvegarde de certains fichiers et l'export du contenu de la base LDAP. Je passe sur la sauvegarde des fichiers qui ne devrait pas poser de problème.
Voici un premier script qui pourrait jouer ce rôle:
#!/usr/bin/bash
# forgerock DS backup script
# opendj backup script
DS_HOME="/chemin/vers/ds"
DS_HOSTNAME="FQDN.du.serveur.DS"
DS_ADM_PORT=4444 # port admin par défaut à adapter en fonction du contexte
DS_ADM_LOGIN="cn=directory manager" # il ne faut pas utiliser ce compte! ok, ca fonctionne mais c'est mal (lire la suite de l'article)
DS_ADM_PWD="mon joli mot de passe du compte ci-dessus" # donc, si tu utilises le compte d'admin, toute personne qui lit ton script de backup a gagné tous les droits sur ton annuaire!
DS_BKP_REP="/chemin/où/on/garde/les/sauvegardes"
# la commande qui compte est ci-dessous, ici on va faire un backup full de tous les backends de l'annuaire
${DS_HOME}/bin/backup --hostname $DS_HOSTNAME \
--port $DS_ADM_PORT \
--bindDN "$DS_ADM_LOGIN" \
-w "$DS_ADM_PWD"
--backUpAll \
--backupDirectory "${DS_BKP_REP}/backends \
--trustAll
Comme je l'ai indiqué dans le bout de code ci-dessus, utiliser le compte admin (cn=directory manager) dans son script de sauvegarde est un raccourci simple mais dangereux.
Alors créons un compte dédié pour le backup!
Comme on sait qu'il faut RTFM, on va sur https://backstage.forgerock.com/docs/ds/6.5/security-guide/#table-directory-managers et on voit les informations suivantes:
Back up and restore directory data
File system access for backup data and exported LDIF;
access to create entries under cn=tasks;
DS server privileges: backend-backup, backend-restore, ldif-export, ldif-import
Première étape, c'est des droits sur le FS, c'est facile, on fait ça avec un bon vieux chown avec le user linux qui va exécuter le script de backup sur le répertoire DS_BKP_REP.
La deuxième étape manque de documentation, j'en parle plus bas, de toutes les manières j'ai besoin de gérer le 3ème point avant.
On va donc commencer par ajouter le compte à l'annuaire ldap en préparant ce joli fichier ldif qui contient les privilèges indiqués:
#!/usr/bin/bash
# create forgerock ds backup user
# create opendj backup user
dn: uid=backup_user,ou=services,dc=example,dc=com
changetype: add
objectClass: top
objectClass: organizationalPerson
objectClass: inetorgperson
objectClass: person
cn: backup_user
sn: backup_user
uid: backup_user
userPassword: ****
ds-privilege-name: backend-restore
ds-privilege-name: backend-backup
ds-privilege-name: ldif-export
ds-privilege-name: ldif-import
et on importe le ldif dans l'annuaire avec un bon ldapmodify des familles ou avec votre éditeur ldap préféré.
On peut alors finir par l'étape du milieu qui consiste à ajouter une global-aci sur cn=tasks pour le user de backup:
#!/usr/bin/bash
# add global aci to backup user
DS_HOME="/chemin/vers/DS"
DS_HOSTNAME="FQDN.du.serveur.DS"
DS_ADM_PORT=4444 # port d'admin par défaut, à adapter en fonction du contexte
DS_ADM_LOGIN="cn=directory manager" # là pour le coup, on utilise compte, sauf si on en a un autre qui dispose du bon droit
DS_ADM_PWD="mon joli mot de passe du compte ci-dessus"
BACKUP_USER_DN="uid=backup_user,ou=services,dc=example,dc=com"
${DS_HOME}/bin/dsconfig --hostname $DS_HOSTNAME \
--port $DS_ADM_PORT \
--bindDN "$DS_ADM_LOGIN" \
-w $DS_ADM_PWD \
--trustAll \
set-access-control-handler-prop \
--add global-aci:\(target=\"ldap:///cn=tasks\"\)\(targetattr=\"*\"\)\(version\ 3.0\;\ acl\ \"Service\ Account\ Backup\"\;\ allow\ \(add,write,read,search,compare\)\ userdn=\"ldap:///${BACKUP_USER_DN}\"\;\) \
--no-prompt
On peut alors modifier le script de backup du début de l'article pour utiliser les creds du compte de backup et exécuter la commande backup sans obtenir l'erreur suivante:
You have provided options for scheduling this operation as a task but options provided for connecting to the server's tasks backend resulted in the following error: 'Insufficient Access Rights: The entry ds-task-id=20201101234606219,cn=Scheduled Tasks,cn=Tasks cannot be added due to insufficient access rights'
Joie et bonheur.
Je vous laisse adapter tout ça pour faire des backups en mode incremental.
Une prochaine fois on parlera de la restauration du backup (parce que c'est bien de sauvegarder, mais il faut aussi savoir faire un restore!).
PS (07/05/2021): je vois qu'il y a un article medium qui parle d'un sujet similaire
Benjamin Sebbah
N'hésitez pas à laisser un commentaire ici