III. Présentation de quelques standards LDAP▲
Dans le chapitre précédent, nous avons vu que la norme LDAP est une agglomération de différentes RFC, de différents standards. Dans ce chapitre quelques-uns de ces standards vont être présentés.
III-A. Les fichiers LDIF▲
III-A-1. Introduction aux fichiers LDIF▲
LDIF est un format de fichier, spécifié dans la [rfc2849]. Les fichiers de type LDIF sont utilisés d'une part pour décrire des objets d'un annuaire LDAP, et d'autre part pour décrire un ensemble d'opérations à effectuer sur le contenu d'un annuaire. L'utilisation descriptive permet, par exemple, de créer les premières entrées d'un annuaire, ou bien d'avoir une sauvegarde d'un annuaire sous la forme d'un fichier.
Le format LDIF a été développé par l'Université du Michigan, dans ses implémentations d'annuaire LDAP. La première utilisation a été celle de fichiers descriptifs, puis le format a évolué pour pouvoir décrire des modifications apportées à un annuaire.
III-A-2. Syntaxe▲
La syntaxe d'une entrée dans un fichier LDIF est la suivante :
dn: <distinguished name>
<attrdesc>: <attrvalue>
<attrdesc>: <attrvalue>
<attrdesc>:: <base64-encoded-value>
<attrdesc>:< <URL>
Soit en premier le DN de l'entrée décrite, ou bien de l'entrée sur laquelle nous allons effectuer des opérations, suivi d'une liste d'attributs et de leurs valeurs, les attributs pouvant décrire une opération en fonction du type de fichier LDIF.
Les attributs dont la valeur contient des accents doivent être encodés en UTF-8. Les attributs contenant des caractères spéciaux doivent être encodés en base 64. Les attributs peuvent être sur plusieurs lignes, à condition que les lignes supplémentaires commencent par un blanc. Les attributs dont la valeur est localisée dans un fichier sont introduits par la :< ou lieu de :. Les espaces entre les noms d'attributs et leur valeur sont optionnels, mais utiles à la lisibilité du fichier.
Le DN doit être encodé en base 64, lorsqu'il commence par une espace, un <, un : , un retour ligne ou un retour chariot. De même pour les attributs qui se terminent avec une espace.
Un fichier LDIF peut commencer par un numéro de version, qui doit être 1: version: 1. Les commentaires commencent par #. Les différentes entrées sont séparées par une ligne blanche, qui peut être un CR LF ou LF. Il ne peut y avoir plus deux lignes blanches consécutives.
Il est possible de rajouter des options à un attribut. L'intitulé de l'option se rajoute au nom de l'attribut, avec un ;. Il est possible de mettre plusieurs options à la suite. Si un attribut a une valeur vide, il peut être représenté, la valeur dans le fichier LDIF restant vide.
Plusieurs opérations sur les attributs (ci-après changetype: add, delete ou modidy) peuvent s'enchaîner, en les séparant par une ligne contenant un -.
III-A-3. Liste des opérations▲
III-A-3-a. Ajout d'une entrée▲
dn: <distinguished name>
changetype: add
objectclass: top
objectclass: <objectclassvalue>
<attrdesc>: <attrvalue>
<attrdesc>: <attrvalue>
Il existe certaines commandes d'administration qui permettent d'insérer dans un annuaire des objets décrits dans un fichier LDIF, sans qu'il soit nécessaire que ce fichier LDIF contienne la commande d'insertion ci-dessus.
III-A-3-b. Suppression d'une entrée▲
dn: <distinguished name>
changetype: delete
Ce n'est pas la peine de mettre des attributs supplémentaires. L'objet ne peut être effacé que s'il n'a pas de descendants.
III-A-3-c. Ajout de valeurs à un attribut▲
dn: <distinguished name>
changetype: modify
add: <attribut>
<attribut>: <attrvalue1>
<attribut>: <attrvalue2>
On peut ainsi donner à l'attribut autant de valeurs que l'on souhaite. Les attributs précédents de l'objet ne sont pas effacés.
III-A-3-d. Suppression de valeurs à un attribut▲
Si l'on souhaite effacer uniquement certaines valeurs, il faut passer en paramètres ces valeurs. L'opération a la syntaxe suivante :
dn: <distinguished name>
changetype: modify
delete: attribut
<attribut>: <première valeur à effacer>
<attribut>: <seconde valeur à effacer>
Si l'on souhaite effacer toutes les valeurs d'un attribut d'un objet, il ne faut passer en paramètres aucune valeur de l'attribut. La syntaxe a ainsi la forme suivante :
dn: <distinguished name>
changetype: modify
delete: attribut
III-A-3-e. Remplacer les valeurs d'un attribut▲
Similaire aux deux cas précédents, les paramètres contiennent cette fois les valeurs qui remplacent les valeurs précédentes :
dn: <distinguished name>
changetype: modify
replace: attribut
<attribut>: <nouvelle valeur 1>
<attribut>: <nouvelle valeur 2>
III-A-3-f. Modification du DN et/ou du RDN▲
Les syntaxes pour modifier le DN d'une entrée, soit modifier sa position dans l'arbre, ou pour modifier son RDN, soit modifier son identifiant, sont similaires. La modification d'un DN s'écrit :
dn: <distinguished name>
changetype: moddn
newrdn: <nouveau relative distinguished name>
deleteoldrdn: <1 ou 0>
newsuperior: <nouveau parent>
deleteoldrdn indique si l'on souhaite ou non conserver l'ancienne entrée. Ce type d'opération ne marche que sur les serveurs LDAP respectant la version 3 de la norme.
La modification d'un RDN s'écrit :
dn: <distinguished name>
changetype: modrdn
newrdn: <nouveau relative distinguished name>
deleteoldrdn: <1 ou 0>
III-B. Filtre de recherche▲
III-B-1. Présentation générale▲
Un filtre LDAP est comparable à une requête SQL. C'est une chaîne de caractères destinée à être exécutée pour récupérer des entrées d'un annuaire LDAP. Plus précisément elle ne définit que la partie WHERE d'une requête SQL: un filtre définit sur quels objets et sur quels attributs doit se faire la recherche.
Un filtre LDAP est donc constitué d'un ensemble d'opérations, portant sur des attributs, combinées avec les opérateurs booléens classiques: ET, OU et NON.
Une opération élémentaire de recherche s'écrit sous la forme : attribut OPERATEUR valeur La forme générale d'un filtre est une combinaison : (operator(search operation)(search operation)…)).
La syntaxe complète des filtres LDAP est décrite dans le document [rfc2254], qui fait partie de l'ensemble des RFC définissant la norme LDAP.
III-B-2. Les opérations élémentaires▲
Une opération élémentaire est composée d'un attribut, d'un opérateur de comparaison et d'une valeur. Pour effectuer des filtres sur le type des objets, sur leur classe, il suffit d'utiliser leur objectclass comme un attribut. Au besoin, il est possible d'utiliser l'OID de l'attribut plutôt que son nom.
Les opérateurs de recherche sont les suivants :
Égalité |
: = |
Approximation |
~= |
Supérieur ou égal |
>= |
Inférieur ou égal |
<= |
S'il n'existe pas d'opérateur : « différent de », « strictement inférieur », ou « strictement supérieur », il est possible de les obtenir à l'aide des opérateurs autorisés, en utilisant un opérateur booléen « NON ».
La valeur accepte le caractère '*' afin de permet des recherches sur des parties de chaînes. Ce même caractère, seul, permet de tester la présence d'un attribut. Ce caractère n'est valide qu'avec l'opération d'égalité.
Une opération doit obligatoirement se trouver entre deux parenthèses. Les valeurs qui sont dans la partie droite d'une opération élémentaire ne sont pas entre quotes, mais certains caractères doivent être échappés :
Le caractère |
Sa valeur ASCII |
Le caractère dans un filtre |
---|---|---|
* |
0x2a |
\2a |
( |
0x28 |
\28 |
) |
0x29 |
\29 |
\ |
0x5c |
\5c |
NULL (caractère vide) |
0x00 |
\00 |
Les opérateurs booléens sont les suivants :
L'opérateur NON |
! |
L'opérateur ET |
& |
L'opérateur OU |
| |
Un opérateur booléen s'applique à toutes les opérations qui suivent jusqu'à l'opérateur suivant.
III-B-3. Exemples de filtres simples▲
Toutes les personnes ayant leur numéro de téléphone renseigné dans la base :
(&(objectclass=person)(telephoneNumber=*))
Toutes les personnes dont le nom commence par 'A' et n'habitant pas Paris :
(&(objectclass=person)(cn=A*)(!(l=Paris)))
Toutes les personnes dont le nom ressemble à Febvre (Faivre, Fèvre, Lefebvre…) :
(&(objectclass=person)(cn~=febvre))
(&(objectclass=person)(cn=*f*vre))
III-B-4. Les filtres étendus▲
En plus des attributs constituant une entrée d'un annuaire, il est possible, grâce aux filtres étendus, de considérer les éléments du DN comme faisant partie aussi de l'entrée elle-même, lors de la recherche. La syntaxe est la suivante :
attribut:dn:=value
Par exemple le filtre (ou:dn:=users) récupérera non seulement toutes les entrées qui ont un attribut ou qui a pour valeur users, mais aussi toutes les entrées dont le DN contient un attribut ou avec la valeur users.
L'autre possibilité offerte par les filtres étendus est de modifier la règle de comparaison sur un attribut. La syntaxe est la suivante :
attribut:oid-matching-rule:=value
Par exemple, si un attribut a une règle de comparaison par défaut qui est insensible à la case, mais que l'on veut faire une recherche avec une valeur précise, qui tienne compte de la case, il faut modifier la règle de comparaison par défaut.
III-B-4-a. Changement de règle de comparaison dans un filtre▲
Dans cet exemple, on rend l'opération d'égalité sensible à la case
(cn:2.5.13.5:=Mickey)
Les filtres étendus permettent aussi de spécifier une règle de comparaison, sans spécifier d'attribut. La recherche s'effectue alors sur tous les attributs qui acceptent cette règle. On peut aussi étendre cette recherche au DN. Les syntaxes sont les suivantes:
:oid-matching-rule:=value
:dn:oid-matching-rule:=value
Tous les filtres ne marchent qu'avec l'opérateur d'égalité, et celui-ci s'écrit :=, lieu de = dans le cas de filtres simples.
Il n'est pas permis non plus d'utiliser le caractère * pour faire des recherches sur des sous-chaînes avec les filtres étendus.
III-C. url LDAP▲
III-C-1. Présentation▲
Les URL LDAP sont une notation pour identifier, localiser, des entrées d'un annuaire, résultat d'une recherche. Elles représentent un moyen simple pour pointer sur un annuaire, ou bien seulement une partie de l'annuaire, tels une branche ou des objets disséminés. Elles sont utilisées par des clients web, dans des fichiers de configuration, ou encore dans des entrées de l'annuaire. Elles ont l'avantage de ne nécessiter aucune notion de programmation.
La syntaxe URL de LDAP est décrite dans la [rfc2255] qui est une mise à jour de la [rfc1959], datée de 1996. La nouvelle RFC intègre la notion d'extension.
III-C-2. Syntaxe▲
La syntaxe d'une url est la suivante :
ldap[s]://<hostname>:<port>/<base_dn>?<attributes>?<scope>?<filter>?<extensions>
avec les paramètres suivants :
hostname |
Adresse du serveur. L'adresse peut être absente, le client est supposé connaître un serveur LDAP à contacter, en fonction du contexte. |
port |
Port TCP de la connexion. Par défaut il s'agit du port 389. Il ne peut y avoir de port s'il n'y a pas d'adresse. |
base_dn |
DN de l'entrée qui est le point de départ de la recherche. |
attributes |
Les attributs que l'on veut récupérer, séparés par des virgules. Si la valeur n'est pas remplie, ou si elle est remplie avec une *, tous les attributs d'usage userApplication doivent être retournés. |
scope |
La profondeur de la recherche dans l'arbre : base, one ou sub. |
filter |
Le filtre de recherche, tel que nous venons de le définir. Le filtre par défaut est (objectClass=*). |
extensions |
Les extensions sont un moyen pour pouvoir ajouter des fonctionnalités aux url LDAP tout en gardant la même syntaxe. On peut mettre inclure plusieurs extensions dans une URL, en les séparant par des virgules. Les extensions ont le format suivant : type=value. La partie =value est optionnelle. Elles peuvent être préfixées par un ! pour signaler une extension critique. Une extension critique signifie que le client et le serveur doivent supporter tous les deux l'extension, sinon une erreur sera levée. |
La [rfc2255] définit une extension bindname, dont la valeur est le DN utilisé par le client pour se connecter au serveur. Le client a la charge de demander à l'utilisateur de rentrer le mot de passe associé si nécessaire.
Tous les caractères non autorisés ou spéciaux dans les url (voir section 2.2 de [rfc1738]) ainsi que le caractère '?' lorsqu'il est présent dans un DN, un filtre ou une extension, doivent être échappé avec la méthode décrite dans la [rfc1738]. Cette méthode consiste à écrire le caractère avec '%' suivi des deux chiffres hexadécimaux, formant sa valeur hexadécimale.
III-C-3. Exemples▲
Lecture de toutes les personnes du service vente :
ldap://ldap.netscape.com/ou=Sales,o=Netscape,c=US?cn,tel,mail?scope=sub?(objetclass=person)
Lecture des objets personnes d'un annuaire :
ldap://localhost:389/??sub?objectclass=person
Recherche de Valery Febvre :
ldap://ldap.easter-eggs.fr/cn=Valery Febvre,ou=Moyens Informatiques,dc=easter-eggs,dc=fr
Recherche approximative d'une personne :
ldap://ldap.easter-eggs.fr/o=easter-eggs,dc=fr?mail,uid,sub?(sn=Febvre)