Vous êtes sur la page 1sur 8

Implémenter l’Annuaire Open LDAP et Authentification

Présentation de protocole LDAP.


LDAP signifie "Lightweight Directory Access Protocol“:
LDAP est un protocole, ce qu'il signifie que son rôle est de présenter des informations. Un serveur LDAP agit en tant
qu'intermédiaire entre une source de données et un client.
LDAP fonctionne sur le port TCP 389
Caractéristiques d’OpenLDAP.
On peut regrouper les caractéristiques et fonctionnalités de l'annuaire LDAP sous la forme de quatre modèles :
• Le modèle de nommage : définit comment l'information est stockée et organisée
- Ranger les entrées dans une structure hiérarchique
o Directory Information Tree (DIT)
- Les nommer de façon distincte
o RDN (Relative Distinguished Name) Ex : "cn=ventes"
o DN (Distinguished Name) Ex : "cn=ventes,ou=groups,dc=martymac,dc=com"
• Le modèle fonctionnel : définit les services fournis par l'annuaire (recherche, ajout, ...)
- Il existe plusieurs types d'opérations que l'on peut effectuer sur l'annuaire, voici les plus importantes :
o Rechercher une entrée suivant certains critères
o S'authentifier
o Ajouter une entrée
o Supprimer une entrée
o (Modifier une entrée)
o Renommer une entrée
• Le modèle d'information : définit le type d'informations stockées
- Les attributs
- Les classes d'objets
- Les schémas : la syntaxe et la liste des attributs connus de l'annuaire sont écrits dans ce que l'on appelle les
"schémas".
- Le format LDIF : Les données contenues dans l'annuaire sont présentées dans un certain format : il s'agit du
format LDIF (LDAP Data Interchange Format). Dans ce format, chaque entrée constitue un paragraphe, et, au
sein de chaque paragraphe, chaque ligne constitue un attribut.

• Le modèle de sécurité : définit les droits d'accès aux ressources


- L'annuaire met en place un mécanisme d’authentification, pour avoir accès aux données qu'il contient.
- L'une des opérations préalables à l'interrogation de l'annuaire est cette opération dite de "binding», Le client
envoie alors le DN d'un compte contenu dans l'annuaire lui-même, ainsi que le mot de passe associé. On
pourra par la suite appliquer des droits particuliers sur ce compte en utilisant les ACLs.
- Le chiffrement des communications (SSL/TLS)
Installation d’OpenLDAP.
Après avoir étudié les nombreux concepts liés aux annuaires LDAP, passons désormais à la pratique et étudions
l'implémentation libre la plus utilisée : OpenLDAP.
- Les packages à installer :
o openldap
o openldap-servers
o openldap-clients
o openldap-devel
Démarrage et arrêt de service.

Démons et utilitaires d’OpenLDAP.


Démons :
- slapd : le démon OpenLDAP !
- slurpd : le démon de réplication
Commandes online/offline

On distingue deux modes de fonctionnement :


