FUNIX

Mettez un manchot dans votre PC



OpenLDAP
[ Présentation | format de la base et définitions ( Le Directory Information Tree , Les attributs , Les classes d'objet , Les schémas ) | Installation d'OpenLDAP    ( Présentation , installation ) | Mettre en place son schéma d'annuaire ( Mise en place des classes d'objet , choix du suffixe ) | Configuration du serveur LDAP  | Lancement du serveur | Ajouter un enregistrement | Rechercher un enregistrement | Modifier un enregistrement ( Rajouter un attribut à un enregistrement , modifier un attribut , supprimer un attribut , supprimer un enregistrement)  ]

Dernière modification 24 décembre 2016

Installation de l'annuaire OpenLDAP

Applis spécifiques

(ce document est téléchargeable au format pdf dans la section download)

Présentation

LDAP est un protocole basé sur TCP/IP qui permet de partager des bases de données d'information sur un réseau interne (intranet) ou externe (internet). Ces bases de données sont appelées annuaire électronique (Directory en anglais), elles peuvent contenir tout type d'informations, des informations sur les personnes, à des données systèmes. Qui dit base de données, dit recherche, il est donc possible de faire des recherches dans la base en employant plusieurs critères, mais aussi bien sûr de la modifier, mais contrairement à un SGBD, un annuaire est très rapide en lecture, mais l'est beaucoup moins en écriture, en effet comme un annuaire est plutôt lu que modifier il a été optimisé pour la lecture et ne possède pas les mécanismes de transaction complexe que les SGBD possèdent pour traiter de gros volumes de données.
Le LDAP ou Lightweight Directory Access Protocol est la version TCP/IP du protocole DAP, ce dernier étant le protocole pour accéder au protocole OSI du service d'annuaire X500. Dans un premier temps LDAP s'est contenté d'être l'interface à des annuaires X500, mais maintenant LDAP peut gérer complètement les bases (standalone LDAP).

