Bonnes pratiques de mise en œuvre des options d'attributs

OpenLDAP : activation des options d'attributs

L'utilisation des options pour le sous-typage des attributs est possible nativement dans OpenLDAP. Il faut seulement déclarer les options ou les préfixes admissibles. Cette déclaration est globale pour tous les attributs.

  • Un préfixe se termine par un -
  • Une fois le préfixe déclaré, toute option débutant par ce préfixe sera autorisée
  • Le préfixe lang- est déclaré de façon implicite (mais doit être redéclaré de façon explicite si d'autres préfixes ou options sont ajoutés)

Si nous voulons déclarer le préfixe x- (pour autoriser toutes les options à usage privé, non déclarées à l'IANA), on ajoute dans slapd.conf :

slapd.conf
attributeoptions lang- x-

En configuration dynamique, il faut modifier l'objet cn=config, et ajouter l'attribut olcAttributeOptions.

Écriture des valeurs

Pour ajouter deux valeurs de l'attribut supannCMSId à un utilisateur existant, dans deux encodages différents, on insère le LDIF suivant :

dn: uid=dupont,ou=people,dc=univ,dc=fr
changetype: modify
add: supannCmsId;x-mifare-xlsb
supannCmsId;x-mifare-xlsb: DEADBEEF000000
-
add: supannCmsId;x-mifare-xmsb
supannCmsId;x-mifare-xmsb: 000000EFBEADDE

Lecture et requêtage

On peut demander à lire toutes les valeurs, en spécifiant le type sans option. Dans ce cas, le serveur renvoie l'intégralité des valeurs :

# ldapsearch -x '(uid=dupont)' supannCmsId

dn: uid=dupont,ou=people,dc=unilim,dc=fr
supannCmsId;x-mifare-xlsb: DEADBEEF000000
supannCmsId;x-mifare-xmsb: 000000EFBEADDE

On peut demander à lire uniquement la valeur associée à une option :

# ldapsearch -x '(uid=dupont)' 'supannCmsId;x-mifare-xlsb'

dn: uid=dupont,ou=people,dc=unilim,dc=fr
supannCmsId;x-mifare-xlsb: DEADBEEF000000

Le même principe est valable pour les filtres de recherche : on peut faire une recherche avec ou sans option. Sans option, la recherche sera faite sur toutes les valeurs de l'attribut, quelle que soit son option. Exemples :

# ldapsearch -x '(supannCmsId=DEADBEEF000000)' 'uid'

dn: uid=dupont,ou=people,dc=unilim,dc=fr
uid: dupont

# ldapsearch -x '(supannCmsId=000000EFBEADDE)' 'uid'

dn: uid=dupont,ou=people,dc=unilim,dc=fr
uid: dupont

En précisant l'option, seule la valeur correspondante sera interrogée:

# ldapsearch -x '(supannCmsId;x-mifare-xmsb=000000EFBEADDE)' 'uid'

dn: uid=dupont,ou=people,dc=unilim,dc=fr
uid: dupont

En revanche, dans cet exemple, le filtre “(supannCmsId;x-mifare-xlsb=000000EFBEADDE)” ne renverra pas l'entrée “uid=dupont”, car la valeur 000000EFBEADDE n'est pas associée à l'option x-mifare-xlsb.

Ces exemples ont été réalisés avec les commandes en ligne fournies par OpenLDAP, mais les mêmes règles s'appliquent pour tout outil de requêtage respectant le protocole.

OpenLDAP: contrôler la visibilité d'un attribut selon son option

Dans certains cas il peut être nécessaire de restreindre l'accès à un sous-ensemble d'options d'un attribut.

Cela peut répondre à des besoins de :

  • confidentialité: le niveau de visibilité diffère d'une option à l'autre, certaines options devant être restreintes à certains clients seulement;
  • filtrage: certaines options ont pour finalité exclusive des opérations de recherche dans l'annuaire, mais ne doivent pas être lues. Par exemple, une option “x-ascii” contenant une version non accentuée de la valeur.

Dans OpenLDAP, les ACLs sur des options d'attributs fonctionnement de la même manière que celles sur les sous-types d'attributs:

  • une ACL sur l'attribut parent ou dépourvu d'option agit aussi sur les attributs fils et les options;
  • une ACL sur une option ou un fils n'agit que sur celle ou celui-ci.

Les exemples ci-dessous exploitent ces propriétés en ordonnant les ACLs de façon à obtenir le résultat souhaité:

slapd.conf
# limite l'option "x-ascii" du displayName en recherche seule, 
# sauf pour les membres du groupe "ldap.acl.ascii.access":
access to
    attrs=displayName;x-ascii
    by group="cn=ldap.acl.ascii.access,ou=groups,dc=univ-x,dc=fr" break
    by * search
# définition des règles d'accès par défaut du displayName:
access to
    attrs=displayName
    by self write
    by * read
 
# limite l'option "x-mifare-xlsb" du supannCmsId 
# aux seuls membres du groupe "ldap.acl.xlsb.access":
access to
    attrs=supannCmsId;x-mifare-xlsb
    by group="cn=ldap.acl.xlsb.access,ou=groups,dc=univ-x,dc=fr" break
    by * none
# définition des règles d'accès par défaut du supannCmsId:
access to
    attrs=supannCmsId
    by * read