1. m´méthode offline (sans passer par le serveur LDAP) : Dans ce cas, on utilisera la commande slapadd. Ces
commandes sont n´nécessairement tapées sur le serveur LDAP.
2. méthode online (en passant par le serveur LDAP) : commande ldap*. Ces commandes peuvent être utilisées
indifféremment depuis le serveur ou un client LDAP
Commandes de manipulation de la base (backend) gérée par OpenLDAP
- slapindex : crée les index au sein de la base
- slapcat : effectue un dump (une copie intégrale) de la base
- slapadd : ajoute des entrées LDIF dans la base
- slappasswd : utilitaire de conversion de mots de passe
Commandes de test/validation :
- slaptest : teste la validité du fichier de configuration slapd.conf
- slapdn : teste la conformité d'un DN donné en ligne de commande
Les commandes clientes
- ldapsearch : effectue une recherche au sein de l'annuaire
- ldapadd : ajoute une entrée
- ldapdelete : supprime une entrée
- ldapmodify : modifie une entrée (ajoute/suppr. un attribut, ajoute/suppr. une entrée, ...)
- ldapmodrdn : modifie le rdn d'une entrée (renomme une entrée)
- ldappasswd : modifie le mot de passe d'une entrée LDAP
- ldapwhoami : affiche avec quel utilisateur le binding a eu lieu
- ldapcompare : permet de comparer l'attribut d'une entrée à une valeur spécifiée
Filtres de recherche.
La base
La base est le DN à partir duquel nous allons agir. Pour une recherche, il s'agir du noeud à partir duquel est effectuée
la recherche. Il peut s'agir de la racine de l'arbre pour une recherche sur la totalité de l'arbre, par exemple
"dc=martymac,dc=com".
La portée
La portée (scope) est le nombre de niveaux sur lesquels l'action va être effectuée. Il existe 3 niveaux différents :
o SUB : l'action est effectuée récursivement à partir de la base spécifiée sur la totalité de l'arborescence.
o ONE : l'action est effectuée sur un seul niveau inférieur par rapport à la base spécifiée (les fils directs).
o BASE : l'action est effectuée uniquement sur la base spécifiée. Une recherche sur "dc=mydomain,dc=org" avec
la portée BASE renverrait cette entrée uniquement.
Les filtres
Un filtre va permettre d'effectuer des tests de correspondance lors d'une recherche. Il s'agit en quelques sortes du
critère de la recherche.
Il existe 4 tests basiques, qui peuvent ensuite être combinés :
- Le test d'égalité : X=Y
- Le test d'infériorité : X<=Y
- Le test de supériorité : X>=Y
- Le test d'approximation : X~=Y
Les autres opérateurs (<, >) ou des tests plus complexes peuvent être mis en place par combinaison, il faut alors
utiliser les parenthèses ( ) et l'un des opérateurs suivants :
- L'intersection (et) : &
- L'union (ou) : |
- La négation (non) : !
Un test d'inférioté stricte pourrait donner ceci : (&(X<=Y)(!(X=Y)))
On peut combiner plus de deux éléments : (&(X=Y)(Y=Z)(A=B)(B=C)(!(C=D)))
NSS, PAM.
NSS
Dans un fonctionnement NSS, un fichier /etc/nsswitch.conf détermine pour différents types de résolutions la source
d’information à privilégier, et les applications ayant besoin de ces informations vont consulter les sources dans l’ordre
imposé par le fichier nsswitch.conf. La résolution s’appuie alors sur des bibliothèques NSS (libnss_X.so où X représente
le service de résolution employé), et les applications n’ont pas besoin de connaître directement la méthode de
résolution employée.
PAM
Si NSS représente déjà un progrès par rapport aux fichiers statiques utilisés dans les premiers temps, la révolution
viendra avec PAM (Pluggable Authentication Module). PAM est un mécanisme complémentaire de NSS qui assure une
authentification sur mesure par l’exécution de modules au choix de l’administrateur.
Lors d’une ouverture de session Linux, l’utilisateur va présenter un identifiant et un mot de passe. Grâce à la
résolution NSS, on en déduira les identifiants uid/gid, ainsi que les autres paramètres nécessaires (date d’expiration,
etc.). PAM de son côté va en fonction de sa configuration exécuter des modules pour assurer l’authentification mais
aussi éventuellement pour effectuer certaines tâches liées à l’ouverture de session, comme la définition de variables
par exemple.
PAM se positionne en interface entre les applications et les méthodes d’authentification.

Chaque application s’appuyant sur PAM aura besoin d’un fichier (en général du même nom que l’application) qui
contiendra sa configuration PAM dans le repértoire /etc/pam.d

Les types d’action de PAM


Chaque ligne d’un fichier de configuration PAM doit commencer par l’un des quatre mots-clés qui détermine dans
quel type d’action le module est compétent.
 auth : l’activité d’authentification proprement dite. Les modules appelés avec l’action auth sont exécutés pour
ou pendant l’authentification.
 account : accès à des informations des comptes autres que les éléments d’authentifications proprement dits.
 session : actions à réaliser avant ou après l’ouverture de session.
 password : gestion des mots de passe.
