Dernière modification 5 novembre 2004
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.
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.
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 mdk 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.2.28.tgz qu'on décompressera en tapant :
tar xvfz openldap-2.2.28.tgz
Cela va nous créer un répertoire openldap-2.2.28.
Avant d'aller plus loin il faudra installer (commande urpmi
nom-package ) les packages suivants de la Mandrake 10.0
libgdbm2
libgdbm2-devel
En effet par défaut openldap utilise une base de donnée Berkeley dans sa version 4.2 qui est utilisée, comme la 10.0 ne propose que la 4.1, je me suis rabattu sur la base de donnée de type ldbm. Puis on tape successivement :
./configure --enable-crypt --disable-bdb --enable-ldbm
make depend
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
Vous pouvez maintenant installer aussi le package php-ldap
pour le support LDAP de PHP avec Apache.
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.
A noter qu'avec une installation avec package les classes "locales"
peuvent être créées dans le fichier /etc/openldap/schema/local.schema
# $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
# 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
#######################################################################
# database definitions
#######################################################################
database ldbm
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
# Droits d'accès que j'ai rajoutés en plus
access to attr=userPassword
by self write
by anonymous auth
by
dn="cn=Manager,dc=kervao,dc=fr" write
by * none
access to *
by
dn="cn=Manager,dc=kervao,dc=fr" write
by * read
Le même fichier dans sa version RPM
# $OpenLDAP:
pkg/ldap/servers/slapd/slapd.conf,v 1.8.8.6 2001/04/20
23:32:43 kurt Exp $
#
# See slapd.conf(5) for details on
configuration options.
# This file should NOT be world
readable.
#
# Modified by Christian Zoffoli
<czoffoli@linux-mandrake.com>
# Version 0.2
#
include
/usr/share/openldap/schema/core.schema
include
/usr/share/openldap/schema/cosine.schema
include
/usr/share/openldap/schema/corba.schema
include
/usr/share/openldap/schema/inetorgperson.schema
include
/usr/share/openldap/schema/java.schema
include
/usr/share/openldap/schema/krb5-kdc.schema
include
/usr/share/openldap/schema/kerberosobject.schema
include
/usr/share/openldap/schema/misc.schema
include
/usr/share/openldap/schema/nis.schema
include
/usr/share/openldap/schema/openldap.schema
include
/usr/share/openldap/schema/autofs.schema
include
/usr/share/openldap/schema/samba.schema
include
/usr/share/openldap/schema/kolab.schema
#include
/usr/share/openldap/schema/rfc822-MailMember.schema
#include
/usr/share/openldap/schema/pilot.schema
#include
/usr/share/openldap/schema/qmail.schema
#include
/usr/share/openldap/schema/mull.schema
#include
/usr/share/openldap/schema/netscape-profile.schema
#include
/usr/share/openldap/schema/trust.schema
#include
/usr/share/openldap/schema/dns.schema
#include
/usr/share/openldap/schema/cron.schema
include
/etc/openldap/schema/local.schema
# Define global ACLs to disable
default read access.
include
/etc/openldap/slapd.access.conf
# Do not enable referrals until AFTER
you have a working directory
# service AND an understanding of
referrals.
#referral
ldap://root.openldap.org
pidfile
/var/run/ldap/slapd.pid
argsfile
/var/run/ldap/slapd.args
modulepath
/usr/lib/openldap
#moduleload
back_dnssrv.la
#moduleload
back_ldap.la
#moduleload
back_meta.la
#moduleload
back_monitor.la
#moduleload
back_passwd.la
#moduleload
back_sql.la
# SASL config
#sasl-host ldap.example.com
# To allow TLS-enabled connections,
create /etc/ssl/openldap/ldap.pem
# and uncomment the following lines.
#TLSRandFile
/dev/random
#TLSCipherSuite
HIGH:MEDIUM:+SSLv2
TLSCertificateFile
/etc/ssl/openldap/ldap.pem
TLSCertificateKeyFile
/etc/ssl/openldap/ldap.pem
#TLSCACertificatePath
/etc/ssl/openldap/
#TLSCACertificateFile
/etc/ssl/cacert.pem
TLSCACertificateFile
/etc/ssl/openldap/ldap.pem
#TLSVerifyClient never #
([never]|allow|try|demand)
# logging
loglevel 256
#######################################################################
# database definitions
#######################################################################
database
bdb
suffix
"dc=kervao,dc=fr"
#suffix
"o=My
Organization Name,c=US"
rootdn
"cn=Manager,dc=kervao,dc=fr"
#rootdn
"cn=Manager,o=My Organization Name,c=US"
# Cleartext passwords, especially for
the rootdn, should
# be avoided. See slappasswd(8)
and slapd.conf(5) for details.
# Use of strong authentication
encouraged.
rootpw
secret
#
rootpw
{crypt}ijFYNcSNctBYg
# The database directory MUST exist
prior to running slapd AND
# should only be accessable by the
slapd/tools. Mode 700 recommended.
directory
/var/lib/ldap
# Indices to maintain
#index
objectClass
eq
index
objectClass,uid,uidNumber,gidNumber eq
index
cn,mail,surname,givenname
eq,subinitial
# samba searches on sid
#index
sambaSID
eq
# Basic ACL (deprecated in favour of
ACLs in
/etc/openldap/slapd.access.conf)
access to attr=userPassword
by self write
by anonymous auth
by
dn="cn=Manager,dc=kervao,dc=fr" write
by * none
access to *
by
dn="cn=Manager,dc=kervao,dc=fr" write
by * read
# ACL ensuring replicator has write
access
#access to *
#
by
group="cn=Replicator,ou=Group,dc=example,dc=com" write
#
by * read
# Replica configuration (if this
server is a slave)
#updatedn
"cn=ldap-master.example.com,ou=Hosts,dc=example,dc=com"
#updateref
"ldap://ldap-master.example.com"
# Replication configuration (if this
server is a master)
#replica
host=ldap-slave1.example.com:389
#
binddn="cn=ldap-master.example.com,ou=Hosts,dc=example,dc=com"
#
bindmethod=simple
credentials="mypassword"
# Uncomment to enable statistics
gathering at basedn cn=monitor (load
monitor
# module above too)
#database monitor
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.
Pour une install avec package il existe des lignes
supplémentaires dans ce fichier, pensez à modifier les
champs dc=example,dc=com en adaptant à votre domaine.
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 mettre crypté, il faudra taper (exemple avec secret) :
slappasswd -v -s secret -h {CRYPT}
Voilà le résultat
{CRYPT}G.H5krNMMw0cc
A la place de
rootpw secret
Dans slapd.conf, vous mettrez donc:
rootpw
{CRYPT}G.H5krNMMw0cc
PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
On mettra
PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/libexec"
pour que serveur LDAP soit lancé automatiquement à l'état de marche 3, 4 et 5 ( les deux types d'install) on tapera :
chkconfig --level 345 ldap on
Pour l'arrêter à l'état de marche 0, 1, 2 et 6, on tapera:
chkconfig --level 0126 ldap off
Au prochain reboot le serveur sera lancé automatiquement, pour éviter un reboot pour lancer le serveur, il suffit de taper :
/etc/rc.d/init.d/ldap start
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"
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
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"
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"
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
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] |