Table des matières

Schéma d'annuaire LDAP

Le schéma d'un annuaire LDAP permet de spécifier le type d'objet que pourra stocker l'annuaire.

Les classes d'objet

Un objet de l'annuaire est typé en lui attribuant une ou plusieurs classes d'objets. Il existe trois types de classes d'objet : structurelle, auxiliaire et abstraite. Un objet doit obligatoirement avoir une et une seule classe d'objet structurelle et il peut avoir une ou plusieurs classes auxiliaires. Une classe d'objet abstraite ne peut être affectée à un utilisateur directement : celle-ci sert uniquement à être dérivée (via le système d'héritage entre classes d'objets). Les classes d'un objet permet de déterminer quels sont les attributs que peux/doit porter l'objet.

L'héritage entre les classes d'objet

Une classe d'objet héritera toujours une autre classe d'objet (par défaut top). En héritant d'une classe parente, la classe déclarée hérite automatiquement des tous les attributs facultatifs et/ou obligatoires de la classe parente (tout comme ceux que celle-ci a elle-même hérité). Il est possible dans une classe fille d'ajouter de nouveaux attributs ou encore de transformer un attribut obligatoire en attribut facultatif (ou inversement).

Il n'est en outre pas possible de changer le type de classe lors d'un héritage, à l'exception de l'héritage d'une classe abstraite. Ainsi, par exemple, une classe auxiliaire ne pourra hérité que d'une autre classe auxiliaire ou abstraite, mais pas d'une classe structurelle.

Lors de la recherche en filtrant sur la classe d'objet, les objets ayant une classe d'objet héritée de la classe recherchée seront également pris en compte. Ainsi, en imaginant un annuaire avec une classe d'objet specificPerson héritant de la classe person, lors d'une recherche avec le filtre (objectClass=person), les objets specificPerson seront également retournés.

Les attributs des objets

L'attribut d'un objet permet de stocker une information sur un objet. Les attributs sont également déclarés dans le schéma de l'annuaire. Cette déclaration permet :

L'héritage entre attribut

Un attribut pourra hériter d'un autre attribut. En héritant d'un autre attribut, l'attribut déclaré hérite automatiquement de la syntaxe, des règles de comparaison et d’ordonnancement ainsi de la propriété mono/multi-valué de l'attribut parent. Il est possible de modifier la syntaxe d'un attribut hérité, mais il n'est en outre pas possible de modifier ses règles de comparaison et d'ordonnancement ou encore de sa propriété mono/multi-valué.

Lors de la recherche en filtrant sur un attribut, les objets portant un attribut hérité de l'attribut recherché seront également pris en compte. Ainsi, en imaginant un annuaire avec un attribut alternativeMail héritant de l'attribut mail, lors d'une recherche avec le filtre (mail=test@example.com), les objets dont l'attribut alternativeMail correspondrait seront également retournés.

Les OID des objets d'un schéma

Chaque classes d'objet et attributs du schéma sont identifiés de manière unique à l'aide d'un OID. Un OID est une suite de nombres séparés par des points (exemple: 1.3.4.54.76). Pour garantir une unicité parmi les OID, il est important de respecter les affectations gérées par l'IANA.

Il est également possible de déclarer des alias d'OID (via l'attribut olcObjectIdentifier) qui permettront de faciliter la déclaration des classes et attributs en évitant de répéter systématiquement les racines d'OID. Ainsi, par exemple, avec un alias d'OID test valant 1.2.3, on pourra par exemple déclarer un objet avec l'OID 1.2.3.4 en utilisant l'abréviation test:4.

Configuration du schéma d'un annuaire OpenLDAP

Les schémas sont configurer dans la branche cn=schema,cn=config de l'annuaire OpenLDAP. Cette branche contient des objets olcSchemaConfig qui permettent de déclarer les objets du schéma :

Les valeurs de ces attributs sont numérotés via un préfixe, par exemple {10}. Cela permet de définir l'ordre d'interprétation des valeurs par OpenLDAP lors du chargement du schéma. L'ordre d'interprétation a notamment son importance avec des classes d'objet (ou des attributs) héritant d'une autre classe : il est important que la classe parente soit chargée avant la classe fille.

Configuration d'un attribut

Pour configurer un attribut, il faudra affecter une valeur à un attribut olcAttributeTypes d'un objet olcSchemaConfig en respectant le format suivant :

(
  [OID]
  NAME [nom de l'attribut]
  DESC '[description de l'attribut]'
  SUP [nom de l'attribut parent]
  EQUALITY [règle de comparaison d'égalité]
  SUBSTR [règle de comparaison de sous-chaîne]
  ORDERING [règle de comparaison pour l’ordonnancement]
  SYNTAX [OID de la syntaxe]{[limite]}
  SINGLE-VALUE
)

Remarques :

Exemple de déclaration :

(
  testLDAPAttribute:0
  NAME 'testIdentifier'
  DESC 'Object identifiers'
  EQUALITY caseIgnoreIA5Match
  SUBSTR caseIgnoreIA5SubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}
)

Explications : Cet attribut s'appelle testIdentifier et porte l'OID 0 préfixé de la valeur de l'alias testLDAPAttribute. Il est décrit comme stockant l'identifiant des objets. Sa syntaxe est IA5 String (OID 1.3.6.1.4.1.1466.115.121.1.26) avec une longueur maximale de 256 caractères. Les régles de comparaisons d'égalité et de sous-chaine sont respectivement caseIgnoreIA5Match et caseIgnoreIA5SubstringsMatch. Cet attribut est multi-valué et n'hérite d'aucun autre attribut. Cet attribut ne dispose pas de règle de comparaison pour l'ordonnancement et il ne sera donc pas possible de demander un tri sur cet attribut.

Exemple de déclaration d'un attribut hérité :

(
  testLDAPAttribute:1
  NAME 'alternativeMail'
  DESC 'Alternative e-mail address'
  SUP mail
)

Explications : Cet attribut s'appelle alternativeMail et il porte l'OID 1 préfixé de la valeur de l'alias testLDAPAttribute. Il est décrit comme stockant une adresse e-mail alternative et il hérite de l'attribut mail sans modification de sa syntaxe.

Types syntaxiques et règles de comparaison associées

Configuration d'une classe d'objet

Pour configurer une classe d'objet, il faudra affecter une valeur à un attribut olcAttributeTypes d'un objet olcObjectClasses en respectant le format suivant :

(
  [OID]
  NAME [nom de la classe]
  DESC '[description de la classe]'
  SUP [nom de la classe parente]
  [type de la classe parmi ABSTRACT, STRUCTURAL ou AUXILIARY]
  MUST ( [attr1] $ [attr2] $ ... )
  MAY ( [attr3] $ [attr4] $ ... )
)

Remarques :

Exemple de déclaration :

(
  testLDAPObjectClass:0
  NAME 'testPeople'
  DESC 'Test people objects'
  SUP person
  STRUCTURAL
  MUST uid
  MAY ( givenName $ personalTitle $ mail )
)

Explications : Cette classe d'objet s'appelle testPeople et porte l'OID 0 préfixé de la valeur de l'alias testLDAPObjectClass. Elle est décris comme correspondant aux objets personnes de test. Elle hérité de la classe person et est structurelle. Elle impose la présence de l'attribut uid et autorise la présence des attributs givenName, personalTitle et mail.