Les contrôles comportements des modules
Les modules vont être appelés avec un « control_flag » (marqueur de contrôle) qui va déterminer le comportement
sur échec ou réussite du module.
Cet élément obligatoire est le deuxième champ sur la ligne de configuration.
 required : le module doit obligatoirement renvoyer un succès. Si un module d’authentification est required, son
échec empêche l’ouverture de session. Les autres modules de la pile sont néanmoins exécutés.
 requisite : le module doit obligatoirement renvoyer un succès. Si un module d’authentification est requisite, son
échec empêche le l’ouverture de session. Les autres modules de la pile ne sont pas exécutés.
 sufficient : si le module est exécuté avec succès et si aucun module required ou requisite n’a échoué, les autres
modules de la pile sont ignorés.
 optional : le module peut réussir ou échouer sans influencer le reste de la pile. C’estàdire que si un module
optional échoue, et qu’un module required de la même pile réussit, alors le résultat global de l’exécution de la
pile est positif.
Fichiers de configuration d’OpenLDAP
Les fichiers de configuration d'OpenLDAP sont installés dans le répertoire /etc/openldap/. Ci-dessous figure une brève
liste des répertoires et fichiers les plus importants :
 /etc/openldap/ldap.conf — Ce fichier est le fichier de configuration pour toutes les applications clientes qui
utilisent les bibliothèques OpenLDAP telles que ldapsearch...
 /etc/openldap/slapd.conf — Ce fichier est le fichier de configuration du démon slapd.
 Le répertoire /etc/openldap/schema/ — Ce sous-répertoire contient le schéma utilisé par le démon slapd.
Configuration du serveur : /etc/ldap/slapd.conf
Le fichier de configuration est subdivisé en trois sections importantes :
- la section globale (début du fichier)
- la section concernant les options de backends (débute par "backend")
- la section concernant les déclarations et les options des arborescences gérées (débute par "database")
#######################################################################
# Directives globales
# Inclusion des schemas
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
# Où sera stocke le PID du demon
pidfile /var/run/slapd/slapd.pid
# Liste des arguments passes au demarrage du serveur
argsfile /var/run/slapd.args
# Niveau de log
loglevel 0
# Emplacement des modules
# Chargement du module BDB (Berkeley DB)
modulepath /usr/lib/ldap
moduleload back_bdb
#######################################################################
# Déclaration des options pour le premier type de backend utilise : bdb
# Toutes les options s'y appliquent jusqu'a la prochaine directive
# backend
#backend bdb
#######################################################################
#backend <autre>
#######################################################################
# Déclaration des options de la première "base", c'est a dire de la
# première (et unique ici) arborescence gérée par notre annuaire
# Toutes les options s'y appliquent jusqu'a la prochaine directive
# database
database bdb
checkpoint 512 30
# La racine de notre arborescence
suffix "dc=martymac,dc=com"
# Le compte administrateur de notre arborescence et son mot de passe
rootdn "cn=Manager,dc=martymac,dc=com"
rootpw "secret"
# Où sont stockes les fichiers BDBs de notre arborescence
directory "/var/lib/ldap"
# Options d'index
index objectClass eq
# Sauvegarde de l'heure a laquelle est modifiée une entrée
lastmod on
# ACLs de notre première arborescence :
# Une personne non authentifiée peut s'authentifier
# Une personne authentifiée peut modifier son propre mot de passe
# Les autres n'ont pas accès à l'attribut mot de passe
access to attrs=userPassword
by anonymous auth
by self write
by * none
# Tout le monde peut lire l'annuaire
access to *
by * read
#######################################################################
# Autre arborescence
#database <autre>
#suffix "dc=debian,dc=org"
#*...+
Testez-là ensuite pour voir si aucune erreur n'a été commise :
# slaptest -f /etc/ldap/slapd.conf
Enfin, (re)-démarrez le serveur LDAP :
# /etc/init.d/slapd restart
Administration du serveur
Attention !!! Les commandes que nous utilisons ici n'utilisent pas le protocole LDAP mais
accèdent directement à la base de données sous-jacente (BDB dans notre cas). Il est donc
impératif de toujours couper le serveur LDAP avant d'utiliser une commande slap(...), afin
d'éviter un accès concurrent depuis le serveur lui-même, ce qui pourrait corrompre la base
de données.
slapindex
Nous avons configuré notre serveur pour qu'il utilise des index ; la première chose à effectuer avant d'utiliser
notre serveur est donc de les générer. Il faut en effet initialiser les index pour qu'OpenLDAP puisse ensuite les
utiliser et les maintenir.
L'opération de génération n'est à effectuer qu'une seule fois et ceci se fait par le biais de la commande
slapindex.
# slapindex
slapcat
Slapcat est une commande très utile au quotidien. Elle effectue un "dump" de la base LDAP au format LDIF. Il est
conseillé de l'utiliser régulièrement pour effectuer des sauvegardes de notre annuaire.
Par défaut, slapcat affiche les informations sur la sortie standard, il faut donc la rediriger vers un fichier pour
obtenir notre sauvegarde :
# slapcat > sauvegarde.ldif
slapadd
Slapadd est l'inverse de slapcat. Cette commande permet de peupler notre annuaire en utilisant un fichier LDIF.
Elle est typiquement utilisée pour restaurer une sauvegarde effectuée avec slapcat :
# slapadd < sauvegarde.ldif

