OpenDJ : personnalisation du schéma

Il est d'usage courant de personnaliser le schéma de données, en ajoutant des attributs et des classes d'objets spécifiques au client.

OpenDJ permet bien évidemment de définir son propre schéma de données. La déclaration des attributs et classes d'objets est faite dans différents fichiers LDIF, chargés au démarrage de l'instance, et qui se trouvent dans $DJHOME/config/schema.
Par défaut, après l'installation, on y trouve une quinzaine de fichiers:

cd $DJHOME
ls config/schema/
00-core.ldif      03-changelog.ldif  03-rfc2739.ldif  03-rfc3712.ldif     05-rfc4876.ldif  06-compat.ldif
01-pwpolicy.ldif  03-rfc2713.ldif    03-rfc2926.ldif  03-uddiv3.ldif      05-samba.ldif
02-config.ldif    03-rfc2714.ldif    03-rfc3112.ldif  04-rfc2307bis.ldif  05-solaris.ldif

Les classes d'objets usuelles (organizationalUnit, inetOrgPerson, groupOfNames, etc.) sont définies dans le fichier 00-core.ldif.

Pour ajouter des attributs ou classes d'objets spécifiques, on dispose de plusieurs options :

  • Ajouter un fichier 99-user.ldif dans le répertoire config/schema
  • Utiliser ldapmodify pour ajouter le contenu d'un fichier ldif
  • Utiliser la console

Imaginons que nous voulions ajouter une classe auxiliaire customPerson, qui contiendra les attributs :

  • customAccesWeb : flag utilisé par un proxy pour donner ou non l'accès Web. Mono valeur
  • customStartDate : date de début de contrat
  • customEndDate : date de fin de contrat
  • customManagerID : ID / matricule du manager

Modification via le fichier 99-user.ldif

Cette modification doit se faire lorsque l'annuaire est arrêté, puisque les fichiers sont chargés au démarrage de l'instance.
On va créer un fichier $DJHOME/config/schema/99-user.ldif, qui contient :

dn: cn=schema
objectClass: top
objectClass: ldapSubentry
objectClass: subschema
cn: schema
attributeTypes: ( customStartDate-oid NAME 'customStartDate'  DESC 'Date de debut de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' )
attributeTypes: ( customManagerID-oid NAME 'customManagerID'  DESC 'ID du manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' )
attributeTypes: ( customAccesWeb-oid NAME 'customAccesWeb'  DESC 'Acces Web via Proxy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' )
attributeTypes: ( customEndDate-oid NAME 'customEndDate'  DESC 'Date de fin de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' )
objectClasses: ( customPerson-oid NAME 'customPerson' DESC 'Person custom' SUP top AUXILIARY MAY ( customAccesWeb $ customStartDate $ customEndDate $ customManagerID) X-ORIGIN 'user defined' )

Une fois l'instance OpenDJ démarrée, on peut vérifier que la nouvelle classe d'objet est créée, en interrogeant la base cn=schema :

$DJHOME/bin/ldapsearch -D "cn=Directory Manager" -w secret -h localhost -p 1389 -b cn=schema -s base "objectclass=ldapSubentry" objectclasses

Note : la commande ci-dessus récupère toutes les classes d'objet. Il n'est pas possible de filtrer directement sur la classe qui nous intéresse.

Modification via ldapmodify

Avec cette option, on va créer un fichier LDIF, qui contient des instructions de modification du schéma. Par exemple :

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( customAccesWeb-oid NAME 'customAccesWeb'  DESC 'Acces Web via Proxy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( customStartDate-oid NAME 'customStartDate'  DESC 'Date de debut de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( customEndDate-oid NAME 'customEndDate'  DESC 'Date de fin de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( customManagerID-oid NAME 'customManagerID'  DESC 'ID du manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' 
)

dn: cn=schema
changetype: modify
add: objectClasses
objectClasses: ( customPerson-oid NAME 'customPerson' DESC 'Person custom' SUP top AUXILIARY MAY ( customAccesWeb $ customStartDate $ customEndDate $ customManagerID) X-ORIGIN 'user defined' )

Note : on utilise ici des OID alphabétiques (tel que customPerson-oid). Si on veut utiliser des "vrais" OID, on peut les déclarer sur le site de l'IANA (http://www.iana.org/assignments/enterprise-numbers/enterprise-numbers), ou utiliser une plage d'adresse propre, afin d'avoir des OID plus structurés. La tranche 1.3.6.1.4.1 est réservée aux codes privés pour les entreprises. On peut ensuite décliner les numéros par typologie. Par exemple :

  • 1.3.6.1.4.36733 : Forgerock
  • 1.3.6.1.4.XXXX : Société XX
  • 1.3.6.1.4.XXXX.1 : Schéma LDAP Société XX
  • 1.3.6.1.4.XXXX.1.1 : Attributs du schéma LDAP Société XX
  • 1.3.6.1.4.XXXX.1.2 : Classes d'objets du schéma LDAP Société XX

Dans ce schéma de numérotation, on aurait donc

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.XXXX.1.1.1 NAME 'customAccesWeb'  DESC 'Acces Web via Proxy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' )

