Gestion des Annuaires Informatiques LDAP
Gestion des Annuaires Informatiques LDAP
annuaires
1.1 Introduction.
Un annuaire va pouvoir regrouper toutes ces informations et surtout s'interfacer avec les
applications qui utilisent ces données.
Par exemple, comment envoyer un mail contenant leurs nouvelles coordonnées de compte UNIX, à
l'ensemble du personnel administratif sachant que l'administrateur système ne les connaît que par
leur nom et prénom. Un annuaire va permettre de faire cette opération sans que l'opérateur ait à
intervenir manuellement.
1
1.1.2Concept d'annuaire
Un annuaire informatique est un service permettant d'accéder à des informations relatives à des
personnes, des machines (ou d'autres ressources) de manière organisée (arborescente).
L'objectif est de maintenir de façon cohérente et contrôlée une grande quantité de données.
Ce n'est pas exactement un système de gestion de base de données (SGBD) dans lequel le schéma
des données stockées est défini pour résoudre un certain problème. Ce schéma est connu des
applications et les objets sont généralement complexes, stockés dans différentes tables ayant des
relations entre elles (base de données relationnelle). Un langage spécifique permet la lecture et mise
à jour des tables (requêtes SQL, …).
2
Client Protocole Serveur Serveur
applicatif : LDAP
Applicatif : Applicatif : LDAP
Web, WEB, Mail...
Mail... HTTP, POP,
IMAP... +Client LDAP
1.2.1 Présentation
LDAP (Lightweight Directory Access Protocol) a été initialement présenté comme un protocole à
destination des postes de travail. Il a été proposé à l'IETF en 1995. Il est l'héritier de l'annuaire
X500 (proposée par l'ISO), un standard conçu par les opérateurs télécom pour interconnecter leurs
annuaires téléphoniques. X500 est basé sur le modèle OSI.
LDAP peut être vu comme une adaptation de X500 à Internet (même modèle de schéma, …), mais
simplifié dans un premier temps. Il est basé sur la pile de protocoles TCP/IP (Port TCP 389 du
serveur).
Le standard ne concerne pas le contrôle d'accès aux données de l'annuaire, il ne définit pas non plus
le moyen de stockage des données. La version actuelle est la version 3 [RFC 3377][RFC4510]. Elle
définit 9 opérations fondamentales. De nombreux compléments sont aussi publiés : RFC 2251 à
2256, RFC 2829 à 2830, RFC 2849...
1.2.2Principes
LDAP est d'abord un protocole permettant à un client d'interroger un serveur. Il y a donc une
normalisation d’un ensemble de messages. Mais pour garantir l'interopérabilité, il n'y a pas de
précision sur le stockage des données, à charge au serveur LDAP de transformer le format de
stockage interne des données en directives normalisées lors de l'échange avec le client. Plusieurs
formats internes peuvent d'ailleurs être possibles sur un serveur (bdb, hdb...).
3
Requêtes et Format Stockage
réponses LDAP interne des
Client Serveur
LDAP LDAP données
BdD
Dans cette deuxième version, le modèle d'information définit les structures et types des
informations contenues dans l'annuaire. Cela ressemble aux déclarations de type dans un langage
informatique. C'est une description générale des données applicables à plusieurs usages.
Le modèle de nommage décrit comment l'information est organisée et référencée : chaque entrée
doit être définie de manière unique par un nom : DN (Distinguished Name).
Ce DN est la concaténation de RDN (Relative Distinguished Name) qui est un attribut spécifique à
valeur unique à un niveau de l’arbre.
Cette concaténation donne un nom complet unique de type :
DN:cn=adminposte5, ou=poste5, dc=istase2003, dc=fr
Il est constitué des RDN ou=poste5 et cn=adminposte5, la racine du nom étant dc=istase2003,dc=fr.
Il est construit sous forme d’arbre (DIT : directory information tree). Une entrée d’annuaire est un
nœud de l’arbre, chaque nœud possède des attributs. La forme de l'arbre est spécifique à une
application, ce qui permet au client et au serveur d'interagir.
Le modèle fonctionnel correspond au protocole : c'est la liste et la syntaxe des requêtes permettant
l'interrogation de la base et la mise à jour des informations. C’est le protocole LDAP.
Le modèle de sécurité permet de gérer l'authentification des clients, la vérification des droit
d ’accès, ceci depuis LDAPv3. Certaines fonctionnalités ne sont pas normalisées.
Un annuaire est modélisé par un schéma LDAP qui va déterminer les objets utilisables dans
l'annuaire. Un schéma LDAP définit une liste des classes d'objets, les types des attributs et leur
4
syntaxe répondant aux normes de l'Object Management Group (OMG). Ils sont standardisés
(IANA) : pour permettre l'interopérabilité entre logiciels et surtout l'interfaçage avec les
applications clientes (Samba, …). Quoi qu'il en soit, il est possible de rajouter des schémas
spécifiques pour utiliser LDAP dans des environnements non standard.
Les classes d'objets modélisent des objets réels : un compte Unix (posixAccount), une organisation
(o), un département (ou), un personnel (organizationPerson), une imprimante (device), …
ou abstraits : l'objet père de tous les autres (top), …
Une classe d'objet est définie par : un nom, un OID, des attributs obligatoires, des attributs
optionnels, un type (structurel, auxiliaire ou abstrait).
Exemple :
objectclass ( [Link] NAME 'person'
DESC 'RFC2256: a person'
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description )
)
Un attribut est défini lui aussi par un nom et un identifiant d’objet unique (OID), l'OID est attribué
par l’IANA sous la forme d'une suite de nombres (exemple : [Link].4.1.65234.23 décrit ISO ; org ;
dod ; internet ; private ; company ; « istase » ; cours …).
La définition du type de l'attribut (Attributetype) va spécifier la syntaxe de cet attribut et son
utilisation via des règles de comparaison. Dans l'exemple ci-dessous : « SYNTAX
[Link].4.1.1466.[Link]{32768} » précise que l'attribut est de type chaîne de caractères,
« caseIgnoreSubstringsMatch » précise qu'il ne faut pas tenir compte de la casse des lettres et des
espaces.
Exemples :
attributetype ( [Link] NAME 'name'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX [Link].4.1.1466.[Link]{32768} )
Les noms des attributs les plus courants ont des abréviations :
cn : common name
dc : domain component
sn : surname
Il y a alors deux noms séparés par un espace dans la déclaration NAME.
5
De même le pseudo attribut dn (Distinguished name) est toujours présent.
Un attribut peut-être mono ou multivalué s'il est présent plusieurs fois. Un objet peut-donc cumuler
les types s'il a plusieurs objectClass.
L'annuaire est construit sous forme arborescente, cet arbre est décrit par le DIT (directory
information tree). Chaque instanciation d'objets est placée dans cet arbre avec un certain nombre de
valeurs d'attributs. Il contient les données de l'annuaire (il correspondrait à la déclaration de
structures et à l'affectation des valeurs des champs dans un programme informatique).
Le DIT est décrit dans des fichiers ldif qui vont construire l'annuaire interne par traduction.
En fait, le nom de l'entrée dn un attribut toujours présent en première ligne, il a comme valeur la
position dans l'arbre de l'instance de l'objet (différents rdn séparés par des virgules)..
Il peut y avoir plusieurs entrées dans un fichier ldif, elles doivent être construites de manière
arborescente ordonnée. Par exemple, « dn:cn=adminposte5, ou=poste5, dc=istase2003, dc=fr » ne
peut être créé si le « dn:ou=poste5,dc=istase,dc=fr » ne l'est pas.
6
1.2.5 Le modèle fonctionnel : protocole LDAP
Il définit les échanges entre client et serveur, d'un point de vue des commandes disponibles, de
leurs arguments et de la syntaxe de la PDU.
LDAPv3 est conçu pour être extensible sans avoir à modifier la norme. Il permet l'ajout
d'opérations en plus des 9 de base (Extended Operation). Il permet aussi l'ajout de paramètres
associés à une opération.
Le format de transport des données n'est pas de l'ASCII comme SMTP, HTTP, … C'est un
encodage LBER : Lightweight Basic Encoding Rules. Le protocole LDAP utilise ASN1 + BER.
Exemple :
Nom ::= SEQUENCE {
name PrintableString (SIZE (1..30)),
address PrintableString (SIZE (1..60)),
moreaddress PrintableString (SIZE (1..30)) OPTIONAL,
zipcode NumericString (SIZE (5))}
7
Le deuxième (Form) a seulement 2 valeurs : Primitive (0) ; Constructed (1)
1.2.8Utilisation de LDAP
Les différents domaines d’application possibles des annuaires LDAP sont :
Les applications système (authentification, information sur les utilisateurs...)
Les applications Intranet/Extranet
Les applications Internet
Les bases de données
Serveur SAMBA
Requête avec module LDAP
NetBIOS
login/mot de
Client passe Serveur Client Serveur
Windows SAMBA8 LDAP LDAP
Requêtes et
réponses LDAP
1.3OpenLDAP sous Linux Debian
1.3.1 Présentation.
OpenLDAP est un serveur LDAP Opensource développé à partir de 1998. Il est distribué sous
forme de code source, mais est disponible compilé par exemple sur la plupart des distributions
Linux et existe aussi sous Windows. C'est un des serveurs LDAP le plus utilisé. Il propose un
démon permettant de traiter les requêtes LDAP, de bibliothèques servant à gérer le protocole, ainsi
que des utilitaires. La base de données associée est libre et dépend des plate-formes support et des
choix du gestionnaire (Berkeley Database – Bdb - par exemple et par défaut sous Debian Linux).
OpenLDAP fonctionne sur un serveur Debian à partir du démon slapd lancé comme un service par
systemctl. (systemctl restart slapd).
Le fichier de configuration au lancement du démon est soit le fichier /etc/ldap/[Link] (c'est un
fichier texte) soit un ensemble de fichiers LDIF sous le répertoire slapd.d s'il existe.
La configuration par défaut gère l'accès à des bases de données de type bdb. L'administrateur va
ajouter aux fichiers un certain nombre d'informations, en particulier pour chaque arborescence DIT,
une nouvelle base de données. Des exemples sont en général proposés dans le fichier. Ce fichier
peut aussi contenir des fichiers inclus permettant de séparer certaines étapes de la configuration.
Les fichiers schémas sont stockés dans le sous-répertoire /etc/ldap/schemas. Le fichier [Link]
est obligatoirement utilisé, les autres sont utilisable à la demande, il faut insérer à ce moment là leur
nom au bon endroit du fichier de configuration. Ces fichiers doivent être consultés chaque fois
qu'un problème de syntaxe LDAP est retourné par le serveur.
9
Avec cette méthode, l'ajout, la modification ou la suppression d'objets LDAP se fait serveur en
fonctionnement, car on fait les modifications en tant que client, elles sont donc prises en comptes
immédiatement. Des commandes équivalentes existent pour faire les mêmes choses serveur arrêté,
elles se nomment slapadd, slapmodify et slapdelete.
A chaque modification des fichiers de configuration, le serveur doit être relancé (systemctl restart
slapd), ceci permet d'avoir un serveur fonctionnant avec les bons paramètres. Attention, de bien
utiliser restart qui arrête le serveur avant de le relancer, sinon il peut y avoir plusieurs instances de
serveurs LDAP fonctionnant avec des paramètres différents.
Sous Debian, sa configuration se fait via un fichier de configuration commun (quelle que soit
l'application) /etc/ldap/[Link]. Il n'est pas relié à un démon mais va être consulté à chaque
lancement de commandes clientes.
Le fichier de configuration contient au minimum :
La définition du serveur LDAP par son URI (ou l'adresse IP du serveur en l'absence de DNS)
Sa base (le début de l'arborescence)
Sous Linux, un client LDAP simple peut-être installé afin de tester le serveur. Il va permettre, via
plusieurs commandes spécifiques (ldapcompare, ldapsearch...) de tester simplement le
fonctionnement d'une interrogation LDAP. En fait les commandes permettant d'ajouter des
informations à la base LDAP, de les supprimer sont aussi basées sur le même fichier. C'est à dire
qu'au démarrage au moins, le client LDAP doit aussi être configuré sur le serveur. Depuis des
versions plus récentes, les mêmes commandes mais nommées slpadadd… permettent de travailler
directement sur le serveur sans que celui-ci soit lancé (ces commandes sont spécialement
intéressantes pour construire des scripts au niveau du serveur car elles ne nécessitent pas un
lancement préalable).
L'utilisation de la base LDAP par une application serveur (Web, Mail...) va se faire suivant le même
principe que l'application cliente simple. En ajoutant des modules supplémentaires à l'application
serveur, celle-ci va devenir client LDAP. Par exemple, un serveur Web utilisant LDAP pour
l'authentification va être client LDAP d'un serveur LDAP pouvant se situer sur la même machine ou
sur une autre machine.
Il faut alors bien veiller à ce que les schémas utilisés soient ceux demandées par l'application
serveur et que le DIT inclus bien les différents objets et attributs nécessaires. C'est en général la
principale difficulté de mise en oeuvre de LDAP.
10
De même il faut modifier les fichiers de configuration en y ajoutant les lignes permettant de
prendre en compte le client LDAP, sous Apache il est nécessaire de rajouter au fichier de
configuration du site :
<Directory /home/webdir/dir_ldap>
...
AuthType Basic
AuthBasicProvider ldap
AuthName « LDAP Directory »
AuthzLDAPAuthoritative off
AuthLDAPURL ldap://adresseIP/dc=istase,dc=fr
AuthLDAPBindDN « uid=root,ou=admin,dc=istase,dc=fr »
AuthLDAPBindPassword admintest
Require valid-user
</Directory>
Dans certains cas, il est nécessaire de compléter le schéma LDAP avec des fichiers de schéma
supplémentaires, afin de trouver dans l'annuaire les objets nécessaires au bon fonctionnement de
l'application cliente. Lorsque l'application cliente interfère directement avec le système
d'exploitation (authentification LDAP sous UNIX au lieu des fichiers habituels), il faut être très
prudent car cela peut compromettre le fonctionnement complet du système.
1.3.5Réplication
Le fonctionnement de la réplication est défini dans le fichier [Link] que ce soit au niveau du
fournisseur (provider) ou du consommateur (consumer).
La syntaxe de ces fichiers de configuration est stricte : les tabulations (ou l'espace en début de
ligne) permet une continuation de la ligne précédente.
Il faut positionner cette directive à la suite des autres directives de même type.
(Exemples de configuration tirés de la documentation d'OpenLdap)
database bdb
suffix dc=Example,dc=com
rootdn dc=Example,dc=com
directory /var/ldap/db
index objectclass,entryCSN,entryUUID eq
11
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
On ajoute à une configuration de base uniquement les 3 dernières lignes : il permet de configurer le
rythme des synchronisation (toutes les 10 minutes ou les 100 écritures).
database hdb
suffix dc=Example,dc=com
rootdn dc=Example,dc=com
directory /var/ldap/db
index objectclass,entryCSN,entryUUID eq
syncrepl rid=123
provider=ldap://[Link]
type=refreshOnly
interval=[Link]
searchbase="dc=example,dc=com"
filter="(objectClass=organizationalPerson)"
scope=sub
attrs="cn,sn,ou,telephoneNumber,title,l"
schemachecking=off
bindmethod=simple
binddn="cn=syncuser,dc=example,dc=com"
credentials=secret
La configuration du client est un peu plus complexe, il faut le définir en particulier comme client
du serveur provider et déterminer quels éléments sont recopiés. Les lignes du début sont déjà
présentes dans la configuration de la base de données.
Pour le mettre en œuvre, il faut bien entendu remplacer les éléments entre guillemets par les bonnes
valeurs !
On peut aussi gérer 2 serveurs miroir, les 2 serveurs ayant alors un fonctionnement équilibré, une
modification sur l'un sera répliquée sur l'autre et vice-versa :
MirrorMode node 1:
# Global section
serverID 1
# database section
# syncrepl directive
syncrepl rid=001
provider=ldap://[Link]
bindmethod=simple
binddn="cn=mirrormode,dc=example,dc=com"
12
credentials=mirrormode
searchbase="dc=example,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
mirrormode on
MirrorMode node 2:
# Global section
serverID 2
# database section
# syncrepl directive
syncrepl rid=001
provider=ldap://[Link]
bindmethod=simple
binddn="cn=mirrormode,dc=example,dc=com"
credentials=mirrormode
searchbase="dc=example,dc=com"
schemachecking=on
type=refreshAndPersist
retry="60 +"
mirrormode on
La commande retry permet de contrôler les essais (60 : délai en cas de problème ; + : nombre
d'essais infini).
13
TP n°2 Module OptRx1
Ressources nécessaires au TP
Durant le TP, vous allez utiliser un PC client Windows et deux PC sous Debian Linux, l'un
pour le service LDAP, l'autre comme client.
2. Lancer le service LDAP : systemctl restart slapd. Bien vérifier que le démon est lancé,
certaines erreurs conduisent à un arrêt sans message.
4. Construire la base de données. Créer un fichier LDIF dans lequel vous insérerez les
définitions de base de l'arborescence et celle de l'utilisateur root appartenant à l'unité
d'organisation admin :
dn:dc=istase,dc=fr
objectclass: dcobject
objectclass:organization
o: istase directory service
dc: istase
dn:ou=admin,dc=istase,dc=fr
objectclass: OrganizationalUnit
ou: admin
dn: uid=root,ou=admin,dc=istase,dc=fr
Objectclass: InetOrgPerson
cn: root
sn:root
uid: root
userPassword : admintest
5. Toute opération sur la base de données, même à partir du serveur, passe par une interface
client, vous devez donc configurer, sur le serveur LDAP, le client LDAP, en utilisant le
fichier de configuration /etc/ldap/[Link].
URI ldap://[Link]
BASE dc=istase,dc=fr
14
6. Lancer la traduction du fichier LDIF pour être inséré dans la base hdb.
ldapadd -x -D « uid=root,ou=admin,dc=istase,dc=fr » -W -f /tmp/[Link]
Si vous voulez ajouter des entrées en utilisant le fichier ldif initial de manière incrémentale il
faut utiliser l'option -c dans ldapadd (ou ldapmodify)
8. Entrer les informations complémentaires dans la base concernant les utilisateurs user1,
user2 et user3 en les plaçant directement sur le domaine dc=istase, dc=fr dans une classe
d'objet de type « person ». Vérifier dans les fichiers de schéma les attributs obligatoires et
autorisés ([Link]). Modifier les entrées pour qu'elles soient acceptées par le serveur
LDAP.
10. Déplacer ces éléments (user1, user2 et user3) dans une unité d'organisation de nom
« standarduser ». On pourra utiliser la commande :
ldapdelete -v -x -D « DN root » -W -f /tmp/[Link]
en remplissant le fichier avec les DN à détruire dans l'ordre inverse de leur création.
Bien penser aussi à remplacer « DN root » par sa valeur !
11. Vérifier le contenu de la base complète. Puis vérifier le contenu de la base à partir du point
dn:ou=standarduser,dc=istase,dc=fr avec l'option -b de ldapsearch.
Phase 3 : Réplication
1. Configurer le serveur LDAP actuel pour qu'il devienne provider, et le client Linux pour qu'il
devienne un serveur esclave (consumer). Visualiser les échanges et les Log.
2. Elever le rang du deuxième serveur LDAP pour qu'il fonctionne en miroir avec le premier.
Visualiser les échanges.
15