Applications client LDAP.


Configuration du pc en client LDAP
Les paquetages openldap, openldap-clients et nss_ldap doivent être installés sur tous les ordinateurs clients LDAP

La dernière opération consiste à configurer le PC en client LDAP, de façon qu'il puisse se servir de ce service pour
permettre la connexion des utilisateurs.
Fichier /etc/nsswitch.conf : à modifier pour rajouter le service ldap
passwd: ldap files nis
shadow: ldap files nis
group: ldap files nis
Fichier /etc/ldap.conf : description du serveur LDAP et de l'annuaire utilisés par le service PAM du client. Le minimum
à renseigner est :
host 192.168.x.y
base dc= ista,dc=ma
rootbinddn cn=admin,dc=ista,dc=ma
Si besoin, éditer le reste du fichier pour mentionner la branche dc= ista,dc=ma dans les lignes non commentées qui le
nécessitent.
Fichier /etc/openldap/ldap.conf : description du serveur LDAP et de l'annuaire utilisés par le client. Le minimum à
renseigner est :
BASE dc= ista, dc=ma
HOST 127.0.0.1
URI ldap://localhost:389
Ainsi, une interrogation de l'annuaire devient simplement :
# ldapsearch -x
Configuration de l’authentification avec OpenLDAP.
Ajouter une entrée : ldapadd
Pour ajouter une entrée dans l'annuaire, il faut utiliser la commande ldapadd. Sa syntaxe est la
suivante :
ldapadd -W -D <binddn> -x -H ldap://<serveur> -f <fichier.ldif>
L'option "-W" active la demande de mot de passe pour s'authentifier en tant que <binddn>.
L'option "-x" permet de ne pas utiliser SASL pour l'authentification.
Enfin, le fichier LDIF source doit contenir une (ou plusieurs) entrée(s) à insérer et l'intégralité de ses (leurs)
attributs.
Exemple :
Fichier LDIF à insérer (fichier.ldif) :

