LDAP : les types de groupes

Les annuaires LDAP sont principalement utilisés pour gérer 2 types d'objets :

  • les comptes utilisateurs (qui vont permettre une authentification centralisée)
  • des groupes d'utilisateurs (qui vont permettre une gestion de droits).

D'autres objets annexes sont souvent ajoutés, qui ont un rôle de "listes de valeurs".

Nous allons voir dans cet article les différents types de groupes qui peuvent être utilisés, sachant que selon les RFC LDAP 4519, seuls les premiers sont vraiment standardisés.

Groupes statiques

A l'origine, les groupes statiques, définis par les classes d'objet groupOfNames et groupOfUniqueNames sont juste une liste de membres (donnés par leur DN).

Dans un groupe de type groupOfNames, l'attribut utilisé est member, et on peut avoir plusieurs fois le même membre.

Dans un groupe de type groupOfUniqueNames, l'attribut utilisé est uniqueMember, et on peut avoir une seule occurence pour chaque membre.

Exemple :

dn: cn=firstGroup,ou=Groups,dc=example,dc=com
objectclass: top
objectclass: groupofnames
member: uid=john.doe,ou=People,dc=example,dc=com
cn: firstGroup

On peut donc récupérer facilement tous les membres d'un groupe statique, en listant les valeurs de l'attribut uniqueMember ou member, selon le cas. De même, pour connaître les groupes affectés à un utilisateur, on utilisera une recherche du type :

ldapsearch -b "dc=example,dc=com" -s sub  "(|(&(objectClass=groupOfNames)(member=uid=john.doe,ou=People,dc=example,dc=com)) \ 
(&(objectClass=groupOfUniqueNames) (uniqueMember=uid=john.doe,ou=People,dc=example,dc=com))

Avantages

C'est le seul type de groupe standardisé, et qui peut donc être utilisé par la plupart des applications ou équipements. Certains équipements réseaux par exemple peuvent utiliser les groupes pour valider les habilitations.

Inconvénients

Le principal inconvénient est la maintenance de ces groupes, puisque l'ajout ou le retrait des membres se fait de manière unitaire. Par défaut il n'y a pas de contrôle de cohérence, on peut donc ajouter comme membre d'un groupe un DN inexistant ; et si on supprime un utilisateur, son DN peut encore apparaître dans la liste des membres.

Note : certains annuaires utilisent un plugin d'intégrité référentiel, qui permet, à la suppression de l'entrée utilisateur, d'aller supprimer le DN correspondant des membres des groupes.

Groupes dynamiques

Il n'y a pas de définition formelle de type RFC pour les groupes dynamiques. L'implémentation dépend du fournisseur d'annuaire. Sur OpenLDAP par exemple, on trouve un overlay dynlist qui permet d'apporter cette fonctionnalité.

Sur les annuaires tels que Sun/Oracle DSEE, OpenDS et ses descendants (Forgerock OpenDJ, Oracle OUD, UnboundID/Ping Drectory), on utilise un groupe de type groupOfUrls.

Les groupes dynamiques utilisent un attribut memberURL qui permet de définir une requête LDAP, de la forme ldap:///BASE_DN?ATTRIBUTS?SCOPE?FILTRE.

Exemples de filtres :

ldap:///ou=People,dc=example,dc=com?uid,cn,sn?sub?(departmentNumber=IT)

Recherche à partir de la base DN ou=People,dc=example,dc=com, avec un scope de type subtree, les utilisateurs qui sont dans le département IT, et récupère uniquement les attributs uid, sn et cn.

Exemple :

dn: cn=IT-Staff,ou=Groups,dc=example,dc=com
objectclass: top
objectclass: groupOfURLs
cn: IT-staff
memberURL: ldap:///ou=People,dc=example,dc=com??sub?(departmentNumber=IT)

Avantages

Une fois que le filtre est défini, la gestion des membres est automatique, puisque basée sur les attributs de l'utilisateur.

Inconvénients

Par défaut, ce sont les clients qui doivent interpréter la requête LDAP présente dans l'attribut memberURL. On ne peut pas avoir la liste des membres rien qu'en faisant une requête sur le groupe, et on ne peut pas non plus avoir la liste des groupes d'un utilisateur en cherchant son DN dans les membres.

Pour pallier ce problème, la plupart des annuaires qui implèmentent les groupes dynamiques gèrent aussi un attribut virtuel isMemberOf, qui contient la liste des groupes dont l'utilisateur est membre.

Exemples

Si on injecte le contenu du fichier LDIF suivant dans un annuaire :

dn: ou=staff,ou=people,dc=example,dc=com
objectClass: organizationalunit
objectClass: top
ou: staff

dn: uid=john.doe,ou=staff,ou=people,dc=example,dc=com
givenName: John
objectClass: person
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: top
uid: john.doe
cn: John Doe
sn: Doe
departmentNumber: Finance

dn: uid=elliot.alderson,ou=staff,ou=people,dc=example,dc=com
givenName: Elliot
objectClass: person
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: top
uid: elliot.alderson
cn: Elliot Alderson
sn: Alderson
departmentNumber: IT