dn: cn=schema
changetype: modify
add: attributeTypes
attributeTypes: ( 1.3.6.1.4.XXXX.1.1.2 NAME 'customStartDate'  DESC 'Date de debut de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' )

dn: cn=schema
changetype: modify
add: objectClasses
objectClasses: ( 1.3.6.1.4.XXXX.1.2.1 NAME 'customPerson' DESC 'Person custom' SUP top AUXILIARY MAY ( customAccesWeb $ customStartDate $ customEndDate $ customManagerID) X-ORIGIN 'user defined' )

La modification du schéma se fait ensuite via une commande ldapmodify :

$DJHOME/bin/ldapmodify -h {host} -p {port} -D {bindDN} -w {password} -f {path to ldif}

Par exemple :

bin/ldapmodify -f ldif/customPerson.ldif -D "cn=Directory Manager" -w secret -h localhost -p 1389 -c

On utilise ici le port LDAP (1389 dans notre exemple) car il s'agit bien d'opérations LDAP et pas d'une opération de configuration de OpenDJ.

On peut vérifier dans le répertoire $DJHOME/config/schema qu'il existe maintenant un fichier 99-user.ldif :

cat $DJHOME/config/schema/99-user.ldif
dn: cn=schema
objectClass: top
objectClass: ldapSubentry
objectClass: subschema
cn: schema
attributeTypes: ( customStartDate-oid NAME 'customStartDate'  DESC 'Date de debut de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' )
attributeTypes: ( customManagerID-oid NAME 'customManagerID'  DESC 'ID du manager' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' )
attributeTypes: ( customAccesWeb-oid NAME 'customAccesWeb'  DESC 'Acces Web via Proxy' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'user defined' )
attributeTypes: ( customEndDate-oid NAME 'customEndDate'  DESC 'Date de fin de contrat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'user defined' )
objectClasses: ( customPerson-oid NAME 'customPerson' DESC 'Person custom' SUP top AUXILIARY MAY ( customAccesWeb $ customStartDate $ customEndDate $ customManagerID) X-ORIGIN 'user defined' )
modifiersName: cn=Directory Manager,cn=Root DNs,cn=config
modifyTimestamp: 20150702081653Z

Modification par la console

Avec OpenDJ, on peut bien évidemment utiliser la console d'administration pour réaliser ces modifications.

Une fois connecté, choisir Schéma / Gérer le schéma :

Image

On peut alors choisir de gérer les attributs ou les classes d'objets. On peut créer un nouvel attribut ou une nouvelle classe d'objet avec un clic droit :

Image

La fenêtre de saisie permet de rentrer les informations de base : nom de l'attribut, OID, description et type. Mais elle présente également d'autres options : type (mono / Multi-valué), attribut parent, alias, fichier de définition, Matching Rules.

Image

Cerise sur le gateau : lorsque l'on confirme, la console affiche l'équivalent de la commande utilisée en ligne de commande :

Image

L'ajout d'une classe d'objet se faire de la même manière. Ici aussi le formulaire permet de saisie quelques options, telles que le fichier de configuration ou le type de classe d'objet (structurelle / auxiliaire). On peut choisir quels sont les attributs portés par la classe d'objet.

Image

Au final, on a un nouvel attribut et une nouvelle classe d'objet :

Image

Références

Guide d'administration OpenDJ / Forgerock : https://backstage.forgerock.com/#!/docs/opendj/2.6.0/admin-guide#chap-s…

 

Catégorie