Si on rentre dans les détails, le protocole LDAP est du type client serveur, le serveur contient la base de données, et le client consulte la base de données, le protocole fournit les bases pour cette communication entre la client et le serveur (normalisée par l'IETF par la RFC2251), et les commandes nécessaires au client pour rechercher, créer, modifier ou effacer des données. LDAP est bien entendu sécurisé pour le transfert et l'accès aux des données, avec des outils de cryptage comme SSL et d'authentification.
Par ailleurs LDAP fournit des outils pour que les serveurs LDAP puissent communiquer entre eux, on a ainsi la possibilité de créer des serveurs miroirs qui pourront se synchroniser, ou de relier simplement les serveurs entre eux, les serveurs redirigeant automatiquement les requêtes qui ne les concernent pas.

Les exemples d'applications de LDAP sont nombreux:
- bases de données d'employés,
- bases de données de produits,
- bases de données pour certaines applis, exemple :
        * toutes les infos contenant les utilisateurs de votre réseau (mot de passe, shell, homedirectory, ...) peuvent être dans la base, on a ainsi beaucoup plus de possibilités qu'un simple fichier /etc/passwd, l'authentification peut donc utiliser LDAP plutôt que passwd ou shadow ou encore NIS. Vos utilisateurs pourront ainsi changer leur mot de passe et certains de leurs attributs à partir d'une interface web.
        * les préférences d'applis ou d'environnement (netscape, environnement graphique KDE, ...) sont sauvegardés dans la base, ainsi l'utilisateur peut passer d'une machine à une autre et retrouver ses préférences.

Cette page est une introduction à LDAP elle ne couvre pas certains aspects comme les liens avec d'autres bases (duplication, miroir, ...), la sécurité (access control, SSL, ...). Elle n'a seulement pour but de mettre en place un serveur LDAP simplement configuré pour que vous puissiez faie vos "premières armes" dans le domaine. Pour plus d'info reportez vous à l'excellente page de Laurent Mirtain .

Pour utiliser une base LDAP à partir de script PHP, voir ma page Apache .

Pour voir comment mettre en place un système d'authentification utilisateurs en utilsant LDAP à la manière de NIS voir mon autre page sur LDAP.

 

Format de la base et définitions

Le Directory Information Tree

Les LDAP standalone utilisent le format de base de données LDBM, ce dernier utilise le modèle hiérarchique comme le système de fichiers UNIX, c'est à dire qu'il s'apparente à un arbre, qu'on appelle DIT (Directory Information Tree). Au sommet de cet arbre se trouve la racine ou suffixe et à chaque noeud de l'arborescence on a un DSE (Directory Service Entry) qui correspond à une entrée de l'annuaire. L'entrée située à la racine est appelé rootDSE (root Directory Specific Entry), qui décrit la structure de l'arborescence (le DIT) ainsi que son contenu.
Chaque entrée est connue de manière unique dans l'arborescence grâce à son dn (Distinguished Name). Le dn indique le chemin à parcourir pour en partant du sommet arriver à l'entrée correspondante. Par exemple pour identifier une personne, on part du pays (fr), puis le nom de domaine (kervao), le groupe de travail et enfin le nom de la personne, l'ensemble de ces paramètres est le dn qui identifie de manière unique une personne.

Les attributs

Chaque entrée peut être considérée comme un objet (au sens C++) possédant donc certains attributs, par exemple si une personne est une entrée, les attributs peuvent être, le nom, le prénom, l'âge, .... On peut aussi définir des attributs obligatoires et d'autres optionnels, en d'autres termes, les attributs obligatoires devront être renseignés mais pas forcément les optionnels. Il existe par ailleurs pour chaque DSE des attributs d'administration qui ne servent qu'au serveur.

Les classes d'objet

On regroupe les objets qui sont du même domaine dans une classe d'object, celle-ci est caractérisée par des attributs obligatoires ou optionnels et un type. Les types de classe d'objet sont:
- type structurel car elle contient des d'objets concrets de l'annuaire (personnes, groupes de personnes, ...),
- type auxiliaire, c'est des classes d'objets qu'on peut créer, pour rajouter des informations (attributs) supplémentaires à des classes d'objet de type structurel déjà existantes. En C++ on dira que la classe auxiliaire dérive d'une classe structurelle,
- type abstraite, c'est les classes d'objet qui existent par défaut et qui n'ont pas de signification concrète, par exemple la classe top est la classe d'objet générique, toutes les autres classes dérivent de cette classe.

Le principe est donc le même qu'en C++, on retrouve une structure arborescente, avec à la racine la classe top, toutes les autres classes d'objet dérivent de cette classe générique, chaque classe hérite des propriétés d'une classe père et possède des attributs supplémentaires par rapport à ce dernier.

Les schémas

Un schéma décrit toutes les règles qu'utilisent le serveur LDAP pour décrire les classes d'objets (attributs, syntaxe, ...).

Installation d'OpenLDAP

Présentation

Il existe de nombreux serveurs LDAP, nous utiliserons OpenLDAP qui comme son nom l'indique est sous licence GPL. Vous avez le choix entre la version packagée par votre distribution ou la dernière version stable 2.4.44 à l'URL http://www.openldap.org.  Ma préférence va vers la recompilation pour avoir une version optimisée et de plus plus récente.

Installation

On vérifie d'abord qu' Openldap n'est pas déjà installé sur votre système en tapant :

rpm -qa | grep -i ldap

On supprime du système les packages contenus dans la liste avec la commande rpm -e nom-du-package (sauf libldap2 qui sert pour de nombreux packages).
Si pour des histoires de dépendance vous n'arrivez pas à tout supprimer ce n'est pas bien grave car par défaut le tarball et les packages ne placent pas les fichiers au même endroit. Lors du lancement du daemon et des exécutables il faut juste faire attention d'appeler le bon exécutable (servez vous de la commande which nom-exe ).

L'archive à récupérer est  openldap-2.4.44.tgz qu'on décompressera en tapant :

tar xvfz openldap-2.4.44.tgz

Cela va nous créer un répertoire openldap-2.4.44. Avant d'aller plus loin il faudra installer (commande urpmi nom-package ) les packages suivants

lib64db5.3-devel
gnutls-devel
lib64sasl2-devel
lib64nss-devel

Puis on tape successivement :

./configure
make


On peut tester maintenant que tout marche bien  en tapant :

cd tests
make

pour installer les binaires de ldap on tapera, en tant que root :

cd ..
make install

Les binaires sont installés par défaut dans /usr/local/sbin et /usr/local/libexec, les fichiers de config dans /usr/local/etc/openldap et les bases dans /usr/local/var/openldap-data. Les biblio vont se trouver sous /usr/local/lib, si ce n'est pas fait, rajouter ce chemin à la fin du fichier /etc/ld.so.conf et tapez

ldconfig

pour changer l'emplacement de tous ces fichiers taper:

configure -help

Mettre en place son schéma d'annuaire

Mise en place des classes d'objet

Le fichier de conf slapd.conf fait appel à /usr/local/etc/openldap/schema/core.schema qui décrit les classes d'objet. Voilà un exemple avec la classe "person"

objectclass ( 2.5.6.6 NAME 'person'
        DESC 'RFC2256: a person'
        SUP top STRUCTURAL
        MUST ( sn $ cn )
        MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )

MUST correspond au attributs obligatoires et MAY à ceux facultatifs
objectClass est le nom de la classe qui descend elle même de la classe top
sn correspond à surname (nom)
cn correspond à common name (prénom nom)
Je vous laisse déviner la signification des autres attributs.

On voit qu'il est nécessaire de fournir les attributs sn (surname) et cn (common name), sont facultatifs le mot de passe (userPassword), le numéro de téléphone (telephoneNumber ), les liens (seeAlso) et la description.

Les attributs sont définis dans le même fichier, la syntaxe est la suivante pour telephoneNumber par exemple :

attributetype ( 2.5.4.20 NAME 'telephoneNumber'
        DESC 'RFC2256: Telephone Number'
        EQUALITY telephoneNumberMatch
        SUBSTR telephoneNumberSubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} )

