Recherches dans l'annuaire LDAP

Introduction

Il est possible de procéder à des recherches dans l'annuaire LDAP de diverses façons:


Je ne propose dans cette page que quelques usage de 'ldapsearch' (pour le moment).


La commande 'ldapsearch'

La commande 'ldapsearch' permet d'effectuer des recherches dans un annuaire LDAP et de présenter le résultat selon le format LDIF (voir LDIF).

Je ne vais pas en détailler toutes les options (se reporter à ldapsearch --help et man ldapsearch (voir LDAPSEARCH)), mais juste en préciser quelques unes:


Recherche simple sur un 'uid'

Pour rechercher les informations sur l'utilisateur dont l'uid est 'varp':

se3pdc:~# ldapsearch -xLLL uid=varp
dn: uid=varp,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o=gou
 v,c=fr
uid: varp
cn: Pierre Var
givenName: pierreV
sn: Var
mail: varp@clg-tartempion-bernay.ac-rouen.fr
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: sambaAccount
loginShell: /bin/bash
uidNumber: 1092
gidNumber: 1000
homeDirectory: /home/varp
gecos: Pierre Var,19901111,M,N
rid: 3184
primaryGroupID: 3001
pwdMustChange: 2147483647
acctFlags: [U          ]
employeeNumber: 83

se3pdc:~#


Pour n'en afficher que les attributs uid, cn et gecos:

se3pdc:~# ldapsearch -xLLL uid=varp uid cn gecos
dn: uid=varp,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o=gou
 v,c=fr
uid: varp
cn: Pierre Var
gecos: Pierre Var,19901111,M,N

se3pdc:~#


Pour obtenir les informations qui ne sont pas montrées par la première commande, il faut effectuer la recherche en tant qu'administrateur du LDAP:

se3pdc:~# ldapsearch -xLLL -D 'cn=admin,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o=gouv,c=fr' -W uid=varp
Enter LDAP Password:
dn: uid=varp,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o=gou
 v,c=fr
uid: varp
cn: Pierre Var
givenName: pierreV
sn: Var
mail: varp@clg-tartempion-bernay.ac-rouen.fr
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: sambaAccount
loginShell: /bin/bash
uidNumber: 1092
gidNumber: 1000
homeDirectory: /home/varp
userPassword:: e2NyeXB0fVN1b0R3VU9vSnpGeHM=
gecos: Pierre Var,19901111,M,N
rid: 3184
primaryGroupID: 3001
lmPassword: 177E13FB1A79AB40C2265B23734E0DAC
ntPassword: 318530ACFBACFF9DE53D2DCACDE3B650
pwdMustChange: 2147483647
acctFlags: [U          ]
employeeNumber: 83

se3pdc:~#

On obtient des informations sur le mot de passe (crypté;o).


Recherche simple sur l'uidNumber'

La recherche sur l'uidNumber' 1092 renvoie le même utilisateur:

se3pdc:~# ldapsearch -xLLL uidNumber=1092
dn: uid=varp,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o=gou
 v,c=fr
uid: varp
cn: Pierre Var
givenName: pierreV
sn: Var
mail: varp@clg-tartempion-bernay.ac-rouen.fr
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: sambaAccount
loginShell: /bin/bash
uidNumber: 1092
gidNumber: 1000
homeDirectory: /home/varp
gecos: Pierre Var,19901111,M,N
rid: 3184
primaryGroupID: 3001
pwdMustChange: 2147483647
acctFlags: [U          ]
employeeNumber: 83

se3pdc:~#


Recherche des membres d'un groupe

Recherchons les membres de la classe de 3C:

se3pdc:~# ldapsearch -xLLL cn=Classe_3C
dn: cn=Classe_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o
 =gouv,c=fr
cn: Classe_3C
objectClass: top
objectClass: posixGroup
gidNumber: 2002
description: 3EME C
memberUid: alliera
memberUid: ardechem
memberUid: audep
memberUid: cantala
memberUid: correzem
memberUid: creusep
memberUid: eurea
memberUid: hautem
memberUid: illep
memberUid: juraa
memberUid: hautem2
memberUid: lot_etp
memberUid: marnea
memberUid: meusem
memberUid: nordp
memberUid: puy_dea
memberUid: bas_rhim
memberUid: saonep
memberUid: parisa
memberUid: deuxm
memberUid: varp
memberUid: hautea
memberUid: essonnem
memberUid: val_doip
memberUid: duprec

se3pdc:~#

Pour n'afficher que les membres, il aurait fallu utiliser ldapsearch -xLLL cn=Classe_3C memberUid


Affichons les membres du groupe 'Equipe_3C':

se3pdc:~# ldapsearch -xLLL cn=Equipe_3C
dn: cn=Equipe_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o
 =gouv,c=fr
cn: Equipe_3C
objectClass: top
objectClass: groupOfNames
member:
member: uid=cyann,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,
 o=gouv,c=fr
