Dynamique de groupe

Les groupes dynamiques en LDAP sont une fonctionnalité très intéressante, permettant de lister les membres d'un groupe par rapport à un filtre LDAP, ce qui évite de maintenir la liste des membres de manière statique.

Par exemple :

dn: cn=test,ou=groups,dc=example,dc=com
objectClass: groupOfURLs
objectClass: top
cn: test
memberURL: ldap:///ou=users,dc=example,dc=com??one?(description=*test*)

Ce groupe contiendra toutes les entrées de la branche ou=users,dc=example,dc=com possédant test dans l'attribut description.

Au vert lait

Dans OpenLDAP, les groupes dynamiques ne sont pas activés par défaut, il faut pour les utiliser charger l'overlay dynlist. Et pour utiliser la classe d'objet groupOfURLs, il faut également charger un schéma.

Cela peut-être fait simplement dans cn=config avec le LDIF suivant :

dn: cn=dyngroup,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: dyngroup
olcObjectIdentifier: {0}NetscapeRoot 2.16.840.1.113730
olcObjectIdentifier: {1}NetscapeLDAP NetscapeRoot:3
olcObjectIdentifier: {2}NetscapeLDAPattributeType NetscapeLDAP:1
olcObjectIdentifier: {3}NetscapeLDAPobjectClass NetscapeLDAP:2
olcObjectIdentifier: {4}OpenLDAPExp11 1.3.6.1.4.1.4203.666.11
olcObjectIdentifier: {5}DynGroupBase OpenLDAPExp11:8
olcObjectIdentifier: {6}DynGroupAttr DynGroupBase:1
olcObjectIdentifier: {7}DynGroupOC DynGroupBase:2
olcAttributeTypes: {0}( NetscapeLDAPattributeType:198 NAME 'memberURL' DESC 'I
 dentifies an URL associated with each member of a group. Any type of labeled 
 URL can be used.' SUP labeledURI )
olcAttributeTypes: {1}( DynGroupAttr:1 NAME 'dgIdentity' DESC 'Identity to use
  when processing the memberURL' SUP distinguishedName SINGLE-VALUE )
olcAttributeTypes: {2}( DynGroupAttr:2 NAME 'dgAuthz' DESC 'Optional authoriza
 tion rules that determine who is allowed to assume the dgIdentity' EQUALITY a
 uthzMatch SYNTAX 1.3.6.1.4.1.4203.666.2.7 X-ORDERED 'VALUES' )
olcObjectClasses: {0}( NetscapeLDAPobjectClass:33 NAME 'groupOfURLs' SUP top S
 TRUCTURAL MUST cn MAY ( memberURL $ businessCategory $ description $ o $ ou $
  owner $ seeAlso ) )
olcObjectClasses: {1}( DynGroupOC:1 NAME 'dgIdentityAux' SUP top AUXILIARY MAY
  ( dgIdentity $ dgAuthz ) )

dn: olcOverlay=dynlist,olcDatabase={1}bdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcDynamicList
olcOverlay: dynlist
olcDlAttrSet: {0}groupOfURLs memberURL uniqueMember

Comme vous êtes des lecteurs avisés, vous aurez noté qu'on peut utiliser d'autres classes d'objet que groupOfURLs, puisque cela dépend de la configuration de l'overlay dynlist (attribut olcDlAttrSet). Pour plus de détails, voir la page de manuel de l'overlay dynlist (man slapo-dynlist).

Tri sélectif

Cet overlay fonctionne bien sur des petits volumes mais les performances s'écroulent dès le le groupe dynamique doit contenir plusieurs milliers d'utilisateurs.

Le secret réside dans l'option sortvals (olcSortVals dans cn=config) qui active le tri des valeurs sur certains attributs. D'après le manuel :

       olcSortVals <attr> [...]
              Specify  a  list  of  multi-valued attributes whose values will always be maintained in sorted order. Using
              this option will allow Modify, Compare, and filter evaluations on these attributes  to  be  performed  more
              efficiently.  The  resulting  sort  order  depends on the attributes' syntax and matching rules and may not
              correspond to lexical order or any other recognizable order.  This setting is only allowed in the  frontend
              entry.

Dans notre cas, nous allons trier les valeurs de l'attribut uniqueMember :

dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcSortVals
olcSortVals: uniqueMember

Dès l'application de ce paramètre, l'affichage de groupes dynamiques de plusieurs milliers d'utilisateurs ne prendra que quelques secondes !