logo_coagul

Installation et Utilisation de OpenLDAP sous Debian

Rubrique : Réseaux
Le : lundi 20 décembre 2004
Par : Tony  
Visites : 93788

But de ce document

Ce document me sert de mémo sur l’installation et l’utilisation d’OpenLDAP sous Debian. Je le diffuse en espérant qu’il puisse servir à d’autres personnes.

Pré-requis

Avoir installé une Debian de Base :
- cf mon autre document sur ce sujet : http://www.coagul.org/article.php3 ?id_article=158

Présentation rapide

Une base LDAP est une base de données où les informations sont enregistrées de manière hiérarchique sous forme d’arbre et non sous forme tabulaire.

Une base LDAP est optimisée pour la lecture d’un nombre important de petits enregistrements et convient donc parfaitement pour stocker des annuaires ou des profils utilisateurs.

Le système LDAP utilise des schémas (/etc/ldap/schema) pour décrire des objets.

Chaque objet contient plusieurs attributs (obligatoire ou facultatifs). Et chaque objet peut hériter des attributs d’un autre objet. Exemple :
- L’objet « person » a comme attributs : commonName, surname,..
- L’objet fils « organizationalPerson » dérivé de l’objet « person » ajoute les attributs : title, PostalAddress,...

Les objets et les attributs sont normalisés pour assurer les échanges entre les logiciels.

Il est possible de modifier un schéma en rajoutant des attributs à un objet (déconseillé) ou en créant un nouvel objet (mieux), mais le mieux est de faire valider cette modification par l’IANA.

Chaque donnée enregistrée dans la base est identifiée par son DN (Distinguished Name). Ce DN est comparable au chemin complet d’un fichier. Exemple : dc=mondomaine,dc=fr

Pour ajouter ou modifier des données dans la base, il est possible d’utiliser le format LDIF.

Installation

Paquets à installer :

# apt-get install ldap-server ldap-client

Ce qui installera en fait :

# apt-get install slapd ldap-utils

Écran (Titre en rouge) Message Réponse
Configuration de slapdEnter your DNS domain mondomaine.com
Enter the name of organisationmondomaine.com
Admin passwordxxxx
Allow LDAPv2 protocol Oui *

* J’ai été obligé d’autoriser la norme v2 pour les clients Win 2000. Avec les clients Win NT, il n’y avait pas de problème.

Configuration

Le fichier de configuration est :

/etc/ldap/slapd.conf

La ligne suivante permet d’autoriser l’utilisation de la norme V2 de LDAP.

allow bind_v2

La ligne suivante donne la racine de la base LDAP :

suffix "dc=mondomaine,dc=com"

La ligne suivante qu’il faut ajouter manuellement donne le login de l’administrateur (admin avec le rappel de la racine). Cette ligne et la suivante sont obligatoires pour avoir un accès root sur la base depuis un programme externe (ex : PHP)

rootdn "cn=admin,dc=mondomaine ,dc=com"

La ligne suivante qu’il faut ajouter manuellement donne le mot de passe en clair :

rootpw admin

Pour plus de sécurité, il est préférable de générer un mot de passe crypté en utilisant la commande :

# slappasswd
New password:
Re-enter new password:
{SSHA}5y67xJ/t7esuGKUD7TQPcgykd8xiYMO2

Ensuite, il faut copier la chaîne cryptée à la place du mot de passe en clair

Paramétrage de l’accès en écriture de la base. Il faut indiquer le bon login et la racine de la base :

access to attribute=userPassword
       by dn="cn=admin,dc=test,dc=com" write
       by anonymous auth
       by self write
       by * none

Paramétrage de l’accès en lecture seule de la base. Il faut indiquer le bon login et la racine de la base :

access to *
       by dn="cn=admin,dc=test,dc=com" write
       by * read

Démarrage du serveur (slapd)

Le serveur slapd se démarre d’une manière classique avec la commande :

# /etc/init.d/slapd restart

Le format de fichier LDIF

Ce format de fichier est utilisé pour faire des imports / exports entre plusieurs bases ou pour modifier ou ajouter des données dans une base.

ATTENTION : Il est obligatoire de coder les données en UTF-8. Si lors de l’importation une erreur est rencontrée, celle-ci est abandonnée à l’endroit où elle en était.

Fichier LDIF pour ajouter des enregistrements

