Présentation des commandes LDAP
Les commandes qui vont être présentées sont toutes disponibles (en principe) depuis un client LDAP.
Par exemple, le package "openldap-client" fournit les commandes LDAP suivantes :
[root@ldap01 tmp]# rpm -ql openldap-clients-2.4.39-8.el6.x86_64 
/usr/bin/ldapadd 
/usr/bin/ldapcompare 
/usr/bin/ldapdelete 
/usr/bin/ldapexop 
/usr/bin/ldapmodify 
/usr/bin/ldapmodrdn 
/usr/bin/ldappasswd 
/usr/bin/ldapsearch 
/usr/bin/ldapurl 
/usr/bin/ldapwhoami
Ces commandes permettent ainsi de "lister/ajouter/supprimer/modifier" les entrées d’un annuaire LDAP à l’aide soit d’un fichier LDIF ou bien de manière interactive.
1. La commande ldapsearch
Comme son nom l’indique, cette commande permet de rechercher des entrées dans l’annuaire LDAP à partir d’attribut(s) recherché(s).
La syntaxe de base de la commande ldapsearch est la suivante :
ldapsearch -H hostname -D binduser -W -b <base> [-s portée] 
[filtre] [attributs]
Avec comme paramètres :
	•	-H pour identifier le serveur LDAP (adresse IP ou nom de l’hôte).
	•	-D pour spécifier l’identifiant de liaison.
	•	-W afin d’être notifié pour le mot de passe.
	•	-b permet de spécifier l’endroit à partir duquel sera réalisée la commande.
	•	-s permet de définir la portée de la commande (base, one ou sub).
	•	filtre identifie les entrées recherchées.
	•	attributs spécifie les attributs à afficher pour chaque entrée trouvée.
Voici quelques exemples ci-dessous qui vont permettre de comprendre la syntaxe de cette commande ultra-puissante.
Dans le test ci-après, il sera réalisé une opération de recherche dans l’annuaire LDAP des entrées possédant la classe d’objet account. Cette recherche s’effectuera à partir de l’entrée dc=exemple,dc=com et ira chercher dans toutes les branches et les sous-branches de l’annuaire (paramètre -s sub).
[root@ldap01 tmp]# ldapsearch -h localhost -D "cn=root,dc=exemple,
dc=com" -W  -b "dc=exemple,dc=com" -s sub objectclass=account 
# extended LDIF 
# 
# LDAPv3 
# base <dc=exemple,dc=com> with scope subtree 
# filter: objectclass=account 
# requesting: ALL 
# 
 
# user1,users,exemple.com 
dn: uid=user1,ou=users,dc=exemple,dc=com 
uid: user1 
cn: user1 
objectClass: account 
objectClass: top 
objectClass: posixAccount 
objectClass: shadowAccount 
loginShell: /bin/bash 
gidNumber: 60001 
homeDirectory: /home/user1 
uidNumber: 60012 
gecos: USER1/GGS_IT 
userPassword:: e3NzaGF9YVNwamFjV2p4VUE2NDFEdVNyVkhwTjBYTmFPY3h2TUJocE9VdUE9 
 
# user2,users,exemple.com 
dn: uid=user2,ou=users,dc=exemple,dc=com 
objectClass: account 
objectClass: top 
objectClass: posixAccount 
objectClass: shadowAccount 
loginShell: /bin/bash 
gidNumber: 60001 
uidNumber: 60011 
cn: user2 
homeDirectory: /home/user2 
uid: user2 
gecos: USER2/GGS_SUPPORT 
userPassword:: e3NzaGF9WTRGZ1ZSZW1lR0haTXFiY1JQWTluOG15dVB4T3lKeTFzeXJySXc9 
 
# user3,users,exemple.com 
dn: uid=user3,ou=users,dc=exemple,dc=com 
uid: user3 
gidNumber: 60001 
userPassword:: e3NzaGF9YVNwamFjV2p4VUE2NDFEdVNyVkhwTjBYTmFPY3h2TUJocE9VdUE9 
loginShell: /bin/bash 
objectClass: account 
objectClass: top 
objectClass: posixAccount 
objectClass: shadowAccount 
cn: user3 
homeDirectory: /home/user3 
gecos: USER3/GGS_IT 
uidNumber: 60013 
 
# search result 
search: 2 
result: 0 Success 
 
# numResponses: 4 
# numEntries: 3 
[root@ldap01 tmp]#
Le résultat retourne donc toutes les entrées contenant objectClass: account et affiche en détail tous leurs attributs.
Quelques remarques à propos de l’exécution de la commande :
	•	Dans la section LDAPv3 se trouvent :
	▪	Le point de départ de la recherche : base <dc=exemple,dc=com>.
	▪	La portée : with scope subtree.
	▪	Le filtre : filter: objectclass=account.
	▪	Et quels attributs devront être affichés : requesting: ALL.
	•	Dans la section search result :
	▪	search: 2 correspond à un identifiant interne LDAP de la fonction de recherche (search).
	▪	result: 0 Success correspond à l’état de notre requête (ici réussite).
	▪	numResponses: 4 correspond au nombre de requêtes reçues incluant le statut de cette requête.
	▪	numEntries: 3 correspond au nombre d’entrées réellement identifiées par notre recherche.
