Ce document présente de manière brève les annuaires LDAP (Lightweight Directory Access Protocol) et plus particulièrement le produit OpenLDAP.
Après l'installation et la configuration, un mini-annuaire sera crée et pourra être consulté via le carnet d'adresse de Netscape. Les scripts d'exemples sont écrits en Perl et Python.
Un annuaire LDAP est un annuaire électronique. Il peut contenir diverses informations concernant par exemple :
Cet annuaire se structure de manière hiérarchique (pays, organismes, direction, division, département, service, utilisateurs, ressources...)
Les informations qu'il contient peuvent :
Les avantages de l'utilisation d'un annuaire LDAP sont :
L'annuaire LDAP que j'ai installé sur ma machine GNU/Linux (Debian) est OpenLDAP. Pour installer le package sur cette distribution :
Sinon, vous pouvez télécharger les sources d'OpenLDAP à partir du site officier dont l'adresse est la suivante : http://www.openldap.org.
Dans ce cas, vous devez suivre les instructions contenues dans l'archive téléchargée afin de compiler les sources et les installer.
Sur ma distribution GNU/Linux (une debian), le script de démarrage/arrêt du serveur est /etc/init.d/openldapd.
En tant qu'utilisateur root, pour démarrer le serveur, exécuter la commande :
Pour l'arrêter, exécuter la commande :
Il y a trois types de fichiers de configuration :
Ce fichier comporte diverses informations telles que l'administrateur principal de l'annuaire LDAP et son mot de passe, les droits d'accès par défaut, les fichiers d'objets et de syntaxe à utiliser ainsi que les règles d'accès pour les entrées et les attributs de l'annuaire LDAP.
Ces fichiers (exemple /etc/openldap/slapd.oc.conf) contiennent la déclaration de chaque objet de l'annuaire LDAP.
Ces fichiers (exemple /etc/openldap/slapd.at.conf) contiennent la syntaxe de chaque attribut composant les objets
Attention, ce fichier contient le mot de passe de l'administrateur du serveur LDAP. Il faut donc lui mettre les droits 600.
Voici le contenu du fichier /etc/openldap/slapd.conf de ma machine :
# This is the main ldapd configuration file. # Schema and objectClass definitions include /etc/openldap/slapd.at.conf include /etc/openldap/slapd.oc.conf # Schema for supporting Netscape Roaming include /etc/openldap/netscape_roaming.at.conf include /etc/openldap/netscape_roaming.oc.conf # Schema for supporting Debian Package Directory entries #include /etc/openldap/debian.at.conf #include /etc/openldap/debian.oc.conf # Schema check allows for forcing entries to # match schemas for their objectClasses's schemacheck off # Where clients are refered to if no # match is found locally referral ldap://ldap.four11.com # Where the pid file is put. The init.d script # will not stop the server if you change this. pidfile /var/run/slapd.pid # Read slapd.conf(5) for possible values loglevel 0 ####################################################################### # ldbm database definitions ####################################################################### # The backend type, ldbm, is the default standard database ldbm # The base of your directory rootdn "cn=admin,ou=People,dc=maboite,dc=fr" rootpw toto suffix "dc=maboite,dc=fr" # Where the database file are physically stored directory "/var/lib/openldap" # Save the time that the entry gets modified lastmod on # By default, only read access is allowed defaultaccess read # For Netscape Roaming support, each user gets a roaming # profile for which they have write access to access to dn=".*,ou=Roaming,dc=maboite,dc=fr" by dnattr=owner write # The userPassword by default can be changed # by the entry owning it if they are authenticated. # Others should not be able to see it, except the # admin entry below access to attribute=userPassword by dn="cn=admin,ou=People,dc=maboite,dc=fr" write by self write by * none # The admin dn has full write access access to * by dn="cn=admin,ou=People,dc=maboite,dc=fr" write # End of ldapd configuration file
Ce fichier :
Pour plus de détails, se référer à la page de manuel de slapd.conf.
Les informations dans un annuaire LDAP sont contenues dans des "fiches" accessibles par leur chemin depuis la racine de l'arborescence de l'annuaire LDAP.
Ce chemin s'appelle un DN (distinguished name) et se décompose en plusieurs
RDN (relative distinguished name).
Exemple :
Chaque entrée de l'annuaire correspond à un objet réél ou abstrait (personne, imprimante, paramètres...)
Une entrée est composée d'un ou plusieurs attributs «objectClass». Chaque attribut «objectClass» ajoute à cette entrée un certain nombre d'attributs obligatoires (clause requires) ou non (clause allows). Les attributs obligatoires devront obligatoirement être remplis lors de l'enregistrement des informations dans l'annuaire LDAP.
Exemple d'objet :
objectclass person
requires
objectClass,
sn,
cn
allows
description,
seeAlso,
telephoneNumber,
userPassword
Ce fichier comporte une partie des informations utilisées par Netscape pour son carnet d'adresse.
En fonction de la version de OpenLDAP installée, il se peut qu'il n'y ait pas besoin de ce fichier (voir si un des fichiers oc.conf du répertoire /etc/openldap contient l'objectClass inetOrgPerson) et est inclu dans /etc/openldap/slapd.conf.
Sur ma debian patato dernièrement installée, je n'ai pas besoin de rajouter ce fichier.
Dans le cas contraire, voici le contenu du fichier :
objectclass inetOrgPerson requires objectClass allows audio, businessCategory, carLicense, departmentNumber, displayName, employeeNumber, employeeType, givenName, homePhone, homePostalAddress, houseIdentifier, initials, jpegPhoto, labeledURL, mail, manager, mobile, pager, photo, preferredLanguage, roomNumber, secretary, uid, userCertificate, userClass, userSMIMECertificate, x500UniqueIdentifier
Il est à inclure dans le fichier slapd.conf par la directive.
Ce fichier contient les attributs et leur syntaxe. La syntaxe définit le contenu des attributs (binaire, DN, chaînes de caractères (comparaison avec ou sans vérification de la casse), numéro de téléphone...)
attribute photo bin attribute personalsignature bin attribute jpegphoto bin attribute audio bin attribute labeledurl ces attribute ref ces attribute userpassword ces attribute telephonenumber tel attribute facsimiletelephonenumber fax tel attribute pagertelephonenumber pager tel attribute homephone tel attribute mobiletelephonenumber mobile tel attribute aliasedObjectName dn attribute member dn attribute owner dn attribute seealso dn attribute manager dn attribute documentauthor dn attribute secretary dn attribute lastmodifiedby dn attribute associatedname dn attribute naminglink dn attribute reciprocalnaminglink dn attribute dn dn
Pour plus d'informations sur les fichiers (at.conf et oc.conf), il faut consulter la page de manuel slapd.conf.
Le mieux pour connaître les options de configuration de OpenLDAP reste les pages de manuel dont slapd.conf et ldap.conf.
Plusieurs façons de nommer l'annuaire LDAP existent.
La première, o=maboite,c=fr est répandue.
La seconde est celle que je conseille. Si votre nom de domaine est www.maboite.fr, prenez dc=maboite,dc=fr comme racine. Ceci présente l'avantage d'être facilement reconstituable.
Tout d'abord vous devez installer le package openldap-utils
Il fournit les commandes suivantes :
Pour créer l'entreprise « maboite.fr », il faut créer un fichier LDIF (ex: files/creation_base.txt) contenant la description de la racine de l'annuaire :
dn: dc=maboite,dc=fr objectclass: dcobject,organization dc: maboite,fr o: maboite description: Le nom de mon entreprise postalCode: 33310
Pour créer l'information dans l'annuaire, on utilise la commande ldapadd :
Le mot de passe de l'administrateur est ensuite demandé.
Enter LDAP Password:Il faut rentrer le rootpw du fichier /etc/openldap/slapd.conf.
Après, on obtient :
adding new entry dc=maboite,dc=fr
Dans la commande ldapadd utilisée ci-dessus, le paramètre :
Pour créer des entrées dans l'annuaire LDAP, on utilise la commande ldapadd.
SYNOPSIS ldapadd [-b] [-c] [-r] [-n] [-v] [-k] [-K] [-d debuglevel] [-D binddn] [-w passwd] [-h ldaphost] [-p ldapport] [-f file]
On va créer une « organizationalUnit People » et un utilisateur « jfgiraud ».
L'« organizationalUnit People » contiendra les utilisateurs du système (voir Authentification avec LDAP)
dn: ou=People,dc=maboite,dc=fr objectclass: organizationalUnit ou: People description: Personnel dn: uid=jfgiraud,ou=People,dc=maboite,dc=fr objectclass: person objectclass: inetOrgPerson uid: jfgiraud cn: Giraud givenname: jean-francois sn: jeff mail: jfgiraud@maboite.fr dn: uid=ggiraud,ou=People,dc=maboite,dc=fr objectclass: person objectclass: inetOrgPerson uid: ggiraud cn: Giraud givenname: guy sn: guy mail: ggiraud@maboite.fr
On exécute la commande suivante de la même manière que précédemment :
Le résultat obtenu est le suivant :
adding new entry ou=People,dc=maboite,dc=fr adding new entry uid=jfgiraud,ou=People,dc=maboite,dc=fr
Pour rechercher une entrée de l'annuaire LDAP, on utilise la commande ldapsearch.
SYNOPSIS ldapsearch [-n] [-u] [-v] [-k] [-K] [-t] [-A] [-B] [-L] [-R] [-d debuglevel] [-F sep] [-f file] [-D binddn] [-W] [-w bindpasswd] [-h ldaphost] [-p ldapport] [-b search base] [-s base|one|sub] [-a never|always|search|find] [-l timelimit] [-z sizelimit] filter [attrs...]
Exemples
uid=jfgiraud,ou=People,dc=maboite,dc=fr objectclass=person objectclass=inetOrgPerson uid=jfgiraud cn=Giraud givenname=jean-francois sn=jeff mail=jfgiraud@maboite.fr creatorsname=cn=admin,ou=People,dc=maboite,dc=fr modifiersname=cn=admin,ou=People,dc=maboite,dc=fr createtimestamp=20010630095218Z modifytimestamp=20010630095218Z
uid=jfgiraud,ou=People,dc=maboite,dc=fr objectclass=person objectclass=inetOrgPerson uid=jfgiraud cn=Giraud givenname=jean-francois sn=jeff mail=jfgiraud@maboite.fr creatorsname=cn=admin,ou=People,dc=maboite,dc=fr modifiersname=cn=admin,ou=People,dc=maboite,dc=fr createtimestamp=20010630095218Z modifytimestamp=20010630095218Z uid=ggiraud,ou=People,dc=maboite,dc=fr objectclass=person objectclass=inetOrgPerson uid=ggiraud cn=Giraud givenname=guy sn=guy mail=ggiraud@maboite.fr creatorsname=cn=admin,ou=People,dc=maboite,dc=fr modifiersname=cn=admin,ou=People,dc=maboite,dc=fr createtimestamp=20010630095218Z modifytimestamp=20010630095218Z
Pour supprimer une entrée de l'annuaire LDAP, on utilise la commande ldapdelete.
SYNOPSIS ldapdelete [-n] [-v] [-k] [-K] [-c] [-d debuglevel] [-f file] [-D binddn] [-W] [-w passwd] [-h ldaphost] [-p ldapport] [dn]...
On supprime l'utilisateur « jfgiraud ». Pour cela, il faut fournir le DN complet à la commande ldapdelete.
On peut à nouveau rechercher pour vérifier la suppression (ou utiliser l'option -v avec la commande ldapdelete pour le mode verbose).
Résultat :
uid=ggiraud,ou=People,dc=maboite,dc=fr objectclass=person objectclass=inetOrgPerson uid=ggiraud cn=Giraud givenname=guy sn=guy mail=ggiraud@maboite.fr creatorsname=cn=admin,ou=People,dc=maboite,dc=fr modifiersname=cn=admin,ou=People,dc=maboite,dc=fr createtimestamp=20010630095218Z modifytimestamp=20010630095218Z
Pour modifier une entrée de l'annuaire LDAP, on utilise la commande ldapmodify.
SYNOPSIS ldapmodify [-a] [-b] [-c] [-r] [-n] [-v] [-k] [-s] [-d debuglevel] [-D binddn] [-W] [-w passwd] [-h ldaphost] [-p ldapport] [-f file]
On va changer l'adresse email de guy et la passer à guy.giraud@maboite.fr. Pour cela, il faut créer un fichier LDIF (ex: files/modification.txt).
dn: uid=ggiraud,ou=People,dc=maboite,dc=fr changetype: modify replace: mail mail: guy.giraud@maboite.fr - add: title title: Papa - delete: givenname -
On exécute la commande (avec le mode verbose) :
On a sur la sortie standard :
replace mail: guy.giraud@maboite.fr add title: Papa delete givenname: modifying entry uid=ggiraud,ou=People,dc=maboite,dc=fr modify complete
Résultat de la recherche pour vérification :
uid=ggiraud,ou=People,dc=maboite,dc=fr objectclass=person objectclass=inetOrgPerson uid=ggiraud cn=Giraud sn=guy creatorsname=cn=admin,ou=People,dc=maboite,dc=fr createtimestamp=20010630105747Z modifytimestamp=20010630105915Z modifiersname=cn=admin,ou=People,dc=maboite,dc=fr mail=guy.giraud@maboite.fr title=Papa
Pour remplir l'annuaire, j'ai utilisé un script écrit en perl qui lit un fichier texte (contenant noms et prénoms, l'identifiant, le surnom et l'adresse email séparés par des points virgules).
Voici le fichier contenant les données :
Jean-Francois Giraud;jfgiraud;jeff;jfgiraud@maboite.fr Christophe Poulain;cpoulain;chris;christophe.poulain@maboite.fr
Il faut avoir au préalable installé perl et le package libnet-ldap-perl
Et le script perl...
#!/usr/bin/perl -w use strict; use Net::LDAP; my $ldap = Net::LDAP->new('localhost', async => 1) or die "$@"; # on se connecte en root $ldap->bind(dn=>"cn=admin,ou=People,dc=maboite,dc=fr", password=>"toto") or die "$@"; my $mesg = $ldap->search ( # perform a search base => "ou=People,dc=maboite,dc=fr", filter => "objectclass=inetOrgPerson" ); $mesg->code && die $mesg->error; foreach my $entry ($mesg->all_entries) { $entry->dump; } # on lit un fichier qui contient les personnes à créer dans l'annuaire open (FILE, "<personnel.lst"); my $line; while (defined ($line = <FILE>)) { chomp($line); if ($line =~ /^\s*$/) { next; } my ($cn, $uid, $sn, $email) = split(/;/, $line); my $dn = "uid=$uid,ou=People,dc=maboite,dc=fr"; print "dn=$dn\n"; my $res = $ldap->add(dn=>$dn, attrs => [ "objectclass" => [ 'Person', 'inetOrgPerson'], "cn" => [ $cn ], "uid" => [ $uid ], "sn" => [ $sn ], "mail" => [$email] ]); $res->code && warn "failed to add entry: ", $res->error ; } close(FILE);
Il s'agit d'un script en python qui utilise le module ldap disponible à partir de l'adresse http://www.python.org
Sur mon architecture, je l'ai installé avec :
Et le script en python...
#!/usr/local/bin/python import sys, ldap try: l = ldap.open('localhost', 389) l.simple_bind_s("cn=admin,ou=People,dc=maboite,dc=fr", "toto") except: print "Erreur n°", l.errno sys.exit(1) res = l.search_s("dc=maboite,dc=fr", ldap.SCOPE_SUBTREE, "objectclass=*", None, 0); for dn,hash in res: print "dn:", dn for attr in hash.keys(): print "attr %s: %s" % (attr, hash[attr]) print '-'*80
L'exécution de ce script fournit le résultat suivant :
dn: dc=maboite,dc=fr attr o: ['maboite'] attr dc: ['maboite,fr'] attr modifytimestamp: ['20010630105744Z'] attr creatorsname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr postalcode: ['33310'] attr description: ['Le nom de mon entreprise'] attr objectclass: ['dcobject,organization'] attr modifiersname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr createtimestamp: ['20010630105744Z'] -------------------------------------------------------------------------------- dn: ou=People,dc=maboite,dc=fr attr modifytimestamp: ['20010630105747Z'] attr creatorsname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr objectclass: ['organizationalUnit'] attr description: ['Personnel'] attr createtimestamp: ['20010630105747Z'] attr modifiersname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr ou: ['People'] -------------------------------------------------------------------------------- dn: uid=ggiraud,ou=People,dc=maboite,dc=fr attr modifytimestamp: ['20010630105915Z'] attr uid: ['ggiraud'] attr creatorsname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr mail: ['guy.giraud@maboite.fr'] attr objectclass: ['person ', 'inetOrgPerson'] attr title: ['Papa'] attr cn: ['Giraud'] attr createtimestamp: ['20010630105747Z'] attr modifiersname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr sn: ['guy'] -------------------------------------------------------------------------------- dn: uid=jfgiraud,ou=People,dc=maboite,dc=fr attr modifytimestamp: ['20010630134726Z'] attr cn: ['Jean-Francois Giraud'] attr creatorsname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr mail: ['jfgiraud@maboite.fr'] attr objectclass: ['Person', 'inetOrgPerson'] attr uid: ['jfgiraud'] attr createtimestamp: ['20010630134726Z'] attr modifiersname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr sn: ['jeff'] -------------------------------------------------------------------------------- dn: uid=cpoulain,ou=People,dc=maboite,dc=fr attr modifytimestamp: ['20010630134727Z'] attr cn: ['Christophe Poulain'] attr creatorsname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr mail: ['christophe.poulain@maboite.fr'] attr objectclass: ['Person', 'inetOrgPerson'] attr uid: ['cpoulain'] attr createtimestamp: ['20010630134727Z'] attr modifiersname: ['cn=admin,ou=People,dc=maboite,dc=fr'] attr sn: ['chris'] --------------------------------------------------------------------------------
Ouvrir le carnet d'adresse de Netscape.
Dans le menu « File » sélectionner « New Directory » puis spécifier les paramètres du serveur LDAP.
Une fois validé, on revient dans le carnet. On sélectionne l'annuaire LDAP à utiliser et spécifions la chaine à rechercher...
Et voila, les noms qui correspondent à la chaine entrée sont
affichés dans la liste de droite.