Voici la structure d’un fichier LDIF

dn: <distinguished name
   objectClass: <object class
   objectClass: <object class
   ...
   <attribute type:<attribute value
   <attribute type:<attribute value
   ...

Voici un exemple de fichier LDIF (AjoutRacine.ldif) pour créer la racine de l’arbre LDAP :

dn: dc=mondomaine,dc=com
objectClass: dcObject
objectClass: organization
o: Votre Societe
dc: mondomaine

Commande pour ajouter la racine :

ldapadd -x -D "cn=admin,dc=mondomaine,dc=com" -w admin -f AjoutRacine.ldif

Voici un exemple de fichier LDIF (AjoutFiche.ldif) pour créer une nouvelle fiche :

dn: cn=Tony GALMICHE,dc=mondomaine,dc=com
objectClass: inetOrgPerson
cn: Tony GALMICHE
givenName: Tony
sn: GALMICHE

Commande pour ajouter la fiche :

ldapadd -x -D "cn=admin,dc=mondomaine,dc=com" -w admin -f AjoutFiche.ldif

Fichier LDIF pour modifier des enregistrements

Les commandes de modification ont la syntaxe suivante :

  dn: distinguished name
   changetype  {{TYPE}}
   change operation identifier
   list of attributes...
   ...
  -
   change operation identifier
   list of attributes
   ...

TYPE peu avoir l’une des valeurs suivantes :
- add (ajout d’une entrée),
- delete (suppression),
- modrdn (modification du RDN),
- modify (modification : add, replace, delete d’un attribut)

Le fichier « ModifFiche.ldif » ci-dessous permet d’ajouter le numéro de téléphone :

dn: cn=Tony GALMICHE,dc=mondomaine,dc=com
changetype: modify
add: telephonenumber
telephonenumber: 03 80 97 98 99

Commande pour modifier la fiche :

ldapadd -x -D "cn=admin,dc=mondomaine,dc=com" -w admin -f ModifFiche.ldif

Fichier LDIF pour supprimer des enregistrements

Le fichier « SuppFiche.ldif » ci-dessous permet de supprimer une fiche :

dn: cn=Tony GALMICHE,dc=mondomaine,dc=com
changetype: delete

Commande pour supprimer la fiche :

ldapadd -x -D "cn=admin,dc=mondomaine,dc=com" -w admin -f SuppFiche.ldif

Commande pour rechercher des enregistrements

Rechercher les enregistrements contenant un attribut objectclass (donc tous) depuis la racine :

ldapsearch -x -b "dc=mondomaine,dc=com" "objectclass=*"

Rechercher les enregistrements contenant un attribut cn dans la branche Eloyes :

ldapsearch -x -b "o=Eloyes,dc=mondomaine,dc=com" "cn=*"

Rechercher les enregistrements donc l’attribut dc se termine par gray depuis la racine :

ldapsearch -x -b "dc=mondomaine,dc=com" "dc=*gray"

Sauvegarde et Restauration d’une base de données LDAP

La commande suivante permet de générer un fichier .LDIF contenant la base complète :

slapcat -l DumpLDAP.ldif -b "dc=mondomaine,dc=com"

LDAP Browser

LDAP Browser est un programme en Java, permettant de consulter et de modifier une base LDAP :
- http://www-unix.mcs.anl.gov/ gawor/ldap/

Exemples de scripts PHP

Exemple de script PHP pour se connecter au serveur LDAP

$server="localhost";
$port="389";
$dn="dc=mondomaine,dc=com";
$rootdn="cn=admin,$dn";
$rootpw="admin";

$ds=ldap_connect($server,$port);
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
$r=ldap_bind($ds,$rootdn,$rootpw)
        or die ("Impossible de se connecter au serveur ! \n");
echo "Authentification sur le serveur OpenLDAP -> OK \n\n";

Exemple de script PHP pour rechercher des enregistrements

$sr=ldap_search($ds,$dn,"(objectclass=*)");
if ($sr) {
        $info=ldap_get_entries($ds,$sr);
        echo $info["count"]." enregistrements dans OpenLDAP \n";
        for ($i=0;$i<=$info["count"];$i++) {
                echo "$i - ".$info[$i]["dn"]." \n";
        }
}

Liste partielle des attributs de la classe « organization »