Je vous présenterai la syntaxe plus tard, on peut dans un premier temps se limiter aux attributs disponibles. Pour créer une classe d'objet breizhPerson dérivant de person, disposant de l'attribut obligatoire title en plus et des arguments facultatifs ou (groupe de travail) et l (localistation). On tapera dans le fichier core.schema juste après la définition de la classe person

objectclass ( 2.5.6.6.2 NAME 'breizhPerson' SUP person STRUCTURAL
    MUST ( title )
    MAY ( ou $ l ) )

Vous noterez le nombre 2.5.6.6.2, ce nombre doit être unique dans le fichier, il dérive directement du numéro de la classe objet person qui a pour numéro 2.5.6.6. Il est évident que comme breizhPerson dérive de person, les attributs sn et cn sont aussi obligatoires.

 

Choix du suffixe

Le rootDSE ou suffixe correspond à l'entrée tout en haut de l'arbre (DIT) de l'annuaire, on utilise généralement le nom de domaine, avec la syntaxe suivante  dc=kervao, dc=fr  pour le domaine kervao.fr (dc
correspond à Domain Component).

Configuration du serveur LDAP

On va créer un annuaire LDAP pour votre domaine privé kervao.fr. On doit modifier les fichiers slapd.conf et ldap.conf se trouvant sous /usr/local/etc/openldap.Voilà pour le fichier de configuration slapd.conf

# $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.8.8.4 2000/08/26 17:06:18
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#

include     /usr/local/etc/openldap/schema/core.schema
include
    /usr/local/etc/openldap/schema/cosine.schema
include    
/usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral   ldap://root.openldap.org
# le chemin est différent avec une install avec package

pidfile     /usr/local/var/slapd.pid
argsfile    /usr/local/var/slapd.args

# Load dynamic backend modules:
# modulepath    /usr/local/libexec/openldap
# moduleload    back_ldap.la
# moduleload    back_ldbm.la
# moduleload    back_passwd.la
# moduleload    back_shell.la

# slapd est bavard, pour le limiter aux messages critiques on mettre none

loglevel none

# Sample security restrictions
#       Require integrity protection (prevent hijacking)
#       Require 112-bit (3DES or better) encryption for updates
#       Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

#######################################################################
# database definitions
#######################################################################

database        bdb
suffix          "dc=kervao,dc=fr"
rootdn          "cn=Manager,dc=kervao,dc=fr"

#mot de passe en clair, on verra plus loin comment le crypter
rootpw          secret

# là où va se trouver la base ldap /var/lib/ldap dans le cas d'une install par package
directory   /usr/local/var/openldap-data

# Indices to maintain
index   objectClass eq

Attention vous devez vous assurer que le répertoire où se trouvera la base LDAP a été créé, par défaut c'est /usr/local/var/openldap-data mais vous pouvez très bien mettre /var/lib/ldap si ça vous chante.

Le fichier ldap.conf peut être vide dans un premier temps voire inexistant.