Dans ce deuxième exemple, il y sera ajouté l’affichage des attributs désirés (par exemple : uid et gidnumber) et la suppression de l’affichage des informations d’exécution de la commande (-LLL) :
[root@ldap01 tmp]# ldapsearch -LLL -h localhost -D "cn=root,
dc=exemple,dc=com" -W -b "dc=exemple,dc=com" -s sub 
objectclass=account uid gidnumber 
dn: uid=user1,ou=users,dc=exemple,dc=com 
uid: user1 
gidNumber: 60001 
dn: uid=user2,ou=users,dc=exemple,dc=com 
gidNumber: 60001 
uid: user2 
 
dn: uid=user3,ou=users,dc=exemple,dc=com 
uid: user3 
gidNumber: 6000 
 
[root@ldap01 tmp]#
Le résultat renvoie alors les entrées de l’annuaire correspondantes avec leurs attributs uid et gidnumber.
Dans ce dernier exemple, il s’agit de rechercher les entrées de l’annuaire de type account possédant un uidnumber égal à 60013 et de n’afficher que les valeurs des attributs uid et gecos.
[root@ldap01 tmp]# ldapsearch -LLL -h localhost -D 
"cn=root,dc=exemple,dc=com" -w "secret" -b "dc=exemple,dc=com"  
-s sub "(&(objectclass=account)(uidnumber=60013))" uid gecos 
dn: uid=user3,ou=users,dc=exemple,dc=com 
uid: user3 
gecos: USER3/GGS_IT 
 
[root@ldap01 tmp]#
2. La commande ldapdelete
Cette commande permet de supprimer une entrée dans l’annuaire LDAP.
La syntaxe de base de la commande ldapdelete est la suivante :
ldapdelete [options] [dn]
Exemple
[root@ldap01 tmp]# ldapdelete -h localhost -D "cn=root,dc=exemple,
dc=com" -w "secret" uid=user3,ou=users,dc=exemple,dc=com  
uid=user4,ou=users,dc=exemple,dc=com 
[root@ldap01 tmp]#
Voici ci-dessous un exemple de son utilisation en mode interactif où deux entrées de l’annuaire seront supprimées :
[root@ldap01 tmp]# ldapdelete -h localhost -D 
"cn=root,dc=exemple,dc=com" -w "secret"  
 
uid=user3,ou=users,dc=exemple,dc=com  
uid=user4,ou=users,dc=exemple,dc=com 
ˆC 
[root@ldap01 tmp]#
Il faut ainsi taper le DN de l’entrée puis la touche [Entrée] et ainsi de suite si plusieurs entrées sont à supprimer et enfin terminer par [Ctrl] C.
Il est aussi possible d’inclure les DN à supprimer directement dans un fichier LDIF avec l’option -f :
[root@ldap01 tmp]# ldapdelete -h localhost -D 
"cn=root,dc=exemple,dc=com" -w "secret" -f suppression.ldif
Il y a également le paramètre -r qui permet une suppression « récursive » de toutes les sous-entrées :
[root@ldap01 tmp]# ldapdelete -h localhost -D "cn=root,dc=exemple,
dc=com" -w "secret" ou=users_bkp,dc=exemple,dc=com -r 
[root@ldap01 tmp]#
3. La commande "ldapadd"
Cette commande va permettre d’ajouter des entrées dans l’annuaire LDAP.
La syntaxe de base de la commande ldapadd est la suivante :
ldapadd [options]
Bien qu’il soit possible de l’utiliser en mode interactif, il est bien plus simple de l’utiliser avec un fichier LDIF.
Ajout du compte utilisateur contenu dans le fichier LDIF :
[root@ldap01 tmp]# ldapadd -h localhost -D "cn=root,dc=exemple,
dc=com" -w "secret" -f entrée.ldif 
adding new entry "uid=user3,ou=users,dc=exemple,dc=com" 
 
