LDAP
1. Installez un annuaire LDAP
Mais c’est quoi un annuaire LDAP ?
LDAP signifie Lightweight Directory Access Protocol. C’est le standard de fait pour
accéder à un annuaire. Un annuaire est une base de données qui va contenir des
informations sur des personnes, des machines, des groupes ou toute autre catégorie
que vous pourriez imaginer.
Un annuaire se distingue d’une base de données relationnelle par le fait qu’il a une structure
hiérarchique et qu’il est très rapide pour chercher et lire des éléments mais plus lent pour les
modifier.
Les annuaires sont couramment employés pour stocker les données
d’authentification (login et mot de passe) ou pour obtenir des informations sur des
personnes (email, téléphone, etc.) ou des objets (localisation, marque, modèle, etc.).
Toutes les applications de votre entreprise (site web, e-mail, comptes système des
ordinateurs, etc.) peuvent par exemple utiliser ce service d’annuaire pour valider les
identifiants de connexion.
Voyons plus précisément la structure d’un annuaire LDAP
Découvrez le fonctionnement de LDAP
Tout d’abord, un annuaire LDAP est un organisation hiérarchique d’entrées. Cette
organisation constitue un arbre appelé DIT (Directory Information Tree) dont une
des entrées est la racine.
Exemple d'un DIT de racine "dc=mon-entreprise,dc=com"
Chaque entrée peut contenir des attributs auxquels on assigne des valeurs.
Chaque entrée appartient au moins à une classe d’objet qui définit les attributs de
l’entrée.
Par exemple, la classe d’objet “Employés” pourrait définir qu’un “élément”
appartenant à cette classe doit contenir les attributs obligatoires :
nom de famille
prénom
et peut contenir les attributs facultatifs :
e-mail
téléphone
date de naissance
Chacun des attributs de cet élément aura une valeur. Par exemple, “nom de
famille=Dupond”.
De nombreux attributs et classes d’objets sont pré-définis mais il est possible de
définir les vôtres si besoin. L’ensemble des classes d’objets et attributs utilisés est
défini dans le schéma. Certains attributs sont particulièrement courants et
intéressants à connaître :
Attributs Fonction
dc (domain component) une partie d’un nom DNS. Pour une entreprise dont le nom de
domaine serait “mon-entreprise.com”, il est courant d’appeler la
racine du DIT “dc=mon-entreprise,dc=com”
cn (common name) le nom commun. Pour une personne, c’est en général le prénom + le
nom de famille
gn (given name) le prénom
sn (surname) le nom de famille
o (organization name) pour une entreprise ce serait le nom de l’entreprise ou de la filiale
ou (organisational unit) l’unité d’organisation. Pour une entreprise, ce serait le département
(commercial, comptabilité, etc.)
Un attribut particulier est le dn (distinguished name), c’est à dire le nom distinct.
C’est un attribut qui identifie de manière unique un élément dans le DIT. Il reprend
les noms de tous les éléments depuis la racine jusqu’à l’élément et indique ainsi un
“chemin” unique pour trouver l’élément.
Par exemple, le dn de “Marie Dupond” qui travaille chez “mon-entreprise.com”
pourrait être “cn=Marie Dupond,ou=Personnes,dc=mon-entreprise,dc=com”. On
appelle RDN, pour Relative Distinguished Name, la partie “finale” propre à Marie.
Ici le RDN serait “cn=Marie Dupon”. Lui, ne garantit pas l'unicité dans le DIT.
Installez OpenLDAP
OpenLDAP est un des annuaires les plus répandus. Pour l’installer, vous devrez
télécharger le package openldap-servers-2.4.47-3.fc31.x86_64.rpm.
$ rpm -ivh openldap-servers-2.4.47-3.fc31.x86_64.rpm
$ cd /etc/openldap/slapd.d/'cn=config'
$ ll
$ vim 'olcDatabase={2}mdb.ldif'
$ vim 'olcDatabase={1}monitor.ldif'
$ cd /var/lib/ldap/
$ ll
$ cp /usr/share/openldap-servers/DB_CONFIG.example var/lib/ldap/DB_CONFIG
$ ll
$ chown -R ldap:ldap /var/lib/ldap/
$ ll
$ updatedb
$ systemctl start slapd.service
$ systemctl enable slapd.service
$ ldapsearch -LLL -Y EXTERNAL -H ldap:///-b cn=config dn
Comme votre DNS est mon-entreprise.com, la racine de votre DIT a été configurée à
“dc=mon-entreprise,dc=com”, vous pouvez utiliser la commande ldapsearch
suivante pour visualiser votre DIT :
$ sudo ldapsearch -Q -L -Y EXTERNAL -H ldapi:/// -b dc=mon-
entreprise,dc=com
version: 1
#
# LDAPv3
# base <dc=mon-entreprise,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# mon-entreprise.com
dn: dc=mon-entreprise,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: mon-entreprise
dc: mon-entreprise
# admin, mon-entreprise.com
dn: cn=admin,dc=mon-entreprise,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# search result
# numResponses: 3
# numEntries: 2
La commande ldapsearch sert, comme son nom l’indique à chercher dans un
annuaire LDAP. Voici le détail des options utilisées :
- active le mode silencieux pour l’authentification SASL
Q
- indique le mode SASL choisi pour l’authentification. Normalement, EXTERNAL
Y implique une authentification par certificat client mais dans ce cas là ça signifie que
l’authentification se fera par l’UID et le GID du compte système. C’est pour ça que
vous devez lancer la commande avec “sudo”. L’utilisateur root a des passe-droits pour
accéder à la base locale LDAP
-L indique d’afficher le résultat au format LDIF. On aurait pu indiquer -LLL pour avoir
la même chose sans toutes les lignes commentées.
- indique l’URI qu’on veut utiliser pour se connecter. Ici ldapi:/// dit de se
H connecter à la socket Unix en local (la communication passe par un fichier local plutôt
que par le réseau).
-b indique le noeud à partir duquel vous voulez faire votre recherche. Ici dc=mon-
entreprise,dc=com est la racine donc vous recherchez dans tout le DIT. À la suite
du noeud, vous auriez pu indiquer des filtres pour votre recherche mais sans filtre
vous avez l’affichage le plus complet.
Je vais maintenant vous parler un peu du format LDIF utilisé pour afficher la
réponse de cette commande.
Comprenez le format LDIF
LDIF signifie “LDAP Directory Interchange Format”. C’est un format créé pour
décrire les ajouts ou les modifications à réaliser dans un annuaire LDAP. Le format
d’une entrée dans un fichier LDIF est toujours de la forme suivante :
dn: <Le dn que vous voulez changer>
changetype: <add, replace ou delete. Cette ligne est optionnelle>
<attribut ou objectclass>: valeu
Dans la sortie de la commande précédente, vous voyez que votre DIT contient en
tout et pour tout 2 entrées :
La première est la racine. On la reconnaît au fait qu’elle appartient à la classe
d’objet dcObject . Vous voyez qu’elle appartient aussi à 2 autres classes
d’objet. Chacune décrit une série d’attributs que l’entrée peut ou doit contenir.
Vous avez ensuite deux attributs : o et dc , deux types que vous connaissez
déjà.
La deuxième est le compte administrateur LDAP, comme l’indique l’attribut
description . Il appartient notamment à la classe d’objet
simpleSecurityObject qui représente les comptes d’authentification.
Dans la partie suivante, vous utiliserez le format LDIF pour compléter votre DIT et
créer votre premier utilisateur.
En résumé
LDAP est LE standard en terme d’accès à un service d’annuaire
Un annuaire est une base de données hiérarchique optimisée pour la
recherche et la lecture d’informations
Un annuaire LDAP prend la forme d’un arbre, appelé Directory Information
Tree, dans lequel on trouve des entrées identifiées de manière uniques par
un Distinguished Name
Chaque entrée appartient à une ou plusieurs classe d’objet et peut posséder
des attributs
Le format LDIF permet de décrire des changements à appliquer à un
annuaire LDAP
2. Gérez votre annuaire LDAP
Dans le chapitre précédent, vous avez vu que votre annuaire avait une structure
particulièrement basique puisqu’il ne comporte que deux entrées. Vous avez
également découvert qu’il était possible de décrire les changements à appliquer à un
annuaire par le format LDIF.
Savez-vous que votre annuaire contient un deuxième DIT ? En effet, dans les
anciennes versions de slapd, la configuration se faisait en modifiant des fichiers
dans /etc/ldap/ et imposait de redémarrer le serveur pour être prises en compte.
Cette méthode est toujours possible mais il est maintenant recommandé d’utiliser la
nouvelle méthode dite de “configuration à chaud” (en anglais OLC pour On-Line
Configuration) qui permet de ne pas avoir à redémarrer le serveur pour actualiser.
Découvrez la configuration à chaud de slapd
Maintenant, la configuration est gérée sous forme d’un DIT dont le suffixe est
cn=config et le service reste disponible pendant l’application des changements.
Vous pouvez voir les entrées de cet arbre par la commande :
$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
dn: cn=config
dn: cn=module{0},cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: olcBackend={0}mdb,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}mdb,cn=config
Cette configuration contient donc des informations sur les modules, le schéma, les
classes d’objets intégrées par défaut. La configuration propre à votre DIT dc=mon-
entreprise,dc=com se trouve dans olcDatabase={1}mdb,cn=config .
Comme cette configuration est stockée sous forme de DIT, vous pouvez la modifier
au moyen de fichiers LDIF. Pour tester ça, je vous propose de modifier la quantité de
logs générée par slapd. Par défaut, slapd ne génère aucun log et vous aimeriez
peut-être avoir plus d’informations sur l’activité de votre serveur. L’attribut qui gère
ça est directement un attribut de cn=config appelé olcLogLevel .
$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -s base -b cn=config
olcLogLevel
dn: cn=config
olcLogLevel: none
Ici j’ai rajouté l’option -s base pour indiquer le scope , c’est à dire l’étendue de
la
recherche. base effectue la recherche uniquement au niveau du DN indiqué alors
que par défaut le scope est subtree pour rechercher sur toutes les entrées
inférieures également.
Étendue de la recherche en fonction de la valeur du paramètre "scope"
Vous allez faire passer le niveau de logs à stats . Ça génèrera peut-être trop de
messages pour un système en production mais ce sera parfait pour vos tests. Pour
cela, enregistrez un fichier logLevel.ldif contenant :
dn: cn=config
changeType: modify
replace: olcLogLevel
olcLogLevel: stats
Reprenons ensemble en détails cette commande :
dn: cn=config le DN à modifier
changetype: modify le type de modification de l’objet à effectuer
replace: olcLogLevel l’attribut à modifier
olcLogLevel: stats la nouvelle valeur de l’attribut
Vous pouvez appliquer ce changement par la commande :
$ sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f logLevel.ldif
Les options sont les mêmes que pour ldapsearch sauf le -f qui indique le fichier
LDIF à appliquer.
À partir de maintenant, votre serveur slapd va générer des logs mais ils seront
renvoyés vers le fichier général /var/log/syslog . Pour indiquer au
daemon rsyslog qui gère les logs d’avoir un fichier de log séparé, créez le fichier
/etc/rsyslog.d/10-slapd.conf contenant :
# Logs du serveur OpenLDAP slapd
local4.* /var/log/slapd.conf
Puis redémarrez rsyslog par la commande :
$ sudo systemctl restart rsyslog
Bravo, vous avez réalisé votre première modification grâce à un fichier LDIF. La
prochaine étape consiste à faire évoluer votre annuaire vers la structure suivante :
Structure du DIT à créer
Ajoutez de nouveau noeuds pour compléter votre DIT
Pour ajouter de nouveaux noeuds et un premier utilisateur à votre arbre, vous allez
utiliser un fichier LDIF. Créez donc le fichier structure.ldif contenant :
dn: ou=Personnes,dc=mon-entreprise,dc=com
objectclass: organizationalUnit
ou: Personnes
description: Employes de l entreprise
dn: ou=Machines,dc=mon-entreprise,dc=com
objectclass: organizationalUnit
ou: Machines
description: Ordinateurs de l entreprise
dn: cn=Marie Dupond,ou=Personnes,dc=mon-entreprise,dc=com
objectClass: inetOrgPerson
givenName: Marie
sn: Dupond
cn: Marie Dupond
uid: mdupond
userPassword: mdupond
La structure du fichier est la même mais comme vous rajoutez plusieurs entrées,
vous devez sauter une ligne entre chaque DN. Ce fichier rajoute d’abord deux ou :
une pour inventorier les employés et une pour inventorier les ordinateurs de
l’entreprise. Il rajoute ensuite une personne avec la classe d’objet inetOrgPerson .
Vous avez déjà vu les autres attributs, à l’exception du le mot de passe à la fin (qui
sera chiffré par slapd) et de l’ uid qui correspond au login ou à un uid numérique
suivant l’usage qui est fait de ce champ.
Vous devez bien garder en tête que l’ordre des entrées est important. Vous ne
pouvez pas ajouter Marie au groupe Personnes tant que ce groupe n’a pas été
créé.
Vous remarquerez aussi que dans ce fichier, vous n’utilisez pas l’attribut
changetype pour préciser qu’il s’agit d’un ajout car vous allez utiliser la commande
ldapadd qui précise ça par elle-même :
$ sudo ldapadd -x -W -D “cn=admin,dc=mon-entreprise,dc=com” -H
ldap://localhost -f structure.ldif
Pourquoi ne pas utiliser les mêmes options de connexion que pour la commande
Idamodify que j’ai utilisé précédemment ?
Par défaut l’utilisateur root système a les droits de modification sur le DIT
cn=config mais pas sur votre DIT. Sauf à changer ces droits, vous devez donc
passer par le compte administrateur de votre DIT. Voici le détail des options :
-x : indique une authentification simple par mot de passe
-W : affiche une invite interactive pour taper le mot de passe du compte
-D : pour indiquer le DN du compte à connecter
-H : indique toujours la méthode de connexion choisie mais cette fois-ci
ldap://localhost initie une connexion par le réseau sur le port TCP 389.
Je termine simplement ce chapitre en vous montrant une autre utilisation possible
des fichiers LDIF : la sauvegarde à chaud de votre annuaire dans un fichier texte.
Sauvegardez votre annuaire sous forme de fichier LDIF
C’est un moyen très pratique de réaliser des sauvegardes de votre annuaire. Pour
cela, vous devez utiliser la commande slapcat :
$ sudo slapcat -b dc=mon-entreprise,dc=com -l mon_backup.ldif
Pour restaurer vos données en cas de besoin, stopez slapd :
$ sudo systemctl stop slapd
Puis restaurez votre base à partir du fichier de sauvegarde par la commande :
$ slapadd -c -b dc=mon-entreprise,dc=com -F /etc/ldap/slapd.d -l
mon_backup.ldif
L’option -c indique de continuer en cas d’erreur (vous voulez ajouter une entrée
déjà présente par exemple), l’option -F indique le répertoire de configuration et
l’option -l le fichier LDIF à utiliser pour la restauration.
Pour une sauvegarde complète, il vous faudra également sauvegarder la
configuration de votre annuaire en sauvegardant le contenu du répertoire
/etc/ldap/ .
Ce chapitre constitue une introduction à LDAP. Pour pouvoir utiliser votre annuaire
dans un environnement de production, il resterait à renforcer la sécurité en utilisant
des connexions chiffrées par TLS et passer en revue les ACL qui définissent les
droits d’accès à votre annuaire.
Dans ce cours, vous avez utilisé uniquement la ligne de commande pour gérer votre
annuaire. C’est très utile pour comprendre le fonctionnement d’un annuaire LDAP ou
pour débugger un annuaire mais pour une gestion au quotidien, vous préférerez
peut-être utiliser une solution graphique telle que LAM ou phpldapAdmin.
Dans la partie suivante, vous explorerez l’univers du web en installant un serveur
LAMP (Linux-Apache-MySQL-PHP).
En résumé
slapd permet de modifier la configuration à chaud par la méthode dite OLC
par la méthode OLC la configuration est stockée sous forme d’un DIT de base
cn=config
le format LDIF peut être utilisé pour ajouter de nouvelles unités d’organisation
( ou ), des utilisateurs ou tout autre type d’entrées
le format LDIF peut également être utilisé pour réaliser des sauvegardes de
votre annuaire