member: uid=greenp,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education
 ,o=gouv,c=fr
member: uid=yellown,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educatio
 n,o=gouv,c=fr
member: uid=whitec,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education
 ,o=gouv,c=fr
member: uid=graym,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,
 o=gouv,c=fr
member: uid=blued,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,
 o=gouv,c=fr
member: uid=silverj,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educatio
 n,o=gouv,c=fr
member: uid=mercierl,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educati
 on,o=gouv,c=fr
member: uid=lopezm,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education
 ,o=gouv,c=fr
member: uid=poissont,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educati
 on,o=gouv,c=fr
description: 3EME C
owner: uid=greenp,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,
 o=gouv,c=fr

se3pdc:~#

Les lignes sont coupées au 79-ième caractères dans l'affichage LDIF.
Voir LDIF.


NOTE:

Le premier groupe est de type posix (groupe au sens Unix du terme) et le deuxième est un groupe comment dire? (uniquement au sens LDAP du terme).
Voir Groupes.


Recherche des groupes POSIX dont fait partie un utilisateur

Affichons les 'cn' (Common Name) et 'gidNumber' des groupes POSIX dont l'utilisateur 'varp' fait partie:

se3pdc:~# ldapsearch -xLLL memberUid='varp' cn gidnumber
dn: cn=Eleves,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o=go
 uv,c=fr
cn: Eleves
gidNumber: 5001

dn: cn=Classe_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o
 =gouv,c=fr
cn: Classe_3C
gidNumber: 2002

dn: cn=Cours_AGL1_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educati
 on,o=gouv,c=fr
cn: Cours_AGL1_3C
gidNumber: 2006

dn: cn=Cours_EPS_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educatio
 n,o=gouv,c=fr
cn: Cours_EPS_3C
gidNumber: 2010

dn: cn=Cours_MATHS_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educat
 ion,o=gouv,c=fr
cn: Cours_MATHS_3C
gidNumber: 2013

dn: cn=Cours_FRANC_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educat
 ion,o=gouv,c=fr
cn: Cours_FRANC_3C
gidNumber: 2019

dn: cn=Cours_HIGEO_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educat
 ion,o=gouv,c=fr
cn: Cours_HIGEO_3C
gidNumber: 2022

dn: cn=Cours_SCPHY_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educat
 ion,o=gouv,c=fr
cn: Cours_SCPHY_3C
gidNumber: 2026

dn: cn=Cours_SVT_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educatio
 n,o=gouv,c=fr
cn: Cours_SVT_3C
gidNumber: 2030

dn: cn=Cours_CDI,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o
 =gouv,c=fr
gidNumber: 2032
cn: Cours_CDI

se3pdc:~# 


Recherche des groupes groupOfName dont fait partie un utilisateur

Les seuls groupes de ce type que j'aie trouvés sont les groupes 'Equipe_*'.
Inutile donc de faire la recherche pour un utilisateur élève.

Voici les 'dn' des groupOfName dont le prof 'redl' fait partie:

se3pdc:~# ldapsearch -xLLL member='uid=redl,ou=People,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o=gouv,c=fr' dn
dn: cn=Equipe_4B,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o
 =gouv,c=fr

dn: cn=Equipe_3D,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o
 =gouv,c=fr

dn: cn=Matiere_MATHS,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=educati
 on,o=gouv,c=fr

se3pdc:~#

Les attributs désignant les membres des groupOfNames sont des attributs 'member', alors que pour les groupes POSIX, c'est 'memberUid'.


Joker

Il est possible d'utiliser le joker '*' dans les recherches.

Ici, on va afficher les membres de toutes les 'Classe_3*':

se3pdc:~# ldapsearch -xLLL cn=Classe_3* memberUid
dn: cn=Classe_3C,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o
 =gouv,c=fr
memberUid: alliera
memberUid: ardechem
memberUid: audep
memberUid: cantala
memberUid: correzem
memberUid: creusep
memberUid: eurea
memberUid: hautem
memberUid: illep
memberUid: juraa
memberUid: hautem2
memberUid: lot_etp
memberUid: marnea
memberUid: meusem
memberUid: nordp
memberUid: puy_dea
memberUid: bas_rhim
memberUid: saonep
memberUid: parisa
memberUid: deuxm
memberUid: varp
memberUid: hautea
memberUid: essonnem
memberUid: val_doip
memberUid: duprec

dn: cn=Classe_3D,ou=Groups,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,o
 =gouv,c=fr
memberUid: alpesf
memberUid: ardennee
memberUid: aveyronp
memberUid: charentf
memberUid: corsee
memberUid: dordognp
memberUid: euref
memberUid: gerse
memberUid: indrep
memberUid: landesf
memberUid: loiree
memberUid: lozerep
memberUid: hautef
memberUid: morbihae
memberUid: oisep
memberUid: pyreneef
memberUid: haute
memberUid: sarthep
memberUid: seinef
memberUid: sommee
memberUid: vauclusp
memberUid: vosgesf
memberUid: hautse
memberUid: domp