[root@ldap01 tmp]#
Avec le fichier entrée.ldif suivant :
dn: uid=user3,ou=users,dc=exemple,dc=com 
uid: user3 
cn: user3 
objectClass: account 
objectClass: top 
objectClass: posixAccount 
objectClass: shadowAccount 
loginShell: /bin/bash 
gidNumber: 60001 
homeDirectory: /home/user3 
uidNumber: 60015 
gecos: USER3/GGS_IT 
userPassword: e3NzaGF9YVNwamFjV2p4VUE2NDFEdVNyVkhwTjBYTmFPY3h2TUJocE9VdUE9PQ=
4. La commande ldapmodify
Cette commande va permettre de modifier des entrées de l’annuaire LDAP et possède également les fonctions d’ajout et de suppression au même titre que les commandes ldapadd/ldapdelete.
La syntaxe de base de la commande ldapmodify est la suivante :
ldapmodify [options]
Bien que l’utilisation de cette commande soit possible en mode interactif via le stdin, il est bien plus simple de l’utiliser avec un fichier LDIF.
Dans l’exemple suivant, l’entrée suivante va être modifiée :
uid=user3,ou=users,dc=exemple,dc=com
afin de lui changer la valeur de son attribut uidnumber :
[root@ldap01 tmp]# ldapmodify -h localhost -D 
"cn=root,dc=exemple,dc=com" -w "secret" -f modif.ldif 
modifying entry "uid=user3,dc=exemple,dc=com" 
[root@ldap01 tmp]#
Avec le fichier modif.ldif suivant :
[root@ldap01 tmp]# cat modif.ldif 
dn: uid=user3,ou=users,dc=exemple,dc=com 
changetype: modify 
replace: uidNumber 
uidNumber: 600145
Il est aussi possible de combiner plusieurs actions comme indiqué dans le fichier LDIF ci-dessous.
Ainsi, à partir du même fichier LDIF, il va être possible de réaliser plusieurs actions sur le même DN au moyen du caractère (-) et ensuite d’indiquer des actions à effectuer pour un autre DN au moyen d’une commande enter.
Exemple
dn: uid=user3,ou=users,dc=exemple,dc=com 
changetype: modify 
replace: uidNumber 
uidNumber: 60143 
- 
add: description 
description: toto 
 
dn: uid=user2,ou=users,dc=exemple,dc=com 
add: description 
description: toto 
-  
add: description 
description: toto2
Attention cependant aux modifications d’attributs de type "multivaleurs". En effet, si la valeur au cours des actions de type replace/add/delete n’est pas spécifiée, alors cela impactera toutes les valeurs de l’attribut.
Ainsi, pour les actions d’ajout ou de suppression, il conviendra de spécifier la valeur comme dans l’exemple ci-dessous :
dn: uid=user2,ou=users,dc=exemple,dc=com 
delete: description 
description: toto2
Et pour les actions de changement de valeurs (replace), il faudra supprimer l’attribut avec la valeur concernée et recréer l’attribut avec la nouvelle valeur :
dn: uid=user2,ou=users,dc=exemple,dc=com 
delete: description 
description: toto 
- 
add: description 
description: toto3
Comme annoncé en début de présentation, cette commande peut aussi ajouter et supprimer des entrées de l’annuaire LDAP. Il faudra pour ce faire, spécifier les valeurs add ou delete du champ changetype.
Exemple
dn: uid=user2,ou=users,dc=exemple,dc=com 
changetype : delete 
 
dn: uid=user4,ou=users,dc=exemple,dc=com 
changetype : add 
... 
5. Les commandes ldapmodrdn, slappasswd, ldapwhoami, ldapurl
La commande slappasswd permet de changer la valeur de l’attribut UserPassword du DN spécifié.
Exemple
[root@ldap01 tmp]# ldappasswd -h localhost -D 
"cn=root,dc=exemple,dc=com" -w "secret" -a xxxx -s xxxx 
uid=user2,ou=users,dc=exemple,dc=com
Dans l’exemple ci-dessus, la commande fait apparaître les mots de passe en clair... ce qui est sur le plan de la sécurité à proscrire, car il y a la possibilité de les récupérer dans l’historique du shell de l’OS.
Il sera donc préférable d’utiliser la commande ci-dessous où les mots de passe seront masqués :
[root@ldap01 tmp]# ldappasswd -h localhost -D 
"cn=root,dc=exemple,dc=com" -W  -A -S 
uid=user2,ou=users,dc=exemple,dc=com
6. Configuration des commandes LDAP
Toutes les commandes utilisées précédemment fournissaient des informations redondantes telles que le nom ou l’adresse IP du serveur LDAP cible, le suffixe et, si LDAPS avait été utilisé, il aurait fallu également ajouter le nom des certificats avec leurs chemins d’accès.
Il existe un fichier /etc/openldap/ldap.conf, provenant du package "openldap", utilisé par les commandes LDAP, qui permet ainsi d’éviter la saisie de toutes ces informations.
Dans l’exemple ci-dessous, il y est défini le nom du serveur LDAP (ldap.example.com), le suffixe et le répertoire des certificats à utiliser afin de valider le certificat du serveur LDAP contacté :
[root@ldap01 tmp]# cat /etc/openldap/ldap.conf 
# 
# LDAP Defaults 
# 
 
# See ldap.conf(5) for details 
# This file should be world readable but not world writable. 
 
BASE   dc=example,dc=com 
URI   ldaps://ldap.example.com 
 
#SIZELIMIT   12 
#TIMELIMIT   15 
#DEREF      never 
 
TLS_CACERTDIR   /etc/openldap/certs 
TLS_REQCERT hard 
[root@ldap01 tmp]#
Désormais, la commande ldapsearch vue précédemment serait :
ldapsearch -LLL -D "cn=root,dc=exemple,dc=com" -W -s sub objectclass=