Le mot de passe de l'administrateur est secret en clair, si ça ne vous convient pas et que vous voulez le crypter, il faudra taper

slappasswd

on saisit son mot de passe

New password:
Re-enter new password:

et voilà le résultat

{SSHA}vNCYRQthN6u3OqcTAJ4lt/9vIhjsFmI

A la place de

rootpw      secret

Dans slapd.conf, vous mettrez donc:

rootpw          {SSHA}vNCYRQthN6u3OqcTAJ4lt/9vIhjsFmI

pour plus de sécurité on crée maintenant un utilisateur et un groupe système ldap

groupadd ldap
useradd -g ldap -c "slapd demon" -s /sbin/nologin -d /tmp ldap

on le rend propriétaire du fichier de configuration et de la base ldap en tapant

chown ldap:ldap /usr/local/etc/openldap/slapd.conf
chown -fR ldap:ldap /usr/local/var/openldap-data
chown -fR ldap:ldap /usr/local/var/run

maintenant sous /usr/local/var/openldap-data on tapera

cp DB_CONFIG.example DB_CONFIG
chown ldap:ldap DB_CONFIG

Lancement du serveur

La configuration du lancement sous systemd est la suivante. On crée un fichier slapd.service qu'on place sous /usr/lib/systemd/system/ voilà son contenu

[Unit]
Description=OpenLDAP server daemon

[Service]
Type=forking
ExecStart=/usr/local/libexec/slapd -u ldap -g ldap -f /usr/local/etc/openldap/slapd.conf

[Install]
WantedBy=multi-user.target  
 
maintenant pour que le service soit lancé à chaque boot de la machine il faudra taper

systemctl enable slapd.service

voillà le résultat

Created symlink from /etc/systemd/system/multi-user.target.wants/slapd.service to /usr/lib/systemd/system/slapd.service.

pour le lancer il suffit maintenant de taper

systemctl  start slapd.service
 

et pour connaitre son état

systemctl status slapd.service

voilà le résultat

● slapd.service - OpenLDAP server daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled)
   Active: active (running) since sam. 2016-12-24 11:14:52 CET; 27s ago
  Process: 15515 ExecStart=/usr/local/libexec/slapd -u ldap -g ldap -f /usr/local/etc/openldap/slapd.conf (code=exited, status=0/SUCCESS)
 Main PID: 15517 (slapd)
   CGroup: /system.slice/slapd.service
           └─15517 /usr/local/libexec/slapd -u ldap -g ldap -f /usr/local/etc/openldap/slapd.conf

