Retrouvez cet article dans : Linux Magazine 104
Il existe quantité d’éditeurs LDAP graphiques. Ils possèdent tous les avantages classiques de telles applications, c’est-à -dire qu’ils offrent une vue structurée sur les données traitées (une arborescence dans notre cas), qu’ils permettent très facilement de s’affranchir des détails techniques sous-jacents en permettant des manipulations instinctives (déplacement des enregistrements par glisser/déposer par exemple). En contrepartie, ils ressemblent souvent à des usines à gaz nécessitant quinze clics pour chaque modification, les rendant très peu adaptés à des manipulations de masse. Et ceux que j’ai pu essayer jusqu’ici ne m’ont jamais convaincu : gq est excessivement fragile et enchaîne crash sur crash, Luma ressemble trop à un jouet Playskool et ldapbrowser est en Java, donc pénible à installer vu le peu d’intégration de Java dans les distributions Linux actuelles. Bref, j’étais dubitatif jusqu’à ce que je découvre ldapvi, un éditeur en mode texte.
Utilisation de base
Le principe simple et génial de ldapvi est d’utiliser un éditeur de texte pour éditer le contenu d’un annuaire LDAP au format LDIF, et de mettre à jour en retour cet annuaire lorsque ce contenu est modifié. Par défaut, c’est vi qui est utilisé, comme le nom l’indique, mais il est possible d’utiliser n’importe quel autre éditeur en positionnant simplement la variable d’environnement
EDITOR. Toutes les fonctionnalités de l’éditeur, comme l’utilisation d’expressions régulières pour effectuer des substitutions, deviennent ainsi possibles.
L’invocation classique de ldapvi est la suivante :
ldapvi --discover --user uid=foo,ou=users,dc=domain,dc=com --host ldap.domain.com. Après authentification de l’utilisateur, on se retrouve alors devant l’éditeur désiré, affichant l’intégralité du contenu de l’annuaire. Chacune des entrées de l’annuaire est précédée par son DN, précédé d’un numéro d’ordre propre à la session d’édition courante. Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
# -*- coding: utf-8 -*- vim:encoding=utf-8:
# http://www.lichteblau.com/ldapvi/manual#syntax
0 dc=domain,dc=com
dc: msr-inria
objectClass: top
objectClass: domain
1 ou=users,dc=domain,dc=com
ou: users
objectClass: top
objectClass: organizationalUnit
2 uid=bar,ou=users,dc=domain,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: bar
uidNumber: 5000
cn: Joe Bar
sn: Bar
givenName: Joe
gecos: Joe Bar
mail: Joe.Bar@domain.com
gidNumber: 5000
loginShell: /bin/bash
homeDirectory: /home/bar
... |
La modification d’un enregistrement existant consiste à modifier les valeurs courantes de ses attributs ou à en rajouter ou en supprimer certains. L’effacement d’un enregistrement consiste à effacer l’intégralité du bloc correspondant. L’ajout d’un enregistrement se fait en ajoutant un nouveau bloc, avec le mot-clé add à la place du numéro d’ordre. Enfin, le déplacement d’un enregistrement dans l’annuaire se fait en modifiant son DN, tout simplement.
À la sortie de l’éditeur, ldapvi cherche les modifications apportées. S’il n’y en a aucune, le programme s’arrête. Sinon, il vérifie la syntaxe du document final, et propose à l’utilisateur de corriger les éventuelles erreurs :
|
|
Error: Space at beginning of line.
What now? [eQ?] |
Sinon, le programme soumet à l’utilisateur un bilan des changements effectués pour confirmation :
|
|
add: 0, rename: 0, modify: 1, delete: 0
Action? [yYqQvVebB*rsf+?] |
Les options disponibles sont :
- y : soumettre les changements ;
- Y : soumettre les changements, en ignorant les erreurs ;
- e : revenir dans l’éditeur ;
- + : revenir dans l’éditeur, avec ajout des attributs optionnels ;
- v : examiner les changements au format LDIF ;
- V : examiner les changements au format ldapvi ;
- b : se ré-authentifier ;
- B : passer de l’authentification simple à SASL ;
- * : changer de mécanisme d’authentification SASL ;
- s : ignorer le premier changement ;
- r : ignorer les effacements ;
- q : sauver les changements au format LDIF et quitter ;
- Q : ignorer les changements et quitter.
Une fois les changements validés, ils sont envoyés au serveur LDAP. C’est à ce moment-là seulement que sont vérifiées les ACL permettant d’effectuer ces modifications, ainsi que les éventuelles violations de schéma. En cas de rejet d’une de ces modifications, ldapvi propose alors de nouveau les mêmes options à l’utilisateur :
|
|
ldap_modify: Naming violation (64)
additional info: naming attribute ‘uid’ is not present in entry
Error at: uid=bar,ou=users,dc=domain,dc=com
add: 0, rename: 0, modify: 1, delete: 0
Action? [yYqQvVebB*rsf+?] |
Astuces d’utilisation
ldapvi possède un certain nombre de paramètres d’invocation et de configuration. Il n’est pas question de les présenter tous ici (après tout, il y a une page de manuel pour ça), juste de présenter les plus intéressantes pour une utilisation classique.
Invocation simplifiée
ldapvi utilise la bibliothèque
openldap pour se connecter à l’annuaire, et donc à sa configuration. Celle-ci se trouve dans les fichiers
/etc/openldap/ldap.conf ou
/etc/ldap/ldap.conf pour le système en fonction de la distribution, et
~/.ldaprc pour l’utilisateur. Si cette configuration est correctement renseignée, il n’y a plus besoin de préciser le serveur à utiliser, ni à utiliser l’auto-découverte du contexte, et l’invocation se résume alors à  :
ldapvi --user uid=foo,ou=users,dc=domain,dc=com --host ldap.domain.com. ldapvi est également capable de générer lui-même cette configuration. L’invocation
ldapvi --config --discover --host ldap.domain.com produit ce résultat :
|
|
# ldap.conf(5)
# edit this as needed and paste into ~/.ldaprc
# server name
# (for parameterless operation, make sure to include at least this line)
URI ldap://ldap.domain.com:389/??base
# default search base
BASE dc=domain,dc=com
# user to bind as
#BINDDN
# search parameters (uncomment as needed)
#DEREF never
#SIZELIMIT 0
#TIMELIMIT 0 |
Préciser l’utilisateur sous forme de son DN complet devient vite fastidieux. Il est également possible d’utiliser à la place un filtre de recherche, comme
(uid=foo). Avec les guillemets nécessaires pour éviter l’interprétation par le shell, l’invocation se résume alors à  :
ldapvi --user ‘(uid=foo)’.
Récupération ciblée
Récupérer l’intégralité de l’annuaire, lorsqu’il s’agit juste de modifier un seul enregistrement, est également fastidieux. Une première possibilité consiste à changer de base de recherche, et la portée de la recherche, avec les options
--base <DN> et
--scope <base> ou avec l’option
--read <DN>, qui revient au même. Néanmoins, il est également possible de passer comme paramètre un filtre de recherche, sur le même modèle en fait que pour
ldapsearch. Les trois invocations ci-dessous sont donc équivalentes :
|
|
ldapvi --user ‘(uid=foo)’ --base uid=bar,ou=users,dc=domain,dc=com --scope base
ldapvi --user ‘(uid=foo)’ --read uid=bar,ou=users,dc=domain,dc=com
ldapvi --user ‘(uid=foo)’ uid=bar |
Elles donnent toutes le résultat suivant :
|
|
# -*- coding: utf-8 -*- vim:encoding=utf-8:
# http://www.lichteblau.com/ldapvi/manual#syntax
0 uid=bar,ou=users,dc=domain,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: bar
uidNumber: 5000
cn: Joe Bar
sn: Bar
givenName: Joe
gecos: Joe Bar
mail: Joe.Bar@domain.com
gidNumber: 5000
loginShell: /bin/bash
homeDirectory: /home/bar |
Exploitation des schémas
Il est très facile de modifier l’annuaire, à partir de son contenu actuel. En revanche, à moins de maîtriser parfaitement les schémas, il est quelque peu difficile de savoir quels attributs supplémentaires sont disponibles ou même de créer un enregistrement à partir de rien. Pas de souci, ldapvi est également capable d’exploiter les schémas utilisés.
Par défaut, seuls les attributs possédant une valeur apparaissent dans l’éditeur. L’option
--may permet d’afficher également les autres attributs, sous une forme commentée. Ainsi, l’invocation
ldapvi --user ‘(uid=foo)’ --may uid=bar donne le résultat suivant :
1 En fait, un dialecte basé sur LDIF, voire http://www.lichteblau.com/ldapvi/manual.xml#syntax pour les détails.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
# -*- coding: utf-8 -*- vim:encoding=utf-8:
# http://www.lichteblau.com/ldapvi/manual#syntax
0 uid=bar,ou=users,dc=domain,dc=com
# structural object class: inetOrgPerson
### WARNING: extra structural object class: organizationalPerson
### WARNING: extra structural object class: person
objectClass: inetOrgPerson
objectClass: posixAccount
uid: bar
uidNumber: 5000
cn: Joe Bar
sn: Bar
givenName: Joe
gecos: Joe Bar
mail: Joe.Bar@domain.com
gidNumber: 5000
loginShell: /bin/bash
homeDirectory: /home/bar
#audio:
#businessCategory:
#carLicense:
#departmentNumber:
#displayName:
... |
Pour créer un nouvel enregistrement à partir de rien, l’option
--class <class>, qui peut être spécifiée autant de fois que nécessaire, permet d’éditer directement un modèle d’enregistrement, sans recherche préalable. Ainsi, l’invocation
ldapvi --user ‘(uid=foo)’ --class inetOrgPerson --class posixAccount donne le résultat suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
# -*- coding: utf-8 -*- vim:encoding=utf-8:
# http://www.lichteblau.com/ldapvi/manual#syntax
# structural object class: inetOrgPerson
### WARNING: extra structural object class: organizationalPerson
### WARNING: extra structural object class: person
add
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: organizationalPerson
objectClass: top
objectClass: person
cn:
uid:
uidNumber:
gidNumber:
homeDirectory:
sn:
#audio:
#businessCategory:
#carLicense:
#departmentNumber:
#displayName: |
Autres modes d’utilisation
ldapvi autorise également certaines formes alternatives d’invocation, qui en font une alternative aux outils classiques d’Openldap, de manière plus verbeuse et interactive :
- ldapvi --out est similaire à ldapsearch.
- ldapvi --in est similaire à ldapmodify.
- ldapvi --delete est similaire à ldapdelete.
- ldapvi --rename est similaire à ldapmodrdn.
Les options
--quiet et
--noninteractive permettent de spécifier un comportement plus proche des originaux.
En conclusion, si vous êtes un utilisateur fréquent de LDAP, et que vous maîtrisez LDIF1, essayez rapidement cet outil facile à prendre en main et très efficace. Vous ne le regretterez pas.
 Retrouvez cet article dans : Linux Magazine 104