Insertion de l'entrée :
# ldapadd -W -D "cn=Manager,dc=martymac,dc=com" -x -H ldap://localhost -f fichier.ldif
Initialiser l'annuaire Fichier LDIF à insérer (fichier.ldif) :
Rechercher une entrée : ldapsearch
La commande ldapsearch permet d'effectuer une recherche au sein de l'annuaire. Voici sa Syntaxe :
ldapsearch -x -H ldap://<serveur> -b <base> [-s portée] [filtre] [attributs]
Elle reprend bien évidemment les concepts que nous avons abordés jusqu'ici :
- la base de la recherche
- la portée de la recherche (base, one ou sub) - sub est la portée par défaut
- le filtre
- le ou les attributs que l'on souhaite afficher - l'entrée entière est affichée par défaut
Exemples :
On recherche tous les uid commençant par "garf" à partir de la racine de l'annuaire :
ldapsearch -x -H ldap://localhost -b "dc=martymac,dc=com" "(uid=garf*)"
On recherche toutes les entrées ayant un gidNumber égal à 2000 :
ldapsearch -x -H ldap://localhost -b dc=martymac,dc=com "(gidNumber=2000)"
Cette commande nous retourne les 2 utilisateurs, mais aussi le groupe car il possède lui aussi l'attribut gidNumber.
Améliorons notre requête pour ne retourner que les deux comptes utilisateurs :
ldapsearch -x -H ldap://localhost -b dc=martymac,dc=com "(&(gidNumber=2000)(objectClass=posixAccount))"
On affiche enfin uniquement leur répertoire home (et pas la totalité de l'entrée comme c'est le cas par défaut) :
ldapsearch -x -H ldap://localhost -b dc=martymac,dc=com "(&(gidNumber=2000)(objectClass=posixAccount))"
homeDirectory
Supprimer une entrée : ldapdelete
La suppression d'une entrée se fait par la commande ldapdelete. Voici sa syntaxe :
ldapdelete -W -D <binddn> -x -H ldap://<serveur> <dn>
Puisqu'un effacement correspond à une écriture, il faudra, la plupart du temps, s'authentifier (à la différence de
ldapsearch).
Il est possible d'effacer récursivement une branche complète en utilisant l'option "-r" sur le noeud de la branche.
Attention, commande potentiellement dangereuse !
Exemples :
Suppression de l'utilisateur odie :
ldapdelete -x -H ldap://localhost -W -D "cn=Manager,dc=martymac,dc=com"
"uid=odie,ou=users,dc=martymac,dc=com"
Suppression de la branche users :
ldapdelete -x -H ldap://localhost -W -D "cn=Manager,dc=martymac,dc=com" -r
"ou=users,dc=martymac,dc=com"
Modifier une entrée : ldapmodify
ldapmodify -W -D <binddn> -x -H ldap://<serveur> -f <fichier.ldif>

Renommer une entrée : ldapmodrdn


ldapmodrdn -W -D <binddn> -x -H ldap://<serveur> <dn> <nouveau_rdn>
ldapmodrdn -W -D "cn=Manager,dc=martymac,dc=com" -x -H ldap://localhost
"uid=ali,ou=users,dc=martymac,dc=com" "uid=ahmed"
Migration des informations d’authentification vers OpenLDAP.
Le but est d'utiliser l'annuaire LDAP à la place des fichiers /etc/passwd, /etc/group et /etc/shadow pour utiliser un
mécanisme d'identification/authentification LDAP. Pour tester, on va créer un utilisateur testldap. Les informations de
connexion de cet utilisateur seront migrées sous LDAP, puis effacées des fichiers /etc/passwd, /etc/group et
/etc/shadow. On pourra alors vérifier que le système LDAP permet bien la connexion de cet utilisteur.
Créer un utilisateur testldap : useradd testldap. Lui affecter un mot de passe avec la commande : passwd testldap.
Récupération des outils de migration
Créer une version filtrée des fichiers passwd et group en ne retenant que les informations de testldap, et les
mettre dans des fichiers passwd et group :
grep testldap /etc/group > group
grep testldap /etc/passwd > passwd
Lancer les scripts migrate_group.pl et migrate_passwd.pl en prenant bien soin d'utiliser les versions raccourcies
des fichiers passwd et group :
./migrate_group.pl group group.ldif
./migrate_passwd.pl passwd passwd.ldif
Examiner les fichiers LDIF créés.
Création des objets préliminaires
Pour pouvoir enregistrer les utilsateurs, il faut créer les objets (de type organizationalUnit) People et Group . Éditer le
fichier init2.ldif comme suit :
dn: ou=Group,dc=tpal,dc=fr
objectclass: organizationalUnit
ou: Group
description: Groupes
dn: ou=People,dc=tpal,dc=fr
objectclass: organizationalUnit
ou: People
description: People

Ajouter les informations du fichier init2.ldif avec la commande ldapadd :

Ajouter les informations des fichiers group.ldif et passwd.ldif avec la commande ldapadd :

Vérifier le conetnu de l'annuaire avec la commande

Supprimer l'utilisateur testldap : userdel testldap.