AttributDescription
businessCategoryActivité professionnelle d’une entreprise ou d’une personne
cCode du pays en deux lettres (respectant le standard ISO 3166)
cnNom de l’objet (common name)
descriptionDescription de l’objet
distinguishedNameNom distingué (utilisé par d’autres attributs par héritage)
facsimileTelephoneNumberNuméro de fax
givenNamePrénom de la personne
houseIdentifierIdentifiant d’un batiment
initialsInitiales d’une personne
internationalSDNNumberNuméro ISDN
llocalité de l’objet (géographique)
memberDistinguished Name des membres
nameNom (utilisé par d’autres attributs par héritage)
oNom de l’organisation
objectClassClasse d’objets
ouUnité organisationnelle (branche de l’organisation)
ownerNom du propriétaire de l’objet
postalAddressAdresse postale (sans le code postal)
postalCodeCode postal
postalOfficeBoxBoîte aux lettres (postale)
presentationAddressAdresse réseau de la présentation de l’objet (généralement une URL vers la présentation en ligne)
protocolInformationAttribut complémentaire à presentationAddress pour définir le protocole à utiliser
registeredAddressAdresse postale pour des envois de courriers recommandés et de colis
seeAlsoDN d’objets complémentaires
serialNumberNuméro de série de l’objet
snNom de famille de la personne (surname)
stEtat ou région (state)
streetAddressNom de la rue et assimiilé (boulevard, ...)
telephoneNumberNuméro de téléphone
titleTitre de la personne (différent de fonction)
uidIdentifiant unique de l’objet
userPasswordMot de passe de l’utilisateur

Liste partielle des attributs de la classe « inetOrgPerson »

NomSémantiqueMonoOblLectureUtilisation
cnnom(s) complet(s) (d’usage) sans accent ORIOrdre : Nom, Prénom. Attention : pas d’accent pour simplifier les recherches. Voir aussi displayName. Exemple : "Bugale Jerome"
displayNamenom complet avec accents Version accentuée de la valeur principale de cn. Exemple : "Bugalé Jérôme"
employeeTypetype de personnel D ?RI ?Définir les grandes familles ?
facsimileTelephoneNumberNuméro de fax RIFormat E 123 (cf Références)
givenNamePrénomMDRIidem sn. Exemple : "Jérôme"
l localité de l’objet (géographique)
labeledURIPage personnelle RI
mailadresse mel canoniqueM RI ?
mobilenuméro de téléphone mobile RIFormat E 123 (cf Références)
o Nom de l’organisation
ou Unité organisationnelle (branche de l’organisation)
postalAddressAdresse postale RIAdresse complète. Attention au format ("$" séparateur, voir RFC2256)
postalCodeCode postal
preferredLanguagelangue préféréeM RIcf RFC2068
snNom ORIContient le nom d’usage. Il est possible d’ajouter le nom de famille (nom patronymique) en seconde valeur. Tout caractère diacritique. Première lettre en majuscule. Voir aussi cn. Exemple : "Bugalé".
st Etat ou région (state)
telephoneNumbernuméro de téléphone fixe RIFormat E 123 (cf Références)
titletitre RIResponsabilité ; président, directeur, ... (cf Harpège ?). Code ou intitulé complet ?
uididentifiant uniqueMDRutilisé comme rdn, contenu indifférent mais aussi court que possible
userCertificatecertificat X509 A ?

Problème rencontré

Suite à une coupure brutale du serveur, le serveur ldap n’est pas reparti. Voici le message que j’avais au démarrage en mode débugage :

# slapd -d 1
bdb_db_open: dbenv_open(/var/lib/ldap)
bdb(dc=mondomaine,dc=com): operation not permitted during recovery
bdb_db_open: db_open(/var/lib/ldap) failed: Invalid argument (22)
backend_startup: bi_db_open failed! (22)
bdb_db_destroy: close failed: Invalid argument (22)
slapd stopped.

En fait, c’était la base ldap qui était corrompue et pour régler ce problème, je l’ai simplement ré-indexée avec ces commandes :

# /etc/init.d/slapd stop
# slapindex
# /etc/init.d/slapd start

Historique des modifications

VersionDateCommentaire
0.118/11/04Création par Tony GALMICHE
0.203/12/04MAJ suite à installation serveur Pentium Pro 2000
0.317/12/04MAJ suite à présentation atelier Coagul
0.415/03/07Ajout « Problème rencontré »