se3pdc:~#


Combiner les résultats avec des PIPE

Il est possible d'exploiter le résultat des recherches pour ne récupérer que certaines lignes:

se3pdc:~# ldapsearch -xLLL cn=Equipe* cn | grep "^cn:"
cn: Equipe_3_B
cn: Equipe_TSAC1
cn: Equipe_1ES1
cn: Equipe_2DE10
cn: Equipe_TES1
se3pdc:~#

La recherche grep a permis de supprimer la ligne 'dn' de l'entrée.


Ici, on va un peu plus loin en supprimant en plus le préfixe 'Classe_':

se3pdc:~# ldapsearch -xLLL cn=Classe_* cn | grep "^cn:" | cut -d":" -f2 | sed -e "s/^ Classe_//"
3_B
TSAC1
1ES1
2DE10
TES1
se3pdc:~#


De cette façon, on peut aisément récupérer la lsite des profs dans un fichiers et la liste des classes dans un autre.
C'est ce que j'ai fait pour des fichiers utiles à CapB2i:

#!/bin/sh

chemin=/var/se3/Progs/ro/capb2i

echo "Je travaille seul" > /var/se3/Progs/ro/capb2i/profs.txt
ldapsearch -xLLL cn=Profs | grep memberUid | cut -d ":" -f 2 | sed -e "s/^ //" | while read A;do ldapsearch -xLLL uid=$A cn | grep "^cn: " | sed -e "s/^cn: //" >> $chemin/profs.txt ;done

ldapsearch -xLLL cn=Classe_* cn | grep "^cn: " | cut -d ":" -f 2 | sed -e "s/ Classe_//" > $chemin/classes.txt


Requête à distance A REVOIR

Pour pouvoir interroger le serveur LDAP du serveur SE3 depuis ma machine sous Linux Mandrake, je dois installer le paquet 'openldap-clients'.
Il faut de plus renseigner le fichier '/etc/openldap/ldap.conf':

[ven fév 18 17:49:22 root@deepglue se3]
# cat /etc/openldap/ldap.conf | grep -v "^#" | grep -v "^$"
BASE    ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,ou=gouv,c=fr
HOST    se3
URI     ldap://192.168.52.199
TLS_REQCERT     allow
[ven fév 18 17:49:36 root@deepglue se3]
#


A REVOIR! MES ESSAIS NE DONNENT RIEN alors que j'y suis parvenu autrefois...
J'ai dû oublier quelque chose...
CHERCHER LA SIGNIFICATION DES ERREURS...
Faudrait-il aussi que j'installe nss_ldap et pam_ldap?


[ven fév 18 17:59:06 steph@deepglue se3]
$ ldapsearch -xLLL -h se3 uid=varp
No such object (32)
[ven fév 18 17:59:23 steph@deepglue se3]
$ ldapsearch -xLLL -h se3
No such object (32)
[ven fév 18 17:59:26 steph@deepglue se3]
$ ldapsearch -xLLL -h 192.168.52.199
No such object (32)
[ven fév 18 17:59:54 steph@deepglue se3]
$ ldapsearch -xLLL -h se3 uid=varp
No such object (32)
[ven fév 18 18:00:14 steph@deepglue se3]
$ ldapsearch -xLLL -h 192.168.52.199
No such object (32)
[ven fév 18 18:00:30 steph@deepglue se3]
$ ldapsearch -xLLL -h 192.168.52.199 -D "cn=admin,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,ou=gouv,c=fr" -W
Enter LDAP Password:
ldap_bind: Invalid credentials (49)
[ven fév 18 18:01:13 steph@deepglue se3]
$ ldapsearch -xLLL -H ldap://192.168.52.199 -D "cn=admin,ou=clg-tartempion-bernay,ou=ac-rouen,ou=education,ou=gouv,c=fr" -W
Enter LDAP Password:
ldap_bind: Invalid credentials (49)
[ven fév 18 18:02:16 steph@deepglue se3]
$

Lors de mes précédents essais, j'avais noté:

Depuis une machine distante, on pourra ajouter: -h IPDUSERVEURLDAP

ldapsearch -x -h 192.168.52.180 -D "cn=admin,dc=woodyse3" -W cn=root

Il est toutefois nécessaire de renseigner un fichier sur la machine cliente.
Sur ma Mdk10.0, c'est /etc/openldap/ldap.conf
Ce fichier contient en l'occurrence:

BASE    dc=woodyse3
HOST    woodyse3.tuxdives.fr
URI     ldap://192.168.52.180
TLS_REQCERT     allow




En PHP

A détailler... inclure mes quelques scripts...