déc. 24 11:14:41 mana.kervao.fr slapd[15515]: @(#) $OpenLDAP: slapd 2.4.44 (Dec 24 2016 11:12:03) $
                                                       olivier@mana.kervao.fr:/usr/local/linux/systeme/openldap-2.4.44/servers/slapd


Ajouter un enregistrement

Vous avez différent moyen d'ajouter des données à l'annuaire, pour une meilleure compréhension on va d'abord aborder la méthode manuelle. Pour ajouter des données au serveur LDAP vous devez vous fournir un fichier au format LDIF (pour LDAP Directory Interchange Format), le format est un format texte facilement lisible au contraire du format interne de l'annuaire. Voici un exemple de fichier LDIF, à noter que:
- chaque enregistrement dans le fichier est séparé du précédent et du suivant par une ligne vierge,
- les espaces sont pris en compte. ATTENTION, il est très important qu'il n'y ait aucun espace en fin de ligne. Dans ce cas vous risqueriez d'obtenir une erreur du style

ldap_add: Invalid syntax (21)
        additional info: objectClass: value #0 invalid per syntax

La syntaxe du format LDIF est la suivante:

dn: description du distinguished name
objetclass: classe d'objet d'origine
...
objetclass: classe d'objet dérivée
type attribut: valeur
...

On va par exemple utiliser la classe breizPerson définie plus haut pour décrire une nouvelle personne Veronique Hoarau qu'on va rajouter dans l'annuaire. Elle appartient au service (organizationalUnit) staff, ce même service appartenant à l'organisation kervao.fr
Soit le fichier entree.ldif

dn:     dc=kervao, dc=fr
objectClass: dcObject
objectClass:    organization
dc:     kervao
o:      kervao.fr

dn: ou=staff, dc=kervao, dc=fr
objectclass:    organizationalUnit
ou: staff

dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
objectclass: person
objectclass: breizhPerson
cn: Veronique Hoarau
sn: Hoarau
title: madame

Quelques commentaires, le premier groupe correspond à la définition de votre organisation, le deuxième à celui du groupe de travail (organizationalUnit) et le dernier à la personne. Celle-ci est définie par son dn (Distinguished Name), on part du sommet bz (suffixe du nom de domaine), puis le nom de domaine, le groupe de travail et enfin la personne. L'arbre (DIT) pourrait ressembler à ça:

 

                                                                                                                         dc=fr
                                                                                                                            |
                                                                                                                     dc=kervao
                                                                                                                            |
                                                          ------------------------------------------------------------------------------------------------------------
                                                            |                                              |                                                              |                                |
                                                        ou=staff                                ou=informatique                ou=production            ou=achat
                                                            |
               ------------------------------------------------------------------
                    |                                                                |
            cn=Veronique Hoarau                            cn=Olivier Hoarau

Au niveau de la définition de la personne:

objetclass: person définit la classe père de la classe breizPerson,
objetclass: breizPerson classe décrivant la personne,
cn et sn sont des attributs à renseigner obligatoirement,
title est un attribut obligatoire

On rajoutera l'enregistrement en utilisant la syntaxe suivante  (en tant que simple utilisateur):

ldapadd -x -D "description du dn de l'administrateur" -W -f nom-du-fichier-ldif

Exemple concret:

ldapadd -x  -D "cn=Manager, dc=kervao, dc=fr" -W -f entree.ldif
Enter LDAP Password: secret
adding new entry "dc=kervao, dc=fr"

adding new entry "ou=staff, dc=kervao, dc=fr"

adding new entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"

Pour rajouter par la suite un autre enregistement dans le groupe staff, il sera plus nécessaire de rajouter la définition du groupe et de l'organisation. Soit le fichier entree.ldif

dn: cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr
objectclass:    person
objectclass:    breizhPerson
cn: Olivier Hoarau
sn: Hoarau
title:   monsieur

On tape ensuite la commande:

ldapadd -x  -D "cn=Manager, dc=kervao, dc=fr" -W -f entree.ldif
Enter LDAP Password:
adding new entry "cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr"

Rechercher un enregistrement

On utilisera la fonction ldapsearch. Pour visualiser tout l'annuaire on peut taper :

ldapsearch -x -b 'dc=kervao, dc=fr' '(objectclass=*)'

Voilà le résultat

# extended LDIF
#
# LDAPv3
# filter: (objectclass=*)
# requesting: ALL
#

# kervao, fr
dn: dc=kervao, dc=fr
objectClass: dcObject
objectClass: organization
dc: kervao
o: kervao.fr

# staff, kervao, fr
dn: ou=staff, dc=kervao, dc=fr
objectClass: organizationalUnit
ou: staff

# Veronique Hoarau, staff, kervao, fr
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
objectClass: person
objectClass: breizhPerson
cn: Veronique Hoarau
sn: Hoarau
title: madame

# Olivier Hoarau, staff, kervao, fr
dn: cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr
objectClass: person
objectClass: breizhPerson
cn: Olivier Hoarau
sn: Hoarau
title: monsieur

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

Modifier un enregistrement

Rajouter un attribut à un enregistrement

On va rajouter l'attribut facultatif location (l) à l'enregistrement Veronique Hoarau. On va créer un fichier modif.ldif contenant:

dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
add:    l
title: bureau36

On tape ensuite

ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"

Modifier un attribut

On va modifier l'attribut titre (title) à l'enregistementVeronique Hoarau. On va créer un fichier modif.ldif contenant:

dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
changetype: modify
replace: title
title: mademoiselle

On tape ensuite

ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"

Supprimer un attribut

On va supprimer l'attribut location (l) à l'enregistement Veronique Hoarau. On va créer un fichier modif.ldif contenant:

dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
delete: l

On tape ensuite

ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr

Supprimer un enregistrement

Pour supprimer l'enregistrement Veronique hoarau, an va créer un fichier modif.ldif contenant

dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
changetype: delete

On tape ensuite:

ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
deleting entry cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr

ATTENTION Vous ne pouvez pas supprimer un attribut obligatoire comme title pour la classe breizhPerson.
 

 
[Retour page d'accueil FUNIX]