En effet, dans un annuaire openldap, il n’existe pas pour un objet de classe posixAccount d’attribut listant les groupes auxquels il appartient. Ce sont les objets de type posixGroup qui eux, par l’intermédiaire de l’attribut memberUid, listent leurs membres. Il n’est par conséquent pas possible de lister les groupes auxquels appartient un utilisateur directement et en une seule requête à partir de son objet dans l’annuaire. On peut corriger ça avec le fait d’implémenter l’overlay « memberof » avec Openldap.
Pour faciliter les choses, il existe parmi les modules supplémentaires à charger avec openldap l’overlay memberof. Celui-ci ajoutera aux objets représentant un utilisateur, l’attribut calculé memberof, contenant la liste des groupes auxquels il appartient.
Cela ajoute un côté pratique car une requête sur le compte de l’utilisateur remontera immédiatement ses groupes, mais en plus certaines applications nécessitent l’utilisation de cet overlay. C’est le cas de nextcloud par exemple, qui ne saura pas importer les groupes de l’annuaire ldap auquel il est connecté sans cette fonctionnalité.
Sur la debian stretch qui motorise mon annuaire openldap, c’est le paquet slapd contenant le serveur openldap qui fournit la librairie ajoutant l’overlay memberof, il n’y a donc aucun paquet supplémentaire à installer.
Pour indiquer à openldap de charger la librairie ajoutant l’overlay, il faut éditer un fichier ldif en lui insérant le contenu suivant:
dn: cn=module,cn=config
cn:module
objectclass: olcModuleList
objectclass: top
olcmoduleload: memberof.la
olcmodulepath: /usr/lib/ldap
Y sont indiqués d’abord que l’on souhaite altérer la partie modules de la configuration, en lui ajoutant un module à charger, duquel on précise le fichier de description ainsi que le chemin d’accès à ce fichier. Pour activer la conf :
# ldapadd -Y EXTERNAL -H ldapi:/// -f mon_fichier_ldif_chargement_module.ldif
Ensuite il faut décrire la nouvelle classe d’objet overlay de type memberof, dans la racine de notre serveur ldap. Comme pour le chargement du module, cela passe par un fichier ldif dont voici un exemple de contenu:
dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
On le charge:
# ldapadd -Y EXTERNAL -H ldapi:/// -f mon_fichier_ldif_creation_overlay.ldif
A partir de maintenant, il est possible de requêter l’appartenance aux groupes à partir du compte d’un utilisateur :
# ldapsearch -Y EXTERNAL -H ldap:/// uid=mon_utilisateur memberof
...
dn: uid=mon_utilisateur,ou=users,dc=annuaire,dc=local
memberOf: cn=un_group,ou=groups,dc=annuaire,dc=local
...
A noter que, comme on le voit dans le fichier de configuration de l’overlay, ça fonctionne avec les groupes de classe groupOfNames (pas avec la classe posixGroup).
Enfin, pour aller plus loin, je recommande la lecture de ce très bon tutoriel sur openldap, notamment la partie sur les overlays, merci à son auteur.
o/