TOOLinux

Le journal du Libre

Astuce OpenLDAP : Des groupes dynamiques ? Jamais sans tri des valeurs !

jeudi 10 janvier 2013

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 : 0NetscapeRoot 2.16.840.1.113730
olcObjectIdentifier : 1NetscapeLDAP NetscapeRoot:3
olcObjectIdentifier : 2NetscapeLDAPattributeType NetscapeLDAP:1
olcObjectIdentifier : 3NetscapeLDAPobjectClass NetscapeLDAP:2
olcObjectIdentifier : 4OpenLDAPExp11 1.3.6.1.4.1.4203.666.11
olcObjectIdentifier : 5DynGroupBase OpenLDAPExp11:8
olcObjectIdentifier : 6DynGroupAttr DynGroupBase:1
olcObjectIdentifier : 7DynGroupOC 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=1bdb,cn=config
objectClass : olcOverlayConfig
objectClass : olcDynamicList
olcOverlay : dynlist
olcDlAttrSet : 0groupOfURLs 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=-1frontend,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 !

- Clément OUDOT