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 !