dn: uid=angela.moss,ou=staff,ou=people,dc=example,dc=com
givenName: Angela
objectClass: person
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: top
uid: angela.moss
cn: Angela Moss
sn: Moss
departmentNumber: IT

dn: ou=Groups,dc=example,dc=com
objectClass: organizationalunit
objectClass: top
ou: Groups

dn: cn=Staff,ou=Groups,dc=example,dc=com
objectclass: top
objectclass: groupofnames
member: uid=john.doe,ou=staff,ou=people,dc=example,dc=com
member: uid=elliot.alderson,ou=staff,ou=people,dc=example,dc=com
member: uid=angela.moss,ou=staff,ou=people,dc=example,dc=com
cn: Staff

dn: cn=IT-Staff,ou=Groups,dc=example,dc=com
objectclass: top
objectclass: groupOfURLs
cn: IT-staff
memberURL: ldap:///ou=People,dc=example,dc=com??sub?(departmentNumber=IT)

La recherche des groupes liés à Elliot Anderson donne le résultat suivant :

ldapsearch -b ou=groups,dc=example,dc=com member=uid=elliot.alderson,ou=staff,ou=people,dc=example,dc=com dn
dn: cn=Staff,ou=Groups,dc=example,dc=com

On ne trouve pas le groupe dynamique lié. Par contre, si on utilise l'attribut isMemberOf, on va avoir tous les groupes :

ldapsearch -b ou=people,dc=example,dc=com uid=elliot.alderson ismemberof
dn: uid=elliot.alderson,ou=staff,ou=people,dc=example,dc=com
ismemberof: cn=Staff,ou=Groups,dc=example,dc=com
ismemberof: cn=IT-Staff,ou=Groups,dc=example,dc=com

Groupes statiques virtuels

Pour tenter de concilier les avantages des deux types de groupes, certains annuaires implémentent un nouveau type de groupe : le groupe Virtuel Static Virtual Static Groups).

Les groupes virtuels statiques utilisent une classe d'objet spécifique, ds-virtual-static-group, et font référence à un groupe dynamique (qu'il faudra donc créer auparavant).

Exemple :

dn: cn=VS-IT-staff,ou=Groups,dc=example,dc=com
cn: VS-IT-staff
objectclass: top
objectclass: groupOfNames
objectclass: ds-virtual-static-group
ds-target-group-dn: cn=IT-Staff,ou=Groups,dc=example,dc=com

Si on ajoute le groupe, on le récupère dans l'attribut isMemberOf de l'utilisateur. Par exemple ;

/opt/opendj/bin/ldapsearch -b ou=staff,ou=people,dc=example,dc=com uid=elliot.alderson ismemberof
dn: uid=elliot.alderson,ou=staff,ou=people,dc=example,dc=com
ismemberof: cn=Staff,ou=Groups,dc=example,dc=com
ismemberof: cn=IT-Staff,ou=Groups,dc=example,dc=com
ismemberof: cn=VS-IT-staff,ou=Groups,dc=example,dc=com

Par contre par défaut le groupe virtuel statique ne donne pas la liste de ses membres :

ldapsearch -b ou=Groups,dc=example,dc=com cn=VS-IT-staff
dn: cn=VS-IT-staff,ou=Groups,dc=example,dc=com
cn: VS-IT-staff
ds-target-group-dn: cn=IT-Staff,ou=Groups,dc=example,dc=com
objectClass: groupOfNames
objectClass: ds-virtual-static-group
objectClass: top

Pour récupérer la liste des membres

La récupération de la liste des membres d'un groupe virtuel statique se fait à la volée, et peut donc être consommatrice de ressources, surtout sur de grosses volumétrie. La fonctionnalité est désactivée par défaut. On peut l'activer avec l'utilitaire dsconfig :

dsconfig set-virtual-attribute-prop --name "Virtual Static member" --set allow-retrieving-membership:true

Si on recherche directement le groupe , on a bien la liste des membres :

ldapsearch -b ou=Groups,dc=example,dc=com cn=VS-IT-staff
dn: cn=VS-IT-staff,ou=Groups,dc=example,dc=com
member: uid=elliot.alderson,ou=staff,ou=people,dc=example,dc=com
member: uid=angela.moss,ou=staff,ou=people,dc=example,dc=com
cn: VS-IT-staff
ds-target-group-dn: cn=IT-Staff,ou=Groups,dc=example,dc=com
objectClass: groupOfNames
objectClass: ds-virtual-static-group
objectClass: top
member: uid=elliot.alderson,ou=staff,ou=people,dc=example,dc=com
member: uid=angela.moss,ou=staff,ou=people,dc=example,dc=com

Ce type de groupe peut donc être utilisé si une application cliente veur récupérer la liste des membres, à partir du nom du groupe. Par contre, si on fait une recherche sur les membres, le groupe n'apparaît pas non plus :

 

ldapsearch -b ou=groups,dc=example,dc=com member=uid=elliot.alderson,ou=staff,ou=people,dc=example,dc=com dn
dn: cn=Staff,ou=Groups,dc=example,dc=com

 

Seul l'attribut isMemberOf contient l'ensemble des groupes affectés à la personne.


Catégorie