Table des matières

Dernière mise-à-jour : 2020/01/30 03:27

Topic 210 - Gestion du Client et du Serveur OpenLDAP (6/60)

210.3 - LDAP client usage

Weight: 2 Description: Candidates should be able to perform queries and updates to an LDAP server. Also included is importing and adding items, as well as adding and managing users.

Key Knowledge Areas:

Terms and Utilities:

210.4 - Configuring an OpenLDAP server

Weight: 4

Description: Candidates should be able to configure a basic OpenLDAP server including knowledge of LDIF format and essential access controls.

Key Knowledge Areas:

Terms and Utilities:

Présentation

Qu’est-ce que LDAP ?

LDAP est une abréviation de Lighweight Directory Access Protocol. Comme son nom indique, LDAP est un service d'annuaire.

Un service d'annuaire est une base de données spécialisée optimisée pour la consultation. Certains services d'annuaire peuvent être locaux tandis que d'autres sont appellés distribués. Un bon exemple d'une service d'annuaire distribué est le DNS.

Plusieurs points sont à retenir :

Le Protocole X.500

X.500 est un ensemble de normes qui s'appuie sur le modèle OSI :

LDAP v3

LDAP est actuellement à la version 3. Cette version est notamment définie par :

Comment fonctionne LDAP ?

Le protocole LDAP définit neuf opérations divisées en trois catégories :

Le Modèle d'Information de LDAP

Le modèle d'information de LDAP est basé sur des entrées :

Deux structures classiques des entrées sont :

Les DN et les RDN

Un DN est l'ensemble des RDN des noeuds supérieurs :

Un RDN est un couple composé d'un attribut et un valeur, par exemple :

Dans le cas de plusieurs couples, ceux-ci sont séparés par le caractère + :

Le format des valeurs de attributs ne doit pas contenir :

En plus des ces restrictions, les caractères suivants doivent être protégés par le caractère \ :

La Structure d’un annuaire LDAP

Les Attributs

Un attribut est défini par un ensemble d'informations :

Les Attributs Utilisateur

Ce sont des attributs pouvant être modifiés par des utilisateurs ayant le droit d'écriture.

Les Attributs Opérationnels

Ce sont de attributs stockant les information sur le statut de l'annuaire.

Les Classes d'Objets

Une classe d'objets est définie par :

Les Types de Classe d'Objets

Le type de classe d'objets peut être :

Les OID

Chaque attribut et chaque classe d'objets est décrit par un OID (Oject IDentifier) :

Les Schémas de l'Annuaire

Un schéma regroupe les informations suivantes :

Un schéma doit contenir au moins une classe d'objets.

Les schémas les plus utilisés sont :

Schéma Description
core.schema Obligatoire. Permet de stocker dans l'annuaire les Common Attribute Object Classes. C'est le noyau OpenLDAP.
cosine.schema Utile - Permet le support des annuaires cosine et X.500.
inetorgperson.schema Utile - Permet de stocker dans l'annuaire les informations concernant les personnes.
bind.schema Permet de stocker dans l'annuaire des objets DNS.
dhcp.schema Permet de stocker dans l'annuaire des objets DHCP.
nis.scema Permet de stocker dans l'annuaire les utilisateurs UNIX et les paramètres associés.
samba3.schema Permet l'intégration de samba et LDAP.
cobra.schema Permet de stocker dans l'annuaire des objets COBRA (Common Object Broker Request Architecture).
openldap.schema Expérimental. Concerne le projet OpenLDAP Project.
dyngroup.schema Expérimental. Dynamic Group - utilisé avec le Netscape Enterprise Server.
collective.schema Expérimental. Permet de stocker dans l'annuaire des objets collectifs.
java.schema Expérimental. Permet de stocker dans l'annuaire des objets java.
misc.schema Expérimental. Permet le routage des messages électroniques (emails).
ppolicy.schema Expérimental. Schéma de stratégie de mots de passe.

Installation du serveur LDAP

Pour installer le serveur OpenLDAP sous GNU/Linux ou Unix vous pouvez soit utiliser la version binaire fournie par les dépôts de paquets de votre distribution GNU/Linux ou Unix soit télécharger la dernière version à compiler du site d'OpenLDAP.

Dans notre cas, nous allons installer OpenLDAP à partir des dépôts sur un système RHEL / CentOS. Commencez par mettre à jour le système :

[root@centos6 ~]# yum update --skip-broken

Puis installez OpenLDAP :

[root@centos6 ~]# yum install openldap-servers openldap-clients openldap
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * atomic: mir01.syntis.net
 * base: centos.quelquesmots.fr
 * epel: mirror.1000mbps.com
 * extras: centos.quelquesmots.fr
 * rpmforge: mirror.ate.info
 * updates: centos.quelquesmots.fr
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package openldap.i686 0:2.4.23-32.el6_4.1 will be updated
---> Package openldap.i686 0:2.4.23-34.el6_5.1 will be an update
---> Package openldap-clients.i686 0:2.4.23-34.el6_5.1 will be installed
---> Package openldap-servers.i686 0:2.4.23-34.el6_5.1 will be installed
--> Processing Dependency: libcrypto.so.10(libcrypto.so.10) for package: openldap-servers-2.4.23-34.el6_5.1.i686
--> Running transaction check
---> Package openssl.i686 0:1.0.0-27.el6_4.2 will be updated
---> Package openssl.i686 0:1.0.1e-16.el6_5.7 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================================
 Package                                      Arch                             Version                                        Repository                           Size
========================================================================================================================================================================
Installing:
 openldap-clients                             i686                             2.4.23-34.el6_5.1                              updates                             160 k
 openldap-servers                             i686                             2.4.23-34.el6_5.1                              updates                             2.0 M
Updating:
 openldap                                     i686                             2.4.23-34.el6_5.1                              updates                             267 k
Updating for dependencies:
 openssl                                      i686                             1.0.1e-16.el6_5.7                              updates                             1.5 M

Transaction Summary
========================================================================================================================================================================
Install       2 Package(s)
Upgrade       2 Package(s)

Total download size: 3.9 M
Is this ok [y/N]: y

Configuration de Démarrage du serveur LDAP

Sous RHEL / CentOS le service OpenLDAP s'appelle slapd. Une vérification de son état démontre qi'il n'est démarré dans aucun niveau d'exécution :

[root@centos6 ~]# chkconfig --list slapd
slapd          	0:arrêt	1:arrêt	2:arrêt	3:arrêt	4:arrêt	5:arrêt	6:arrêt

Il convient donc d'activer le service :

[root@centos6 ~]# chkconfig slapd on
[root@centos6 ~]# chkconfig --list slapd
slapd          	0:arrêt	1:arrêt	2:marche	3:marche	4:marche	5:marche	6:arrêt

Configuration du serveur LDAP

Le choix de la configuration de l'annuaire se fait en fonction de l'organisation de l'entité dont il détient l'information. Plusieurs configurations sont possible.

L'annuaire Local

Dans ce cas, le service d'annuaire ne concerne que le domaine local. Il n'y a aucune interaction avec d'autres annuaires.

L''annuaire Local avec des Referrals

Dans ce cas, le service d'annuaire concerne le domaine local. Toute requête concernant quelquechose en dehors du domaine local est retournée au client en lui indiquant un service d'annuaire supérieur où il faut que le client s'adresse.

L'annuaire local avec réplication

Dans ce cas, le service d'annuaire concerne le domaine local. Il existe un annuaire maître et un annuaire esclave. Le démon slurpd effectue les mise à jour de l’esclave.

Fichier(s) de Configuration

Le Fichier slapd.conf

Antérieure à la version 2.3 d'OpenLDAP, la configuration d'OpenLDAP était effectuée en éditant le fichier /etc/openldap/slapd.conf. Un exemple de ce fichier est fourni dans le répertoire /usr/share/openldap-servers/ :

[root@centos6 ~]# cat /usr/share/openldap-servers/slapd.conf.obsolete
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#

include		/etc/openldap/schema/corba.schema
include		/etc/openldap/schema/core.schema
include		/etc/openldap/schema/cosine.schema
include		/etc/openldap/schema/duaconf.schema
include		/etc/openldap/schema/dyngroup.schema
include		/etc/openldap/schema/inetorgperson.schema
include		/etc/openldap/schema/java.schema
include		/etc/openldap/schema/misc.schema
include		/etc/openldap/schema/nis.schema
include		/etc/openldap/schema/openldap.schema
include		/etc/openldap/schema/ppolicy.schema
include		/etc/openldap/schema/collective.schema

# Allow LDAPv2 client connections.  This is NOT the default.
allow bind_v2

# 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/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args

# Load dynamic backend modules
# - modulepath is architecture dependent value (32/64-bit system)
# - back_sql.la overlay requires openldap-server-sql package
# - dyngroup.la and dynlist.la cannot be used at the same time

# modulepath /usr/lib/openldap
# modulepath /usr/lib64/openldap

# moduleload accesslog.la
# moduleload auditlog.la
# moduleload back_sql.la
# moduleload chain.la
# moduleload collect.la
# moduleload constraint.la
# moduleload dds.la
# moduleload deref.la
# moduleload dyngroup.la
# moduleload dynlist.la
# moduleload memberof.la
# moduleload pbind.la
# moduleload pcache.la
# moduleload ppolicy.la
# moduleload refint.la
# moduleload retcode.la
# moduleload rwm.la
# moduleload seqmod.la
# moduleload smbk5pwd.la
# moduleload sssvlv.la
# moduleload syncprov.la
# moduleload translucent.la
# moduleload unique.la
# moduleload valsort.la

# The next three lines allow use of TLS for encrypting connections using a
# dummy test certificate which you can generate by running
# /usr/libexec/openldap/generate-server-cert.sh. Your client software may balk
# at self-signed certificates, however.
TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password

# 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

# Sample access control policy:
#	Root DSE: allow anyone to read it
#	Subschema (sub)entry DSE: allow anyone to read it
#	Other DSEs:
#		Allow self write access
#		Allow authenticated users read access
#		Allow anonymous users to authenticate
#	Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
#	by self write
#	by users read
#	by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

# enable on-the-fly configuration (cn=config)
database config
access to *
	by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
	by * none

# enable server status monitoring (cn=monitor)
database monitor
access to *
	by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
        by dn.exact="cn=Manager,dc=my-domain,dc=com" read
        by * none

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

database	bdb
suffix		"dc=my-domain,dc=com"
checkpoint	1024 15
rootdn		"cn=Manager,dc=my-domain,dc=com"
# 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 accessible by the slapd and slap tools.
# Mode 700 recommended.
directory	/var/lib/ldap

# Indices to maintain for this database
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

# Replicas of this database
#replogfile /var/lib/ldap/openldap-master-replog
#replica host=ldap-1.example.com:389 starttls=critical
#     bindmethod=sasl saslmech=GSSAPI
#     authcId=host/ldap-master.example.com@EXAMPLE.COM

Les directives actives sont :

include		/etc/openldap/schema/corba.schema
include		/etc/openldap/schema/core.schema
include		/etc/openldap/schema/cosine.schema
include		/etc/openldap/schema/duaconf.schema
include		/etc/openldap/schema/dyngroup.schema
include		/etc/openldap/schema/inetorgperson.schema
include		/etc/openldap/schema/java.schema
include		/etc/openldap/schema/misc.schema
include		/etc/openldap/schema/nis.schema
include		/etc/openldap/schema/openldap.schema
include		/etc/openldap/schema/ppolicy.schema
include		/etc/openldap/schema/collective.schema
allow bind_v2
pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args
TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password
database config
access to *
	by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
	by * none
database monitor
access to *
	by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
        by dn.exact="cn=Manager,dc=my-domain,dc=com" read
        by * none
database	bdb
suffix		"dc=my-domain,dc=com"
checkpoint	1024 15
rootdn		"cn=Manager,dc=my-domain,dc=com"
directory	/var/lib/ldap
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

Les Directives du Fichier slapd.conf

include

Ces directives chargent les schémas :

include		/etc/openldap/schema/corba.schema
include		/etc/openldap/schema/core.schema
include		/etc/openldap/schema/cosine.schema
include		/etc/openldap/schema/duaconf.schema
include		/etc/openldap/schema/dyngroup.schema
include		/etc/openldap/schema/inetorgperson.schema
include		/etc/openldap/schema/java.schema
include		/etc/openldap/schema/misc.schema
include		/etc/openldap/schema/nis.schema
include		/etc/openldap/schema/openldap.schema
include		/etc/openldap/schema/ppolicy.schema
include		/etc/openldap/schema/collective.schema
allow

Cette directive permet l'utilisation du protocole LDAPv2 pour la connexion :

allow bind_v2
referral

Cette directive spécifie l'url de referral pour la base LDAP locale.

#referral       ldap://root.openldap.org
pidfile

Cette directive spécifie l'emplacement du fichier contenant le PID de slapd.

pidfile		/var/run/openldap/slapd.pid
argsfile

Cette directive contient la ligne de commande du lancement de slapd.

argsfile	/var/run/openldap/slapd.args
modulepath

Depuis la version 2.0 d'OpenLDAP, slapd peut être compilé pour utiliser des modules dynamiques, appelés overlays qui sont des bibliothèques partagés. Ces directives indiquent donc les endroits où sont stockés les modules dynamiques :

# modulepath /usr/lib/openldap
# modulepath /usr/lib64/openldap
[root@centos6 ~]# ls -l /usr/lib/openldap
total 688
lrwxrwxrwx. 1 root root    22 10 avril 15:18 accesslog-2.4.so.2 -> accesslog-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 39264  3 févr. 20:09 accesslog-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   939  3 févr. 20:08 accesslog.la
lrwxrwxrwx. 1 root root    21 10 avril 15:18 auditlog-2.4.so.2 -> auditlog-2.4.so.2.5.6
-rwxr-xr-x. 1 root root  9780  3 févr. 20:09 auditlog-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   933  3 févr. 20:08 auditlog.la
lrwxrwxrwx. 1 root root    20 10 avril 15:18 collect-2.4.so.2 -> collect-2.4.so.2.5.6
-rwxr-xr-x. 1 root root  9812  3 févr. 20:09 collect-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   927  3 févr. 20:08 collect.la
lrwxrwxrwx. 1 root root    23 10 avril 15:18 constraint-2.4.so.2 -> constraint-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 22200  3 févr. 20:09 constraint-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   945  3 févr. 20:08 constraint.la
lrwxrwxrwx. 1 root root    16 10 avril 15:18 dds-2.4.so.2 -> dds-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 34816  3 févr. 20:09 dds-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   903  3 févr. 20:08 dds.la
lrwxrwxrwx. 1 root root    18 10 avril 15:18 deref-2.4.so.2 -> deref-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 13692  3 févr. 20:09 deref-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   915  3 févr. 20:08 deref.la
lrwxrwxrwx. 1 root root    21 10 avril 15:18 dyngroup-2.4.so.2 -> dyngroup-2.4.so.2.5.6
-rwxr-xr-x. 1 root root  9748  3 févr. 20:09 dyngroup-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   933  3 févr. 20:08 dyngroup.la
lrwxrwxrwx. 1 root root    20 10 avril 15:18 dynlist-2.4.so.2 -> dynlist-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 26404  3 févr. 20:09 dynlist-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   927  3 févr. 20:08 dynlist.la
lrwxrwxrwx. 1 root root    21 10 avril 15:18 memberof-2.4.so.2 -> memberof-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 30612  3 févr. 20:09 memberof-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   933  3 févr. 20:08 memberof.la
lrwxrwxrwx. 1 root root    19 10 avril 15:18 pcache-2.4.so.2 -> pcache-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 72312  3 févr. 20:09 pcache-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   921  3 févr. 20:08 pcache.la
lrwxrwxrwx. 1 root root    20 10 avril 15:18 ppolicy-2.4.so.2 -> ppolicy-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 38764  3 févr. 20:09 ppolicy-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   934  3 févr. 20:08 ppolicy.la
lrwxrwxrwx. 1 root root    19 10 avril 15:18 refint-2.4.so.2 -> refint-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 18132  3 févr. 20:09 refint-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   921  3 févr. 20:08 refint.la
lrwxrwxrwx. 1 root root    20 10 avril 15:18 retcode-2.4.so.2 -> retcode-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 26444  3 févr. 20:09 retcode-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   927  3 févr. 20:08 retcode.la
lrwxrwxrwx. 1 root root    16 10 avril 15:18 rwm-2.4.so.2 -> rwm-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 59552  3 févr. 20:09 rwm-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   903  3 févr. 20:08 rwm.la
lrwxrwxrwx. 1 root root    19 10 avril 15:18 seqmod-2.4.so.2 -> seqmod-2.4.so.2.5.6
-rwxr-xr-x. 1 root root  5456  3 févr. 20:09 seqmod-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   921  3 févr. 20:08 seqmod.la
lrwxrwxrwx. 1 root root    21 10 avril 15:18 smbk5pwd-2.4.so.2 -> smbk5pwd-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 14024  3 févr. 20:09 smbk5pwd-2.4.so.2.5.6
-rwxr-xr-x. 1 root root  1166  3 févr. 20:08 smbk5pwd.la
lrwxrwxrwx. 1 root root    19 10 avril 15:18 sssvlv-2.4.so.2 -> sssvlv-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 22204  3 févr. 20:09 sssvlv-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   921  3 févr. 20:08 sssvlv.la
lrwxrwxrwx. 1 root root    21 10 avril 15:18 syncprov-2.4.so.2 -> syncprov-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 51148  3 févr. 20:09 syncprov-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   933  3 févr. 20:08 syncprov.la
lrwxrwxrwx. 1 root root    24 10 avril 15:18 translucent-2.4.so.2 -> translucent-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 26552  3 févr. 20:09 translucent-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   951  3 févr. 20:08 translucent.la
lrwxrwxrwx. 1 root root    19 10 avril 15:18 unique-2.4.so.2 -> unique-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 26388  3 févr. 20:09 unique-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   921  3 févr. 20:08 unique.la
lrwxrwxrwx. 1 root root    20 10 avril 15:18 valsort-2.4.so.2 -> valsort-2.4.so.2.5.6
-rwxr-xr-x. 1 root root 14028  3 févr. 20:09 valsort-2.4.so.2.5.6
-rwxr-xr-x. 1 root root   927  3 févr. 20:08 valsort.la
moduleload

Ces directives chargent un module dynamique pour un backend spécifique.

# moduleload accesslog.la
# moduleload auditlog.la
# moduleload back_sql.la
# moduleload chain.la
# moduleload collect.la
# moduleload constraint.la
# moduleload dds.la
# moduleload deref.la
# moduleload dyngroup.la
# moduleload dynlist.la
# moduleload memberof.la
# moduleload pbind.la
# moduleload pcache.la
# moduleload ppolicy.la
# moduleload refint.la
# moduleload retcode.la
# moduleload rwm.la
# moduleload seqmod.la
# moduleload smbk5pwd.la
# moduleload sssvlv.la
# moduleload syncprov.la
# moduleload translucent.la
# moduleload unique.la
# moduleload valsort.la
TLSCACertificateFile, TLSCertificateFile & TLSCertificateKeyFile

Ces directives permettent l'utilisation de connexions crypées en utilisant TLS.

TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password
security

Le serveur utilise des SSF (Security Strength Factors) pour fixer le niveau de sécurité. Une valeur de SSF=0 indique qu'aucune protection n'est en place :

# security ssf=1 update_ssf=112 simple_bind=64
access to

OpenLDAP utilise des ACL (Access Control Lists) pour sécuriser l'accès aux données. Sans ACL définis, la valeur par défaut est :

access to * by * READ

Le rootdn peut toujours tout lire et tout écrire.

Le format de cette ligne est :

access to OBJET by SUJET AUTORISATION CONTROLE

où :

L'exemple suivant :

access to dn.base="" by * read
access to dn.base="cn=Subschema" by * read
access to *
	by self write
	by users read
	by anonymous auth

indique donc :

Pour plus d'information concernant les ACL, consultez cette page.

database config

Cette directive permet l'utilisation de cn=config :

# enable on-the-fly configuration (cn=config)
database config
access to *
	by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
	by * none
backend

Cette directive stipule le type de backend autrement dit le moteur de base de données :

Moteur Description
bdb Base de données transactionnelle Berkeley
hdb Base de données transactionnelle Berkeley hiérarchisée
ldbm Base de données avec des fichiers au format dbm ou gdbm
dnssrv Intérrogation d'un serveur DNS en utilisant les champs SRV des enrigistrements DNS
ldap Transmission des reqûetes en tant que proxy vers un autre serveur LDAP
meta Transmission des reqûetes en tant que proxy avec méchanisme de ré-écriture des noms des objets
monitor Pseudo backend pour accéder aux informations du serveur
passwd Base de données transactionnelle Berkeley
perl Transmission des commandes LDAP vers un interpréteur perl
shell Transmission des commandes LDAP vers un interpréteur shell
sql Utilisation d'une base de données
suffix DN

Cette directive indique le noeud que la base de données va gérer :

suffix          "dc=domain,dc=com"
checkpoint

Cette directive indique la fréquence, en KO et en minutes, des checkpoints. Un checkpoint déclenche l'écriture des données dans les buffers vers le disque et l'insertion d'un enregistrement de type checkpoint dans le fichier de journalisation BDB. Les checkpoints font partie intégrale du fonctionnement des bases de données au format BDB et HDB. Pour plus d'informations voir man slapd-bdb :

checkpoint	1024 15
rootdn <DN>

Cette directive identifie l'utilisateur dont les accès ne seront pas soumis aux clauses d'accès :

rootdn		"cn=Manager,dc=my-domain,dc=com"
rootpw <mot de passe>

Cette directive indique le mot de passe de l'utilisateur rootdn :

# rootpw		{crypt}ijFYNcSNctBYg
directory

Cette directive indique l'emplacement des bases de données et les indexes :

directory       /var/lib/ldap

Dans le cas d'une compilation des sources, la valeur par défaut est /usr/local/var/open-ldap.

index

Cette directive indique les index à créer et à maintenir pour la base de données.

Dans l'exemple qui suit les index :

index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

La commande slapindex crée et met à jour les index spécifiés dans le fichier slapd.conf.

replogfile <filename>

Cette directive indique le nom et l'emplacement du fichier de journalisation de la replication.

#replogfile /var/lib/ldap/openldap-master-replog
replica host <hostname>[:<port>] [bindmethod={ simple | kerberos | sasl }]

Cette directive détaille l'esclave pour la replication.

#replica host=ldap-1.example.com:389 starttls=critical
#     bindmethod=sasl saslmech=GSSAPI
#     authcId=host/ldap-master.example.com@EXAMPLE.COM

Autres Directives Utiles

loglevel

Cette directive stipule le niveau de verbosité des journaux selon les valeurs dans le tableau suivant :

Niveau Mot clé Description
-1 Any Affichage de toutes les informations
0 Aucune information
1 Trace Liste des appels de fonctions
2 Packets Affichange du traitement des paquets
4 Args Affichage détaillé des appels de fonctions
8 Conns Affichage des connexions
16 BER Affichage des paquets reçus et émis
32 Filter Affichage du traitement d'un filtre
64 Config Affichage du traitement du fichier de configuration
128 ACL Affichage du traitement des permissions de chaque opération
256 Stats Affichage du résultat des opérations
512 Stats2 Affichage des statistiques
1024 Shell Affichage des communications avec des backends de type shell
2048 Parse Affichage du traitement des entrées
4096 Cache Affichage des opérations de gestion du cache des bases de données
8192 Index Affichage des opérations d'indexation des bases de données
16384 Sync Affichage des opérations syncrepl

Pour activer à la fois la journalisation du traitement des permissions et des connexions, la directive peut être écrite de deux façons différentes : loglevel 128 1 ou loglevel 129.

password-hash

Cette directive spécifie le type de cryptage utilisé par la commande ldappassword :

La valeur pas défaut est {SSHA}.

schemacheck

Cette directive permet de stipuler si oui ou non le serveur vérifie le respect du schéma lors d'une modification de l'annuaire.

La valeur pas défaut est on.

idletimeout

Cette directive spécifie le nombre de secondes à attendre avant de fermer la connexion d'un client inactif.

La valeur par défaut est 0 qui désactive cette option.

sizelimit

Cette directive indique le nombre maximal d'entrées à retourner lors d'une requête.

La valeur par défaut est 500.

timelimit

Cette directive indique le nombre de seconds maximum alloué par le serveur à chaque requête de recherche. Une valeur d'unlimited désactive cette option.

La valeur par défaut est 3600.

readonly <on | off>

Cette directive met la base en lecture seule.

La valeur par défaut est off.

lastmod <on | off>

Cette directive définit si les attributs opérationnels tels modifiersName et modifyTimestamp des entrées seront stockés ou pas.

La valeur par défaut est on.

Le Fichier /etc/openldap/ldap.conf

Nous avons déjà établi que le fichier de configuration de slapd est /etc/openldap/slapd.conf.

Il existe aussi un autre fichier de configuration : /etc/openldap/ldap.conf.

Le fichier de configuration ldap.conf est utilisé pour configurer les commandes clients. Il est aussi possible de mettre en place des configurations spécifiques à un utilisateur en créant un fichier .ldaprc dans son répertoire de connexion, voire de créer un fichier de configuration ldaprc propre à un utilisateur et le placer dans le répertoire courant.

cn=config

Depuis la version 2.3 d'OpenLDAP, les fichiers de configuration sont stockés dans le répertoire /usr/local/etc/openldap/slapd.d ( dans le cas d'une installation depuis des sources) ou /etc/openldap/slapd.d (dans le cas d'une installation à partir des dépôts).

Pour pouvoir utiliser le fichier slapd.conf, il convient de le copier dans le répertoire /usr/local/etc/openldap ou /etc/openldap/slapd.d puis de supprimer le répertoire /usr/local/etc/openldap/slapd.d ou /etc/openldap/slapd.d.

La configuration est stockée dans un annuaire spécifique, dont la structure de base est :

Ce qui se traduit par l'arborescence suivante :

/etc/openldap/slapd.d
/etc/openldap/slapd.d/cn=config
/etc/openldap/slapd.d/cn=config.ldif
/etc/openldap/slapd.d/cn=config/cn=schema
/etc/openldap/slapd.d/cn=config/cn=schema.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={2}bdb.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={0}corba.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={10}ppolicy.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={11}collective.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={1}core.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={2}cosine.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={3}duaconf.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={4}dyngroup.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={5}inetorgperson.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={6}java.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={7}misc.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={8}nis.ldif
/etc/openldap/slapd.d/cn=config/cn=schema/cn={9}openldap.ldif

Les numéros {X} indiquent l'ordre dans lequel slapd va traiter les fichiers.

Les attributs de cette nouvelle configuration ont une correspondance avec les directives du fichier slapd.conf :

Directive slapd.conf Attribut cn=config
access to olcAccess
allow olcAllows
argsfile olcArgsFile
attributetype olcAttributeTypes
concurrency olcConcurrency
conn_max_pending olcConnMaxPending
conn_max_auth olcConnMaxPendingAuth
defaultaccess Non supporté
defaultsearchbase olcDefaultSearchBase
disallow olcDisallows
gentlehup olcGentleHUP
idletimeout olcIdleTimeout
include Non supporté
index olcDbIndex
logfile olcLogFile
loglevel olcLogLevel
moduleload olcModuleLoad
modulepath olcModulePath
objectclass olcObjectClasses
password-hash olcPasswordHash
pidfile olcPidFile
referral olcReferral
replicationinterval Non supporté
require olcRequires
reverse-lookup olcReverseLookup
rootDSE olcRootDSE
schemadn olcSchemaDN
security olcSecurity
ServerID olcServerID
sizelimit olcSizeLimit
sockbuf_max_incoming olcSockBufMaxIncoming
sockbuf_max_incoming_auth olcSockBufMaxIncomingAuth
threads olcThreads
timelimit olcTimeLimit
TLSCACertificateFile olcTLSCACertificateFile
TLSCertificateFile olcTLSCertificateFile
TLSCertificateKeyFile olcTLSCertificateKeyFile
TLSCipherSuite olcTLSCipherSuite
TLSRandFile olcTLSRandFile
TLSEphemeralDHParamFile olcTLSDHParamFile
TLSVerifyClient olcTLSVerifyClient
backend olcBackend
access to olcAccess
database olcDatabase
index olcDbIndex
mirrormode olcMirrorMode
overlay olcOverlay
readonly olcReadOnly
replica olcReplica
replogfile olcReplogFile
require olcRequires
rootdn olcRootDN
rootpw olcRootPW
suffix olcSuffix
syncrepl olcSyncrepl
updatedn olcUpdateDN
updateref olcUpdateref

Sécuriser l'Annuaire

Créer le Mot de Passe de l'Administrateur

La première tâche à accomplir est de générer un mot de passe pour l'administrateur d'OpenLDAP :

[root@centos6 ~]# slappasswd
New password: 
Re-enter new password: 
{SSHA}/0IpH1CvbXjX0HBLjwjzKfYyhtwCX524

La commande slappasswd prend les options suivantes :

Usage: slappasswd [options]
  -h hash       password scheme
  -s secret     new password
  -c format     crypt(3) salt format
  -u            generate RFC2307 values (default)
  -v            increase verbosity
  -T file       read file for new password

Il convient ensuite de modifier le fichier /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif en y ajoutant la ligne olcRootPW: {SSHA}/0IpH1CvbXjX0HBLjwjzKfYyhtwCX524 :

dn: olcDatabase={2}bdb
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: {2}bdb
olcSuffix: dc=my-domain,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcRootPW: {SSHA}/0IpH1CvbXjX0HBLjwjzKfYyhtwCX524
olcSyncUseSubentry: FALSE
olcMonitoring: TRUE
olcDbDirectory: /var/lib/ldap
olcDbCacheSize: 1000
olcDbCheckpoint: 1024 15
olcDbNoSync: FALSE
olcDbDirtyRead: FALSE
olcDbIDLcacheSize: 0
olcDbIndex: objectClass pres,eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: uidNumber pres,eq
olcDbIndex: gidNumber pres,eq
olcDbIndex: ou pres,eq,sub
olcDbIndex: loginShell pres,eq
olcDbIndex: mail pres,eq,sub
olcDbIndex: sn pres,eq,sub
olcDbIndex: givenName pres,eq,sub
olcDbIndex: memberUid pres,eq,sub
olcDbIndex: nisMapName pres,eq,sub
olcDbIndex: nisMapEntry pres,eq,sub
olcDbLinearIndex: FALSE
olcDbMode: 0600
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0
structuralObjectClass: olcBdbConfig
entryUUID: 4dddce5c-54fe-1033-8153-dbe2595ccd66
creatorsName: cn=config
createTimestamp: 20140410131809Z
entryCSN: 20140410131809.201468Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20140410131809Z

Les directives olcSuffix: dc=my-domain,dc=com et olcRootDN: cn=Manager,dc=my-domain,dc=com doivent être modifiées pour votre système ainsi :

...
olcSuffix: dc=fenestros,dc=com
olcRootDN: cn=Manager,dc=fenestros,dc=com
...

La directive olcSuffix indique la racine de l'arbre qui est détenu dans la base de données. La directive olcRootDN indique les coordonnées de connexion de l'administrateur de cet arbre. N'utilisez pas cn=root.

Sécuriser avec SSL

Ajoutez les deux directives suivantes pour les connexions ssl au fichier /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif:

...
olcTLSCertificateFile: /etc/pki/tls/certs/ldapcert.pem
olcTLSCertificateKeyFile: /etc/pki/tls/certs/ldapkey.pem

Votre fichier devient donc :

bdb.ldif
dn: olcDatabase={2}bdb
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: {2}bdb
olcSuffix: dc=fenestros,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=fenestros,dc=com
olcRootPW: {SSHA}IlHgBODYC3npHKLPGounjqTtLgxRJEmU
olcSyncUseSubentry: FALSE
olcMonitoring: TRUE
olcDbDirectory: /var/lib/ldap
olcDbCacheSize: 1000
olcDbCheckpoint: 1024 15
olcDbNoSync: FALSE
olcDbDirtyRead: FALSE
olcDbIDLcacheSize: 0
olcDbIndex: objectClass pres,eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: uidNumber pres,eq
olcDbIndex: gidNumber pres,eq
olcDbIndex: ou pres,eq,sub
olcDbIndex: loginShell pres,eq
olcDbIndex: mail pres,eq,sub
olcDbIndex: sn pres,eq,sub
olcDbIndex: givenName pres,eq,sub
olcDbIndex: memberUid pres,eq,sub
olcDbIndex: nisMapName pres,eq,sub
olcDbIndex: nisMapEntry pres,eq,sub
olcDbLinearIndex: FALSE
olcDbMode: 0600
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0
structuralObjectClass: olcBdbConfig
entryUUID: d34566ca-44d6-1031-9e81-6756bfd20624
creatorsName: cn=config
createTimestamp: 20120607102519Z
entryCSN: 20120607102519.200524Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20120607102519Z
olcTLSCertificateFile: /etc/pki/tls/certs/ldapcert.pem
olcTLSCertificateKeyFile: /etc/pki/tls/certs/ldapkey.pem

Activez ssl dans le fichier /etc/sysconfig/ldap en modifiant la directive SLAPD_LDAPS :

/etc/sysconfig/ldap
# Options of slapd (see man slapd)
#SLAPD_OPTIONS=
 
# At least one of SLAPD_LDAP, SLAPD_LDAPI and SLAPD_LDAPS must be set to 'yes'!
#
# Run slapd with -h "... ldap:/// ..."
#   yes/no, default: yes
SLAPD_LDAP=yes
 
# Run slapd with -h "... ldapi:/// ..."
#   yes/no, default: yes
SLAPD_LDAPI=yes
 
# Run slapd with -h "... ldaps:/// ..."
#   yes/no, default: no
SLAPD_LDAPS=yes
 
# Run slapd with -h "... $SLAPD_URLS ..."
# This option could be used instead of previous three ones, but:
# - it doesn't overwrite settings of $SLAPD_LDAP, $SLAPD_LDAPS and $SLAPD_LDAPI options
# - it isn't overwritten by settings of $SLAPD_LDAP, $SLAPD_LDAPS and $SLAPD_LDAPI options
# example: SLAPD_URLS="ldapi:///var/lib/ldap_root/ldapi ldapi:/// ldaps:///"
# default: empty
#SLAPD_URLS=""
 
# Maximum allowed time to wait for slapd shutdown on 'service ldap stop' (in seconds)
#SLAPD_SHUTDOWN_TIMEOUT=3
 
# Parameters to ulimit, use to change system limits for slapd
#SLAPD_ULIMIT_SETTINGS=""

Générez ensuite votre certificat :

[root@centos6 ~]# openssl req -new -x509 -nodes -out /etc/pki/tls/certs/ldapcert.pem -keyout /etc/pki/tls/certs/ldapkey.pem -days 365
Generating a 2048 bit RSA private key
.......+++
..........................................................................................+++
writing new private key to '/etc/pki/tls/certs/ldapkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:VAR
Locality Name (eg, city) [Default City]:Toulon
Organization Name (eg, company) [Default Company Ltd]:Linux E-Learning
Organizational Unit Name (eg, section) []:Formation
Common Name (eg, your name or your server's hostname) []:centos.fenestros.com
Email Address []:root@localhost

Modifiez le groupe et les permissions :

[root@centos6 ~]# chown -Rf root:ldap /etc/pki/tls/certs/ldapcert.pem
[root@centos6 ~]# chmod -Rf 750 /etc/pki/tls/certs/ldapkey.pem

La présence du fichier DB_CONFIG est primordiale pour le bon fonctionnement d'OpenLDAP.

Un exemple de fichier se trouve dans le répertoire /usr/share/openldap-servers/ :

[root@centos6 ~]# ls -l /usr/share/openldap-servers/DB*
-rw-r--r--. 1 root root 921  7 déc.   2011 /usr/share/openldap-servers/DB_CONFIG.example

Le fichier de configuration DB_CONFIG permet aux administrateurs de personnaliser l'environnement de la base de données indépendamment des applications qui l'utilise. Par exemple l'administrateur pourrait déplacer l'emplacement des bases de données et les fichiers de journalisation sans avoir à recompiler les applications qui les utilisent. Le fichier DB_CONFIG est lu au moment du chargement de l'environnement de la base de données. Ceci implique que les valeurs dans ce fichier surchargent celles dans les fichiers de configuration.

DB_CONFIG.example
# $OpenLDAP: pkg/ldap/servers/slapd/DB_CONFIG,v 1.3.2.4 2007/12/18 11:53:27 ghenry Exp $
# Example DB_CONFIG file for use with slapd(8) BDB/HDB databases.
#
# See the Oracle Berkeley DB documentation
#   <http://www.oracle.com/technology/documentation/berkeley-db/db/ref/env/db_config.html>
# for detail description of DB_CONFIG syntax and semantics.
#
# Hints can also be found in the OpenLDAP Software FAQ
#	<http://www.openldap.org/faq/index.cgi?file=2>
# in particular:
#   <http://www.openldap.org/faq/index.cgi?file=1075>
 
# Note: most DB_CONFIG settings will take effect only upon rebuilding
# the DB environment.
 
# one 0.25 GB cache
set_cachesize 0 268435456 1
 
# Data Directory
#set_data_dir db
 
# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152
#set_lg_dir logs
 
# Note: special DB_CONFIG flags are no longer needed for "quick"
# slapadd(8) or slapindex(8) access (see their -q option). 

Il convient donc de copier ce fichier vers /var/lib/ldap/DB_CONFIG :

[root@centos6 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

Puis de modifier le propriétaire et le groupe :

[root@centos6 ~]# chown -R ldap:ldap /var/lib/ldap/

A titre d'exemple d'une modification du fichier DB_CONFIG, ajoutons une directive qui permettra de nettoyer automatiquement les fichiers logs set_flags DB_LOG_AUTOREMOVE :

...
# Note: most DB_CONFIG settings will take effect only upon rebuilding
# the DB environment.

set_flags DB_LOG_AUTOREMOVE

# one 0.25 GB cache
set_cachesize 0 268435456 1
...

Les directives admises du fichier DB_CONFIG peuvent être consultées dans la documentation de Berkeley-db

Éditez maintenant le fichier /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif et modifiez la directive olcAccess :

dn: olcDatabase={1}monitor
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=externa
 l,cn=auth" read  by dn.base="cn=Manager,dc=fenestros,dc=com" read  by * none
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcSyncUseSubentry: FALSE
olcMonitoring: FALSE
structuralObjectClass: olcDatabaseConfig
entryUUID: d34561de-44d6-1031-9e80-6756bfd20624
creatorsName: cn=config
createTimestamp: 20120607102519Z
entryCSN: 20120607102519.200524Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20120607102519Z

Vous pouvez maintenant tester votre configuration :

[root@centos6 ~]# slaptest -u
config file testing succeeded

Ensuite vous pouvez démarrer le serveur slapd :

[root@centos6 ~]# service slapd start
Démarrage de slapd :                                       [  OK  ]

Constatez le processus en cours :

[root@centos6 ~]# ps aux | grep slapd
ldap      2546  0.0  0.3  24176  4016 ?        Ssl  19:07   0:00 /usr/sbin/slapd -h  ldap:/// ldaps:/// ldapi:/// -u ldap
root      2552  0.0  0.0   4376   800 pts/0    S+   19:07   0:00 grep slapd

On note la présence d'arguments. Ceux-ci sont détaillés dans le fichier /var/run/openldap/slapd.args :

[root@centos6 ~]# cat /var/run/openldap/slapd.args
/usr/sbin/slapd -h  ldap:/// ldaps:/// ldapi:/// -u ldap  

Options de la ligne de commande de slapd

La commande slapd peut prendre plusieurs options :

[root@centos6 ~]# slapd --help
slapd: invalid option -- '-'
usage: slapd options
	-4		IPv4 only
	-6		IPv6 only
	-T {acl|add|auth|cat|dn|index|passwd|test}
			Run in Tool mode
	-c cookie	Sync cookie of consumer
	-d level	Debug level
	-f filename	Configuration file
	-F dir	Configuration directory
	-g group	Group (id or name) to run as
	-h URLs		List of URLs to serve
	-l facility	Syslog facility (default: LOCAL4)
	-n serverName	Service name
	-o <opt>[=val] generic means to specify options; supported options:
		slp[={on|off|(attrs)}] enable/disable SLP using (attrs)
	-r directory	Sandbox directory to chroot to
	-s level	Syslog level
	-u user		User (id or name) to run as
	-V		print version info (-VV only)

Création et maintenance de la base de données

Le format LDIF

Les fichiers au format LDIF (LDAP Interchange Format) sont utilisés lors de modifications de masse sur une base LDAP. Les fichiers LDIF sont traités dans un ordre séquentielle.

Le fichier LDIF est un fichier texte qui peut comprendre :

Un fichier LDIF commence avec un numéro de version et peut comporter des commentaires à l'aide du caractère #. Chaque enregistrement doit être séparé du précédent par une ligne blanche et il ne peut pas avoir deux lignes blanches consécutives.

Les attributs peuvent être sur plusieurs lignes. Dans ce cas les lignes supplémentaires commencent par un blanc.

Un fichier LDIF pour créer l'arbre de l'annuaire ressemble à cet exemple :

version: 1
dn: ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: France

dn: ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial

dn: ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche

dn: ou=Production,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Production

dn: ou=Suisse,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Suisse

dn: ou=Commercial,ou=Suisse,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial

dn: ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: USA

dn: ou=Commercial,ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial

dn: ou=Recherche,ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche

Création d’une base de données en ligne

La commande ldapadd

Afin de pouvoir utiliser notre fichier LDIF, il est nécessaire de faire appel au client ldapadd. Cet utilitaire prend un ou plusieurs options :

[root@centos6 tmp]# ldapadd --help
ldapadd: invalid option -- '-'
ldapadd: unrecognized option --
Add or modify entries from an LDAP server

usage: ldapadd [options]
	The list of desired operations are read from stdin or from the file
	specified by "-f file".
Add or modify options:
  -a         add values (default)
  -c         continuous operation mode (do not stop on errors)
  -E [!]ext=extparam	modify extensions (! indicate s criticality)
  -f file    read operations from `file'
  -M         enable Manage DSA IT control (-MM to make critical)
  -P version protocol version (default: 3)
  -S file    write skipped modifications to `file'
Common options:
  -d level   set LDAP debugging level to `level'
  -D binddn  bind DN
  -e [!]<ext>[=<extparam>] general extensions (! indicates criticality)
             [!]assert=<filter>     (RFC 4528; a RFC 4515 Filter string)
             [!]authzid=<authzid>   (RFC 4370; "dn:<dn>" or "u:<user>")
             [!]chaining[=<resolveBehavior>[/<continuationBehavior>]]
                     one of "chainingPreferred", "chainingRequired",
                     "referralsPreferred", "referralsRequired"
             [!]manageDSAit         (RFC 3296)
             [!]noop
             ppolicy
             [!]postread[=<attrs>]  (RFC 4527; comma-separated attr list)
             [!]preread[=<attrs>]   (RFC 4527; comma-separated attr list)
             [!]relax
             abandon, cancel, ignore (SIGINT sends abandon/cancel,
             or ignores response; if critical, doesn't wait for SIGINT.
             not really controls)
  -h host    LDAP server
  -H URI     LDAP Uniform Resource Identifier(s)
  -I         use SASL Interactive mode
  -n         show what would be done but don't actually do it
  -N         do not use reverse DNS to canonicalize SASL host name
  -O props   SASL security properties
  -o <opt>[=<optparam] general options
             nettimeout=<timeout> (in seconds, or "none" or "max")
  -p port    port on LDAP server
  -Q         use SASL Quiet mode
  -R realm   SASL realm
  -U authcid SASL authentication identity
  -v         run in verbose mode (diagnostics to standard output)
  -V         print version info (-VV only)
  -w passwd  bind password (for simple authentication)
  -W         prompt for bind password
  -x         Simple authentication
  -X authzid SASL authorization identity ("dn:<dn>" or "u:<user>")
  -y file    Read password from file
  -Y mech    SASL mechanism
  -Z         Start TLS request (-ZZ to require successful response)

Créons maintenant notre fichier LDIF dans le répertoire /tmp :

[root@centos6 ~]# cd /tmp; vi setup.ldif

Editez ensuite setup.ldif de la façon suivante :

setup.ldif
# Organisation fenestros
dn: dc=fenestros,dc=com
objectClass: dcObject
objectClass: organization
dc: fenestros
o: fenestros.com
description: Exemple
 
# Gestionnaire de l'arbre
dn: cn=Manager,dc=fenestros,dc=com
objectClass: organizationalRole
cn: Manager
description: Gestionnaire

Il convient maintenant d'utiliser la commande ldapadd afin d'injecter le contenu du fichier setup.ldif dans notre base :

[root@centos6 ~]# ldapadd -f /tmp/setup.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -w fenestros
adding new entry "dc=fenestros,dc=com"

adding new entry "cn=Manager,dc=fenestros,dc=com"

Nous procédons maintenant de la même façon pour les autres données. Créez le fichier /tmp/import.ldif :

import.ldif
version: 1
dn: ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: France
 
dn: ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial
 
dn: ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche
 
dn: ou=Production,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Production
 
dn: ou=Suisse,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Suisse
 
dn: ou=Commercial,ou=Suisse,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial
 
dn: ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: USA
 
dn: ou=Commercial,ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial
 
dn: ou=Recherche,ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche

Il convient maintenant d'utiliser de nouveau la commande ldapadd afin d'injecter le contenu du fichier import.ldif dans notre base :

[root@centos6 ~]# ldapadd -f /tmp/import.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -w fenestros
adding new entry "ou=France,dc=fenestros,dc=com"

adding new entry "ou=Commercial,ou=France,dc=fenestros,dc=com"

adding new entry "ou=Recherche,ou=France,dc=fenestros,dc=com"

adding new entry "ou=Production,ou=France,dc=fenestros,dc=com"

adding new entry "ou=Suisse,dc=fenestros,dc=com"

adding new entry "ou=Commercial,ou=Suisse,dc=fenestros,dc=com"

adding new entry "ou=USA,dc=fenestros,dc=com"

adding new entry "ou=Commercial,ou=USA,dc=fenestros,dc=com"

adding new entry "ou=Recherche,ou=USA,dc=fenestros,dc=com"

Utilisation du client graphique luma

Téléchargez le client luma, PyQt et python-smbpasswd à partir de ce lien : http://downloads.naulinux.ru/pub/NauLinux/6.2/i386/sites/School/RPMS/ :

[root@centos6 tmp]# wget http://downloads.naulinux.ru/pub/NauLinux/6.2/i386/sites/School/RPMS/luma-2.4-9.el6.noarch.rpm
--2014-05-10 19:14:46--  http://downloads.naulinux.ru/pub/NauLinux/6.2/i386/sites/School/RPMS/luma-2.4-9.el6.noarch.rpm
Résolution de downloads.naulinux.ru... 91.151.181.162
Connexion vers downloads.naulinux.ru|91.151.181.162|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 970868 (948K) [application/x-rpm]
Sauvegarde en : «luma-2.4-9.el6.noarch.rpm»

100%[==============================================================================================================================>] 970 868      118K/s   ds 7,9s    

2014-05-10 19:15:00 (121 KB/s) - «luma-2.4-9.el6.noarch.rpm» sauvegardé [970868/970868]

[root@centos6 tmp]# wget http://downloads.naulinux.ru/pub/NauLinux/6.2/i386/sites/School/RPMS/PyQt-3.18.1-6.el6.i686.rpm
--2014-05-10 19:15:28--  http://downloads.naulinux.ru/pub/NauLinux/6.2/i386/sites/School/RPMS/PyQt-3.18.1-6.el6.i686.rpm
Résolution de downloads.naulinux.ru... 91.151.181.162
Connexion vers downloads.naulinux.ru|91.151.181.162|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 1410428 (1,3M) [application/x-rpm]
Sauvegarde en : «PyQt-3.18.1-6.el6.i686.rpm»

100%[==============================================================================================================================>] 1 410 428    118K/s   ds 11s     

2014-05-10 19:15:45 (120 KB/s) - «PyQt-3.18.1-6.el6.i686.rpm» sauvegardé [1410428/1410428]

[root@centos6 tmp]# wget http://downloads.naulinux.ru/pub/NauLinux/6.2/i386/sites/School/RPMS/python-smbpasswd-1.0.1-17.el6.i686.rpm
--2014-05-10 19:16:12--  http://downloads.naulinux.ru/pub/NauLinux/6.2/i386/sites/School/RPMS/python-smbpasswd-1.0.1-17.el6.i686.rpm
Résolution de downloads.naulinux.ru... 91.151.181.162
Connexion vers downloads.naulinux.ru|91.151.181.162|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 17824 (17K) [application/x-rpm]
Sauvegarde en : «python-smbpasswd-1.0.1-17.el6.i686.rpm»

100%[==============================================================================================================================>] 17 824      56,7K/s   ds 0,3s    

2014-05-10 19:16:17 (56,7 KB/s) - «python-smbpasswd-1.0.1-17.el6.i686.rpm» sauvegardé [17824/17824]

Installez-les :

[root@centos6 tmp]# yum localinstall luma-2.4-9.el6.noarch.rpm PyQt-3.18.1-6.el6.i686.rpm python-smbpasswd-1.0.1-17.el6.i686.rpm --nogpgcheck
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Local Package Process
Examining luma-2.4-9.el6.noarch.rpm: luma-2.4-9.el6.noarch
Marking luma-2.4-9.el6.noarch.rpm to be installed
Loading mirror speeds from cached hostfile
 * atomic: mir01.syntis.net
 * base: mirrors.prometeus.net
 * epel: mir01.syntis.net
 * extras: mirrors.prometeus.net
 * rpmforge: mir01.syntis.net
 * updates: mirrors.prometeus.net
Examining PyQt-3.18.1-6.el6.i686.rpm: PyQt-3.18.1-6.el6.i686
Marking PyQt-3.18.1-6.el6.i686.rpm to be installed
Examining python-smbpasswd-1.0.1-17.el6.i686.rpm: python-smbpasswd-1.0.1-17.el6.i686
Marking python-smbpasswd-1.0.1-17.el6.i686.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package PyQt.i686 0:3.18.1-6.el6 will be installed
--> Processing Dependency: sip-api(6) >= 6.0 for package: PyQt-3.18.1-6.el6.i686
---> Package luma.noarch 0:2.4-9.el6 will be installed
---> Package python-smbpasswd.i686 0:1.0.1-17.el6 will be installed
--> Running transaction check
---> Package sip.i686 0:4.9.3-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================================
 Package                                Arch                         Version                            Repository                                                 Size
========================================================================================================================================================================
Installing:
 PyQt                                   i686                         3.18.1-6.el6                       /PyQt-3.18.1-6.el6.i686                                   8.9 M
 luma                                   noarch                       2.4-9.el6                          /luma-2.4-9.el6.noarch                                    4.0 M
 python-smbpasswd                       i686                         1.0.1-17.el6                       /python-smbpasswd-1.0.1-17.el6.i686                        31 k
Installing for dependencies:
 sip                                    i686                         4.9.3-1.el6                        base                                                      146 k

Transaction Summary
========================================================================================================================================================================
Install       4 Package(s)

Total size: 13 M
Total download size: 146 k
Installed size: 13 M
Is this ok [y/N]: y

Connectez-vous à votre serveur LDAP en utilisant luma. Cliquez sur le menu Paramètres/Editer la Liste de Serveurs. Cliquez sur Add puis renseignez le nom localhost. Sélectionnez localhost/Athentification, décochez Anonymous bind et remplissez les champs pour une connexion simple :

Cliquez sur le bouton OK.

Vous obtiendrez un résultat similaire à celui-ci :

Cliquez sur Browser puis sur localhost. Vous obtiendrez un résultat similaire à celui-ci :

Le Directory Information Tree

Ce que vous pouvez constater avec ces deux outils est la présence du DIT (Directory Information Tree). Ce DIT contient des entrées ayant des attributs dont les principaux types sont :

Noeud Nom Description
dc domain component domaine internet
c country pays
o organization organisation
ou organizational unit unité d'organisation
cn common name nom

Il est possible de faire référence à un entrée en utilisant un de deux noms :

Nom Abréviation Exemple
Distinguished Name DN ou=Commercial,ou=Suisse,dc=fenestros,dc=com
Relative Distinguished Name RDN ou=Commercial

Vous noterez qu'il existe trois entrées ayant le même RDN :

RDN DN
ou=Commercial ou=Commercial,ou=France,dc=fenestros,dc=com
ou=Commercial ou=Commercial,ou=Suisse,dc=fenestros,dc=com
ou=Commercial ou=Commercial,ou=USA,dc=fenestros,dc=com

Comme démontre cet exemple, il n'y a pas de contraintes au niveau des noms à l'excéption de l'unicité du DN.

Les noms des entités sont codés en UTF-8. Ceci implique que les noms peuvent contenir n'importe quelle combinaison de caractères y compris des éspaces.

Les alias

Le DIT peut également comporter des alias - des noeuds qui pointent vers une autre entrée du DIT.

Pour illustrer ce point, créez le fichier LDIF /tmp/alias.ldif et éditez-le ainsi :

alias.ldif
version: 1
dn: cn=Responsable Personnel,ou=France,dc=fenestros,dc=com
cn: Responsable Personnel
aliasedObjectName: cn=Directeur,ou=France,dc=fenestros,dc=com
objectClass: top
objectClass: alias
objectClass: extensibleObject

Importez maintenant le fichier LDIF dans le DIT :

[root@centos6 ~]# ldapadd -f /tmp/alias.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -w fenestros
adding new entry "cn=Responsable Personnel,ou=France,dc=fenestros,dc=com"

Constatez maintenant le résultat :

Notez que le noeud vers lequel pointe l'alias n'existe pas.

Créez le fichier LDIF /tmp/directeur.ldif et éditez-le ainsi :

directeur.ldif
version: 1
dn: cn=directeur,ou=France,dc=fenestros,dc=com
objectClass: person
objectClass: top
cn: directeur
sn: Guillaud
telephoneNumber: 12345678
telephoneNumber: 87654321

Créez donc l'entrée directeur en utilisant le fichier /tmp/directeur.ldif :

[root@centos6 ~]# ldapadd -f /tmp/directeur.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -w fenestros
adding new entry "cn=directeur,ou=France,dc=fenestros,dc=com"

Revenez à Luma. Vous obtiendrez une fenêtre similaire à celle-ci :

Créez le maintenant fichier LDIF /tmp/plus.ldif et éditez-le ainsi :

plus.ldif
version: 1
dn: ou=Angleterre,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Angleterre
 
dn: ou=Sales,ou=Angleterre,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Sales
 
dn: cn=Sales Director,ou=Sales,ou=Angleterre,dc=fenestros,dc=com
objectClass: person
objectClass: top
cn: Sales Director
sn: Smith
 
dn: cn=Sales Manager,cn=Sales Director,ou=Sales,ou=Angleterre,dc=fenestros,dc=com
objectClass: person
objectClass: top
cn: Sales Manager
sn: Brown
 
dn: cn=dupont,ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: person
objectClass: top
cn: dupont
sn: dupont

Créez donc les entrées en utilisant le fichier /tmp/plus.ldif :

[root@centos6 ~]# ldapadd -f /tmp/plus.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -w fenestros
adding new entry "ou=Angleterre,dc=fenestros,dc=com"

adding new entry "ou=Sales,ou=Angleterre,dc=fenestros,dc=com"

adding new entry "cn=Sales Director,ou=Sales,ou=Angleterre,dc=fenestros,dc=com"

adding new entry "cn=Sales Manager,cn=Sales Director,ou=Sales,ou=Angleterre,dc=fenestros,dc=com"

adding new entry "cn=dupont,ou=Recherche,ou=France,dc=fenestros,dc=com"

Revenez à Luma.Vous obtiendrez une fenêtre similaire à celle-ci :

Les attributs

Regardons maintenant l'entrée du directeur en France et plus spécifiquement les attributs :

On peut constater la présence de trois attributs, certains apparaissent en plusieurs exemples.

Choisissez maintenant le plugin Schemabrowser :

Vous obtiendrez une fenêtre comme celle-ci :

Dans le panneau de gauche, choisissez Attributs et trouvez l'entrée telephoneNumber :

Chaque attribut est défini par plusieurs types. Dans le cas du telephoneNumber, nous trouvons :

Type Nom français Description
EQUALITY Egalité Règles d'égalités
OID Identifiant de l'objet Object Identifier
SYNTAX Syntaxe OID de ce que peut contenir l'attribut

Les OID sont standardisés. Vous pouvez chercher un OID sur le site Internet http://www.oid-info.com/.

Vous pouvez également voir l'OID dans Luma grâce à l'onglet OIDs :

Un attribut peut dériver d'un autre attribut. Cet héritage implique le respect des caractériqtiques de l'attribut parent. Dans ce cas l'héritage est défini par l'attribut SUP dont la valeur est le nom de l'attribut parent.

Le serveur gère certains attributs automatiquement. Ces attributs sont appelés attributs opérationnels, par exemple :

Attributs Opérationnel Exemple
createTimestamp 20080606075042Z
modifyTimestamp 20080606075042Z
creatorsName cn=Manager,dc=fenestros,dc=com
modifiersName cn=Manager,dc=fenestros,dc=com

Les classes

Chaque entrée dans le DIT doit comporter au moins un attribut objectClass. La classe d'objet du directeur est person. Dans le panneau de gauche, cliquez sur l'onglet Classe d'objets et trouvez la classe Person :

Dans cette fenêtre vous pouvez constater des Attributs nécessaires et des Attributs autorisés. En anglais ces deux termes correspondent à :

Elément Description
MAY Attributs autorisés
MUST Attributs nécessaires

Notez aussi que cette classe est dite STRUCTURAL. Une entrée dans le DIT ne peut pas avoir plus d'une classe STRUCTURAL.

Le serveur OpenLDAP s'appuie sur trois types de classes d'objets :

Prenons la cas de notre fichier LDIF /tmp/alias.ldif. Notons que dans ce fichier, nous avions utilisé un objectClass: alias :

version: 1
dn: cn=Responsable Personnel,ou=France,dc=fenestros,dc=com
cn: Responsable Personnel
aliasedObjectName: cn=Directeur,ou=France,dc=fenestros,dc=com
objectClass: top
objectClass: alias
objectClass: extensibleObject

Si nous cherchons la définition de la classe alias, nous constatons que cette classe ne comprends pas d'attribut cn :

L'utilisation de la classe auxiliaire extensibleObject a permis de créer l'attribut cn non défini dans la classe alias :

Le dernier type de classe est ABSTRACT. La classe top est une classe ABSTRACT et chaque entrée de l'annuaire doit comporté une classe top :

Les schémas

L'ensemble des attributs et des classes d'un annuaire porte le nom de schéma. Les schémas sont normalisés. Les fichiers de schémas sont stockés dans le répertoire /etc/openldap/schema/ :

[root@centos6 ~]# ls /etc/openldap/schema/
collective.schema  cosine.schema       inetorgperson.schema  openldap.ldif
corba.schema       dhcp.schema         java.schema           openldap.schema
core.ldif          duaconf.schema      misc.schema           pmi.schema
core.schema        dyngroup.schema     nis.ldif              ppolicy.schema
cosine.ldif        inetorgperson.ldif  nis.schema

Le schema de base est core.schema. D'autres schémas utiles sont notamment :

Le chargement de ces deux fichiers de schémas nous permet de créer un objet pour une adresse email.

Créez le fichier LDIF /tmp/mail.ldif et éditez-le ainsi :

mail.ldif
version: 1
dn: cn=mail,ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: inetOrgPerson
objectClass: person
objectClass: top
cn: mail
mail: info@fenestros.com
sn: info

Créez donc l'entrée mail en utilisant le fichier /tmp/mail.ldif :

[root@localhost tmp]# ldapadd -f /tmp/mail.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -w fenestros
adding new entry "cn=mail,ou=Commercial,ou=France,dc=fenestros,dc=com"

Constatez maintenant le résultat avec Luma :

Les referrals

Il existe une autre entrée spéciale qui s'appelle un referral. Un referral est un pointeur vers une entrée vers un autre serveur LDAP. Pour illustrer ce point, créez le fichier LDIF /tmp/referral.ldif et éditez-le ainsi :

referral.ldif
version: 1
dn: ou=Informatique,dc=fenestros,dc=com
objectClass: referral
objectClass: extensibleObject
objectClass: top
ref: ldap://ldap.fenestros.net/ou=fenestros.com,dc=fenestros,dc=net
ou: Informatique

Utilisez la commande ldapadd pour ajouter l'entrée au DIT :

[root@centos6 tmp]# ldapadd -f /tmp/referral.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -w fenestros
adding new entry "ou=Informatique,dc=fenestros,dc=com"

Constatez le résultat avec Luma. Expliquez ce que vous voyez.

La commande ldapsearch

Chaque annuaire contient une entrée RootDSE. Cette entrée est particulière puisque son DN est vide. Son rôle est de contenir les attributs opérationnels du serveur qui comportent des extensions de contrôle et opérations disponibles sur le serveur. Cette information est utilisée par le client LDAP lors de sa connexion afin de connaître ce que peut et ce que ne peut pas faire le serveur.

Afin de connaître le contenu du RootDSE, il convient d'utiliser la commande ldapsearch. Cette commande prend les options suivantes :

[root@centos6 tmp]# ldapsearch  --help
ldapsearch: invalid option -- '-'
ldapsearch: unrecognized option --
usage: ldapsearch [options] [filter [attributes...]]
where:
  filter	RFC 4515 compliant LDAP search filter
  attributes	whitespace-separated list of attribute descriptions
    which may include:
      1.1   no attributes
      *     all user attributes
      +     all operational attributes
Search options:
  -a deref   one of never (default), always, search, or find
  -A         retrieve attribute names only (no values)
  -b basedn  base dn for search
  -c         continuous operation mode (do not stop on errors)
  -E [!]<ext>[=<extparam>] search extensions (! indicates criticality)
             [!]domainScope              (domain scope)
             !dontUseCopy                (Don't Use Copy)
             [!]mv=<filter>              (RFC 3876 matched values filter)
             [!]pr=<size>[/prompt|noprompt] (RFC 2696 paged results/prompt)
             [!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...]
                                         (RFC 2891 server side sorting)
             [!]subentries[=true|false]  (RFC 3672 subentries)
             [!]sync=ro[/<cookie>]       (RFC 4533 LDAP Sync refreshOnly)
                     rp[/<cookie>][/<slimit>] (refreshAndPersist)
             [!]vlv=<before>/<after>(/<offset>/<count>|:<value>)
                                         (ldapv3-vlv-09 virtual list views)
             [!]deref=derefAttr:attr[,...][;derefAttr:attr[,...][;...]]
             [!]<oid>=:<value>           (generic control; no response handling)
  -f file    read operations from `file'
  -F prefix  URL prefix for files (default: file:///tmp/)
  -l limit   time limit (in seconds, or "none" or "max") for search
  -L         print responses in LDIFv1 format
  -LL        print responses in LDIF format without comments
  -LLL       print responses in LDIF format without comments
             and version
  -M         enable Manage DSA IT control (-MM to make critical)
  -P version protocol version (default: 3)
  -s scope   one of base, one, sub or children (search scope)
  -S attr    sort the results by attribute `attr'
  -t         write binary values to files in temporary directory
  -tt        write all values to files in temporary directory
  -T path    write files to directory specified by path (default: /tmp)
  -u         include User Friendly entry names in the output
  -z limit   size limit (in entries, or "none" or "max") for search
Common options:
  -d level   set LDAP debugging level to `level'
  -D binddn  bind DN
  -e [!]<ext>[=<extparam>] general extensions (! indicates criticality)
             [!]assert=<filter>     (RFC 4528; a RFC 4515 Filter string)
             [!]authzid=<authzid>   (RFC 4370; "dn:<dn>" or "u:<user>")
             [!]chaining[=<resolveBehavior>[/<continuationBehavior>]]
                     one of "chainingPreferred", "chainingRequired",
                     "referralsPreferred", "referralsRequired"
             [!]manageDSAit         (RFC 3296)
             [!]noop
             ppolicy
             [!]postread[=<attrs>]  (RFC 4527; comma-separated attr list)
             [!]preread[=<attrs>]   (RFC 4527; comma-separated attr list)
             [!]relax
             abandon, cancel, ignore (SIGINT sends abandon/cancel,
             or ignores response; if critical, doesn't wait for SIGINT.
             not really controls)
  -h host    LDAP server
  -H URI     LDAP Uniform Resource Identifier(s)
  -I         use SASL Interactive mode
  -n         show what would be done but don't actually do it
  -N         do not use reverse DNS to canonicalize SASL host name
  -O props   SASL security properties
  -o <opt>[=<optparam] general options
             nettimeout=<timeout> (in seconds, or "none" or "max")
  -p port    port on LDAP server
  -Q         use SASL Quiet mode
  -R realm   SASL realm
  -U authcid SASL authentication identity
  -v         run in verbose mode (diagnostics to standard output)
  -V         print version info (-VV only)
  -w passwd  bind password (for simple authentication)
  -W         prompt for bind password
  -x         Simple authentication
  -X authzid SASL authorization identity ("dn:<dn>" or "u:<user>")
  -y file    Read password from file
  -Y mech    SASL mechanism
  -Z         Start TLS request (-ZZ to require successful response)

La syntaxe de la recherche du RootDSE est :

ldapsearch -x -s base -b "" "(objectclass=*)" +

Dans cette commande on peut constater des options :

Option Description
-s base Définit la portée de la recherche
-b ”“ Définit un dn vide pour la recherche
”(objectclass=*)“ Définit ce que l'on recherche
+ Définit tous les attributs opérationnels

Le résultat obtenu est :

[root@centos6 tmp]# ldapsearch -x -s base -b "" "(objectclass=*)" +
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: + 
#

#
dn:
structuralObjectClass: OpenLDAProotDSE
configContext: cn=config
monitorContext: cn=Monitor
namingContexts: dc=fenestros,dc=com
supportedControl: 2.16.840.1.113730.3.4.18
supportedControl: 2.16.840.1.113730.3.4.2
supportedControl: 1.3.6.1.4.1.4203.1.10.1
supportedControl: 1.2.840.113556.1.4.319
supportedControl: 1.2.826.0.1.3344810.2.3
supportedControl: 1.3.6.1.1.13.2
supportedControl: 1.3.6.1.1.13.1
supportedControl: 1.3.6.1.1.12
supportedExtension: 1.3.6.1.4.1.1466.20037
supportedExtension: 1.3.6.1.4.1.4203.1.11.1
supportedExtension: 1.3.6.1.4.1.4203.1.11.3
supportedExtension: 1.3.6.1.1.8
supportedFeatures: 1.3.6.1.1.14
supportedFeatures: 1.3.6.1.4.1.4203.1.5.1
supportedFeatures: 1.3.6.1.4.1.4203.1.5.2
supportedFeatures: 1.3.6.1.4.1.4203.1.5.3
supportedFeatures: 1.3.6.1.4.1.4203.1.5.4
supportedFeatures: 1.3.6.1.4.1.4203.1.5.5
supportedLDAPVersion: 3
supportedSASLMechanisms: GSSAPI
entryDN:
subschemaSubentry: cn=Subschema

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Utilisez le site web http://www.oid-info.com pour rechercher les supportedFeatures.

La commande ldapsearch utilisée ci-dessus a précisé une portée de base grâce à l'option -s base.

L'intérrogation de l'annuaire se fait avec une reqûete composée de 4 éléments :

Elément Description
Base Le point de départ de la reqûete
Attributs La liste des attributs à retourner. Si vide ou *, tous les attributs sont retournés
Portée Indique la portée de la reqûete. Elle peut être Base, One ou Sub
Filtre Spécifie des critères a appliquer au attributs

La notion de la portée est la suivante :

La forme d'un filtre est :

L'opérateur est un des éléments suivants :

Opérateur Description
= égalité stricte
~= égalité approximative
<= inférieur ou égal
>= supérieur ou égal
& et logique
| ou logique
! non logique

La valeur peut être :

Quand on veut trouver un caractère spécial, il convient de le remplacer avec une séquence spécifique :

Caractère Séquence
* \2A
( \28
) \29
\ \5C
Nul \00

L'utilisation de ldapsearch peut être illustrée avec quelques exemples.

Dans cet exemple, nous cherchons les entrées du type ou à partir de ou=France,dc=fenestros,dc=com :

[root@centos6 tmp]# ldapsearch -x -b "ou=France,dc=fenestros,dc=com" "(objectClass=organizationalUnit)"
# extended LDIF
#
# LDAPv3
# base <ou=France,dc=fenestros,dc=com> with scope subtree
# filter: (objectClass=organizationalUnit)
# requesting: ALL
#

# France, fenestros.com
dn: ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: France

# Commercial, France, fenestros.com
dn: ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial

# Recherche, France, fenestros.com
dn: ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche

# Production, France, fenestros.com
dn: ou=Production,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Production

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

Dans cet exemple, nous cherchons les entrées enfants du type ou à partir de ou=France,dc=fenestros,dc=com sans commentaires :

[root@centos6 tmp]# ldapsearch -x -LLL -s children -b "ou=France,dc=fenestros,dc=com" "(objectClass=organizationalUnit)"
dn: ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial

dn: ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche

dn: ou=Production,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Production

Dans cet exemple, nous cherchons les entrées enfants du type ou à partir de ou=France,dc=fenestros,dc=com sans commentaires et avec un tri sur la valeur de l'ou :

[root@centos6 tmp]# ldapsearch -x -LLL -S ou -s children -b "ou=France,dc=fenestros,dc=com"
dn: cn=Responsable Personnel,ou=France,dc=fenestros,dc=com
cn: Responsable Personnel
aliasedObjectName: cn=Directeur,ou=France,dc=fenestros,dc=com
objectClass: top
objectClass: alias
objectClass: extensibleObject

dn: cn=directeur,ou=France,dc=fenestros,dc=com
objectClass: person
objectClass: top
cn: directeur
sn: Guillaud
telephoneNumber: 12345678
telephoneNumber: 87654321

dn: cn=dupont,ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: person
objectClass: top
cn: dupont
sn: dupont

dn: cn=mail,ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: inetOrgPerson
objectClass: person
objectClass: top
cn: mail
mail: info@fenestros.com
sn: info

dn: ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial

dn: ou=Production,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Production

dn: ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche

Dans cet exemple, nous cherchons les entrées enfants du type ou à partir de ou=France,dc=fenestros,dc=com sans commentaires, avec un tri sur la valeur de l'ou et en demandant une affichage plus lisible :

[root@centos6 ~]# ldapsearch -x -LLL -S ou -s children -u -b "ou=France,dc=fenestros,dc=com"
dn: cn=Responsable Personnel,ou=France,dc=fenestros,dc=com
ufn: Responsable Personnel, France, fenestros.com
cn: Responsable Personnel
aliasedObjectName: cn=Directeur,ou=France,dc=fenestros,dc=com
objectClass: top
objectClass: alias
objectClass: extensibleObject

dn: cn=directeur,ou=France,dc=fenestros,dc=com
ufn: directeur, France, fenestros.com
objectClass: person
objectClass: top
cn: directeur
sn: Guillaud
telephoneNumber: 12345678
telephoneNumber: 87654321

dn: cn=dupont,ou=Recherche,ou=France,dc=fenestros,dc=com
ufn: dupont, Recherche, France, fenestros.com
objectClass: person
objectClass: top
cn: dupont
sn: dupont

dn: ou=Commercial,ou=France,dc=fenestros,dc=com
ufn: Commercial, France, fenestros.com
objectClass: organizationalUnit
objectClass: top
ou: Commercial

dn: ou=Production,ou=France,dc=fenestros,dc=com
ufn: Production, France, fenestros.com
objectClass: organizationalUnit
objectClass: top
ou: Production

dn: ou=Recherche,ou=France,dc=fenestros,dc=com
ufn: Recherche, France, fenestros.com
objectClass: organizationalUnit
objectClass: top
ou: Recherche

Dans cet exemple, nous cherchons les entrées du type ou et cn à partir de ou=France,dc=fenestros,dc=com en utilisant un fichier de filtre. Le fichier de filtre est /tmp/filtre et contient trois lignes :

organizationalUnit
inetOrgPerson
 

Ce fichier filtre DOIT comporter une ligne vide à la fin.

La commande est :

[root@centos6 tmp]# ldapsearch -x -b "ou=France,dc=fenestros,dc=com" -f /tmp/filtre "(objectClass=%s)" ou cn
# extended LDIF
#
# LDAPv3
# base <ou=France,dc=fenestros,dc=com> with scope subtree
# filter pattern: (objectClass=%s)
# requesting: ou cn 
#

#
# filter: (objectClass=organizationalUnit)
#
# France, fenestros.com
dn: ou=France,dc=fenestros,dc=com
ou: France

# Commercial, France, fenestros.com
dn: ou=Commercial,ou=France,dc=fenestros,dc=com
ou: Commercial

# Recherche, France, fenestros.com
dn: ou=Recherche,ou=France,dc=fenestros,dc=com
ou: Recherche

# Production, France, fenestros.com
dn: ou=Production,ou=France,dc=fenestros,dc=com
ou: Production

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4

#
# filter: (objectClass=inetOrgPerson)
#
# mail, Commercial, France, fenestros.com
dn: cn=mail,ou=Commercial,ou=France,dc=fenestros,dc=com
cn: mail

# search result
search: 3
result: 0 Success

# numResponses: 2
# numEntries: 1

#
# filter: (objectClass=)
#
# search result
search: 4
result: 0 Success

# numResponses: 1

Saisissez les commandes ci-dessus et vérifiez que vous obtenez les mêmes résultats. Identifiez les options de la commande responsables pour chaque résultat spécifique.

La commande ldapmodify

Afin d'illustrer l'utilisation de la commande ldapmodify, créez une fichier /tmp/prepa_modify.ldif et éditez-le ainsi :

prepa_modify.ldif
dn: cn=dupond,ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: inetOrgPerson
objectClass: top
cn: dupond
sn: dupond

Saisissez ensuite la commande suivante :

[root@centos6 tmp]# ldapadd -f /tmp/prepa_modify.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -W
Enter LDAP Password: 
adding new entry "cn=dupond,ou=Recherche,ou=France,dc=fenestros,dc=com"

Notez l'utilisation de l'option -W qui permet de demander au serveur un prompt pour le mot de passe au lieu de l'écrire en clair dans la commande elle-même.

Visualisez votre DIT avec Luma. Vous constaterez un résultat similaire à celui-ci :

{{redhat:lx08:luma18.png|}} 

La commande ldapmodify prend les options suivantes :

[root@centos6 ~]# ldapmodify --help
ldapmodify: invalid option -- '-'
ldapmodify: unrecognized option --
Add or modify entries from an LDAP server

usage: ldapmodify [options]
	The list of desired operations are read from stdin or from the file
	specified by "-f file".
Add or modify options:
  -a         add values (default is to replace)
  -c         continuous operation mode (do not stop on errors)
  -E [!]ext=extparam	modify extensions (! indicate s criticality)
  -f file    read operations from `file'
  -M         enable Manage DSA IT control (-MM to make critical)
  -P version protocol version (default: 3)
  -S file    write skipped modifications to `file'
Common options:
  -d level   set LDAP debugging level to `level'
  -D binddn  bind DN
  -e [!]<ext>[=<extparam>] general extensions (! indicates criticality)
             [!]assert=<filter>     (RFC 4528; a RFC 4515 Filter string)
             [!]authzid=<authzid>   (RFC 4370; "dn:<dn>" or "u:<user>")
             [!]chaining[=<resolveBehavior>[/<continuationBehavior>]]
                     one of "chainingPreferred", "chainingRequired",
                     "referralsPreferred", "referralsRequired"
             [!]manageDSAit         (RFC 3296)
             [!]noop
             ppolicy
             [!]postread[=<attrs>]  (RFC 4527; comma-separated attr list)
             [!]preread[=<attrs>]   (RFC 4527; comma-separated attr list)
             [!]relax
             abandon, cancel, ignore (SIGINT sends abandon/cancel,
             or ignores response; if critical, doesn't wait for SIGINT.
             not really controls)
  -h host    LDAP server
  -H URI     LDAP Uniform Resource Identifier(s)
  -I         use SASL Interactive mode
  -n         show what would be done but don't actually do it
  -N         do not use reverse DNS to canonicalize SASL host name
  -O props   SASL security properties
  -o <opt>[=<optparam] general options
             nettimeout=<timeout> (in seconds, or "none" or "max")
  -p port    port on LDAP server
  -Q         use SASL Quiet mode
  -R realm   SASL realm
  -U authcid SASL authentication identity
  -v         run in verbose mode (diagnostics to standard output)
  -V         print version info (-VV only)
  -w passwd  bind password (for simple authentication)
  -W         prompt for bind password
  -x         Simple authentication
  -X authzid SASL authorization identity ("dn:<dn>" or "u:<user>")
  -y file    Read password from file
  -Y mech    SASL mechanism
  -Z         Start TLS request (-ZZ to require successful response)

Nous allons maintenant utiliser la commande ldapmodify pour ajouter une adresse email à l'entrée Dupond. Créez donc le fichier /tmp/modify.ldif et éditez-le ainsi :

modify.ldif
dn: cn=dupond,ou=Recherche,ou=France,dc=fenestros,dc=com
changetype: modify
add: mail
mail: dupond@fenestros.com

Saisissez maintenant la commande suivante :

[root@centos6 tmp]# ldapmodify -f /tmp/modify.ldif -x -D "cn=Manager,dc=fenestros,dc=com" -W
Enter LDAP Password: 
modifying entry "cn=dupond,ou=Recherche,ou=France,dc=fenestros,dc=com"

Visualisez votre DIT avec Luma. Vous constaterez un résultat similaire à celui-ci :

{{redhat:lx08:luma19.png|}} 

La commande ldapdelete

Comme vous pouvez constater, vous avez deux entrées dans ou=Recherche,ou=France,dc=fenestros,dc=com :

Nous souhaitons maintenant supprimer l'entrée dupont en utilisant la commande ldapdelete. Les options de ldapdelete sont :

[root@centos6 ~]# ldapdelete --help
ldapdelete: invalid option -- '-'
ldapdelete: unrecognized option --
Delete entries from an LDAP server

usage: ldapdelete [options] [dn]...
	dn: list of DNs to delete. If not given, it will be readed from stdin
	    or from the file specified with "-f file".
Delete Options:
  -c         continuous operation mode (do not stop on errors)
  -f file    read operations from `file'
  -M         enable Manage DSA IT control (-MM to make critical)
  -P version protocol version (default: 3)
  -r         delete recursively
Common options:
  -d level   set LDAP debugging level to `level'
  -D binddn  bind DN
  -e [!]<ext>[=<extparam>] general extensions (! indicates criticality)
             [!]assert=<filter>     (RFC 4528; a RFC 4515 Filter string)
             [!]authzid=<authzid>   (RFC 4370; "dn:<dn>" or "u:<user>")
             [!]chaining[=<resolveBehavior>[/<continuationBehavior>]]
                     one of "chainingPreferred", "chainingRequired",
                     "referralsPreferred", "referralsRequired"
             [!]manageDSAit         (RFC 3296)
             [!]noop
             ppolicy
             [!]postread[=<attrs>]  (RFC 4527; comma-separated attr list)
             [!]preread[=<attrs>]   (RFC 4527; comma-separated attr list)
             [!]relax
             abandon, cancel, ignore (SIGINT sends abandon/cancel,
             or ignores response; if critical, doesn't wait for SIGINT.
             not really controls)
  -h host    LDAP server
  -H URI     LDAP Uniform Resource Identifier(s)
  -I         use SASL Interactive mode
  -n         show what would be done but don't actually do it
  -N         do not use reverse DNS to canonicalize SASL host name
  -O props   SASL security properties
  -o <opt>[=<optparam] general options
             nettimeout=<timeout> (in seconds, or "none" or "max")
  -p port    port on LDAP server
  -Q         use SASL Quiet mode
  -R realm   SASL realm
  -U authcid SASL authentication identity
  -v         run in verbose mode (diagnostics to standard output)
  -V         print version info (-VV only)
  -w passwd  bind password (for simple authentication)
  -W         prompt for bind password
  -x         Simple authentication
  -X authzid SASL authorization identity ("dn:<dn>" or "u:<user>")
  -y file    Read password from file
  -Y mech    SASL mechanism
  -Z         Start TLS request (-ZZ to require successful response)

Saisissez donc la commande suivante :

[root@centos6 tmp]# ldapdelete -x -D "cn=Manager,dc=fenestros,dc=com" -W "cn=dupont,ou=Recherche,ou=France,dc=fenestros,dc=com"
Enter LDAP Password: 

Notez l'absence d'une confirmation de la suppression.

Déconnectez-vous et reconnectez-vous avec Luma. Vous constaterez un résultat similaire à celui-ci :

{{redhat:lx08:luma20.png|}} 

Supprimer maintenant le referral mis en place tout à l'heure :

[root@centos6 tmp]# ldapdelete -x -M -D "cn=Manager,dc=fenestros,dc=com" -W "ou=Informatique,dc=fenestros,dc=com"
Enter LDAP Password: 

A quoi sert l'option -M ?

Création d’une base de données hors ligne

La commande slapadd

Jusqu'à maintenant nous avons apporter des modifications à la base LDAP en ligne, autrement dit pendant que le serveur était en cours de fonctionnement. Il est aussi possible d'apporter des modifications quand le serveur est arrêté. Pour faire ceci, on dispose de la commande slapadd. Les options de la commande slapadd sont :

[root@centos6 ~]# slapadd --help
slapadd: invalid option -- '-'
usage: slapadd [-v] [-d debuglevel] [-f configfile] [-F configdir] [-o <name>[=<value>]] [-c]
	[-g] [-n databasenumber | -b suffix]
	[-l ldiffile] [-j linenumber] [-q] [-u] [-s] [-w]

Créez d'abord le fichier LDIF /tmp/slapadd.ldif et éditez-le ainsi :

dn: cn=dupois,ou=Production,ou=France,dc=fenestros,dc=com
objectClass: inetOrgPerson
objectClass: top
cn: dupois
sn: dupois

Arrêtez maintenant le service slapd :

[root@centos6 tmp]# service slapd stop
Arrêt de slapd :                                           [  OK  ]

Saisissez maintenant la commande suivante :

[root@centos6 tmp]# slapadd -b "dc=fenestros,dc=com" -l /tmp/slapadd.ldif
_#################### 100.00% eta   none elapsed            none fast!         
Closing DB...

Démarrez le service slapd :

[root@centos6 openldap]# service slapd start
Démarrage de slapd :                                       [  OK  ]

Reconnectez-vous avec Luma. Vous constaterez un résultat similaire à celui-ci :

{{redhat:lx08:luma21.png|}} 

Maintenance d’une base de données LDAP

La commande slapcat

La commande slapcat produit un fichier LDIF à partir d'une base de données slapd.

L'exportation ne produit pas un fichier hiérarchique. Pour cette raison, le fichier peut être utilisé par la commande slapadd mais ne peut pas être utilisé par la commande ldapadd.

Les options de cette commande sont :

usage: slapcat [-v] [-d debuglevel] [-f configfile] [-F configdir] [-c]
        [-g] [-n databasenumber | -b suffix] [-l ldiffile] [-a filter]

Saisissez donc les commandes suivantes :

[root@centos6 tmp]# service slapd stop
Arrêt de slapd :                                           [  OK  ]
[root@centos6 tmp]# slapcat -b "dc=fenestros,dc=com" -l /tmp/backup.ldif
[root@centos6 tmp]# cat /tmp/backup.ldif 
dn: dc=fenestros,dc=com
objectClass: dcObject
objectClass: organization
dc: fenestros
o: fenestros.com
description: Exemple
structuralObjectClass: organization
entryUUID: b5efc0fc-6cb1-1033-9919-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171020Z
entryCSN: 20140510171020.464320Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171020Z

dn: cn=Manager,dc=fenestros,dc=com
objectClass: organizationalRole
cn: Manager
description: Gestionnaire
structuralObjectClass: organizationalRole
entryUUID: b5f1ed32-6cb1-1033-991a-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171020Z
entryCSN: 20140510171020.478560Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171020Z

dn: ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: France
structuralObjectClass: organizationalUnit
entryUUID: da8700c4-6cb1-1033-991b-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.853517Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial
structuralObjectClass: organizationalUnit
entryUUID: da8922c8-6cb1-1033-991c-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.867502Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche
structuralObjectClass: organizationalUnit
entryUUID: da8a274a-6cb1-1033-991d-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.874173Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: ou=Production,ou=France,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Production
structuralObjectClass: organizationalUnit
entryUUID: da8a8c4e-6cb1-1033-991e-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.876759Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: ou=Suisse,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Suisse
structuralObjectClass: organizationalUnit
entryUUID: da8aea5e-6cb1-1033-991f-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.879166Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: ou=Commercial,ou=Suisse,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial
structuralObjectClass: organizationalUnit
entryUUID: da8bf9e4-6cb1-1033-9920-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.886122Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: USA
structuralObjectClass: organizationalUnit
entryUUID: da8c8a62-6cb1-1033-9921-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.889815Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: ou=Commercial,ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Commercial
structuralObjectClass: organizationalUnit
entryUUID: da8cb4d8-6cb1-1033-9922-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.890904Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: ou=Recherche,ou=USA,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Recherche
structuralObjectClass: organizationalUnit
entryUUID: da8d09d8-6cb1-1033-9923-a55157702d31
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510171121Z
entryCSN: 20140510171121.893079Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510171121Z

dn: cn=Responsable Personnel,ou=France,dc=fenestros,dc=com
cn: Responsable Personnel
aliasedObjectName: cn=Directeur,ou=France,dc=fenestros,dc=com
objectClass: top
objectClass: alias
objectClass: extensibleObject
structuralObjectClass: alias
entryUUID: f1819abc-6cb3-1033-9f7e-57ef2f3fd768
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510172619Z
entryCSN: 20140510172619.399206Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510172619Z

dn: cn=directeur,ou=France,dc=fenestros,dc=com
objectClass: person
objectClass: top
cn: directeur
sn: Guillaud
telephoneNumber: 12345678
telephoneNumber: 87654321
structuralObjectClass: person
entryUUID: 281f1928-6cb4-1033-9f7f-57ef2f3fd768
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510172751Z
entryCSN: 20140510172751.028311Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510172751Z

dn: ou=Angleterre,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Angleterre
structuralObjectClass: organizationalUnit
entryUUID: 5451fd26-6cb4-1033-9f80-57ef2f3fd768
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510172905Z
entryCSN: 20140510172905.181577Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510172905Z

dn: ou=Sales,ou=Angleterre,dc=fenestros,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Sales
structuralObjectClass: organizationalUnit
entryUUID: 5452e1aa-6cb4-1033-9f81-57ef2f3fd768
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510172905Z
entryCSN: 20140510172905.187435Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510172905Z

dn: cn=Sales Director,ou=Sales,ou=Angleterre,dc=fenestros,dc=com
objectClass: person
objectClass: top
cn: Sales Director
sn: Smith
structuralObjectClass: person
entryUUID: 545637b0-6cb4-1033-9f82-57ef2f3fd768
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510172905Z
entryCSN: 20140510172905.209285Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510172905Z

dn: cn=Sales Manager,cn=Sales Director,ou=Sales,ou=Angleterre,dc=fenestros,dc=
 loc
objectClass: person
objectClass: top
cn: Sales Manager
sn: Brown
structuralObjectClass: person
entryUUID: 5457078a-6cb4-1033-9f83-57ef2f3fd768
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510172905Z
entryCSN: 20140510172905.214614Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510172905Z

dn: cn=mail,ou=Commercial,ou=France,dc=fenestros,dc=com
objectClass: inetOrgPerson
objectClass: person
objectClass: top
cn: mail
mail: info@fenestros.com
sn: info
structuralObjectClass: inetOrgPerson
entryUUID: 9da96d6e-6cb5-1033-9f85-57ef2f3fd768
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510173817Z
entryCSN: 20140510173817.725029Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510173817Z

dn: cn=dupond,ou=Recherche,ou=France,dc=fenestros,dc=com
objectClass: inetOrgPerson
objectClass: top
cn: dupond
sn: dupond
structuralObjectClass: inetOrgPerson
entryUUID: 6d6481be-6cb7-1033-9f87-57ef2f3fd768
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510175115Z
mail: dupond@fenestros.com
entryCSN: 20140510175239.535515Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510175239Z

dn: cn=dupois,ou=Production,ou=France,dc=fenestros,dc=com
objectClass: inetOrgPerson
objectClass: top
cn: dupois
sn: dupois
structuralObjectClass: inetOrgPerson
entryUUID: fb863992-6cb7-1033-9885-d3c28e994865
creatorsName: cn=Manager,dc=fenestros,dc=com
createTimestamp: 20140510175514Z
entryCSN: 20140510175514.193596Z#000000#000#000000
modifiersName: cn=Manager,dc=fenestros,dc=com
modifyTimestamp: 20140510175514Z

La commande slapindex

La commande slapindex crée ou met à jour les index définis pour une base de données slapd.

Les options de cette commande sont :

usage: slapindex [-v] [-d debuglevel] [-f configfile] [-F configdir] [-c]
        [-g] [-n databasenumber | -b suffix] [-q]

Saisissez donc la commande suivante :

[root@centos6 tmp]# slapindex -b "dc=fenestros,dc=com" -v
indexing id=00000001
indexing id=00000002
indexing id=00000003
indexing id=00000004
indexing id=00000005
indexing id=00000006
indexing id=00000007
indexing id=00000008
indexing id=00000009
indexing id=0000000a
indexing id=0000000b
indexing id=0000000c
indexing id=0000000d
indexing id=0000000e
indexing id=0000000f
indexing id=00000010
indexing id=00000011
indexing id=00000013
indexing id=00000015
indexing id=00000016

La commande slapdn

La commande slapdn vérifie la cohérence d'une entrée spécifiée par rapport au(x) schéma(s) défini(s) pour slapd.

Les options de cette commande sont :

usage: slapdn [-v] [-d debuglevel] [-f configfile] [-F configdir]
        [-N | -P] DN [...]

Saisissez donc la commande suivante :

[root@centos6 tmp]# slapdn cn=smith,dc=fenestros,dc=com
DN: <cn=smith,dc=fenestros,dc=com> check succeeded
normalized: <cn=smith,dc=fenestros,dc=com>
pretty:     <cn=smith,dc=fenestros,dc=com>

Saisissez maintenant la commande suivante :

[root@centos6 tmp]# slapdn nom=smith,dc=fenestros,dc=com
DN: <nom=smith,dc=fenestros,dc=com> check failed 21 (Invalid syntax)

La commande slaptest

La commande slaptest vérifie la syntaxe des fichiers de configuration de slapd.

Les options de cette commande sont :

usage: slaptest [-v] [-d debuglevel] [-f configfile] [-F configdir] [-u]

Saisissez donc la commande suivante :

[root@centos6 tmp]# slaptest -u
config file testing succeeded

La commande slapauth

La commande slapauth vérifie la correspondance entre les ID et les DN en fonction des directives authz et authc du fichier de configuration slapd.conf.

Les options de cette commande sont :

usage: slapauth [-v] [-d debuglevel] [-f configfile] [-F configdir]
        [-U authcID] [-X authzID] [-R realm] [-M mech] ID [...]

Saisissez donc la commande suivante :

[root@centos6 tmp]# slapauth -v U smith X u :smith
ID: <U> check succeeded
authcID:     <uid=u,cn=auth>
ID: <smith> check succeeded
authcID:     <uid=smith,cn=auth>
ID: <X> check succeeded
authcID:     <uid=x,cn=auth>
ID: <u> check succeeded
authcID:     <uid=u,cn=auth>
ID: <:smith> check succeeded
authcID:     <uid=:smith,cn=auth>

Démarrez slapd :

[root@centos6 tmp]# service slapd start
Démarrage de slapd :                                       [  OK  ]

LAB #1 - Replication de Serveurs OpenLDAP

Afin d'assurer la répartition de la charge sur plusieurs serveurs, OpenLDAP est capable de mettre en œuvre de ce que l'on appelle la réplication.

Préparation

Créez deux clônes à partir de votre machine virtuelle.

La première doit s'appeler ldap1.fenestros.com et la deuxième ldap2.fenestros.com.

Chaque VM doit avoir une adresse IP fixe. Par exemple :

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
NETMASK=255.255.255.0
IPADDR=10.0.2.15
USERCTL=no
PEERDNS=yes
GATEWAY=10.0.2.2
TYPE=Ethernet
IPV6INIT=no
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
NETMASK=255.255.255.0
IPADDR=10.0.2.16
USERCTL=no
PEERDNS=yes
GATEWAY=10.0.2.2
TYPE=Ethernet
IPV6INIT=no

Dans le fichier /etc/hosts de chaque VM ajoutez les adresses IP et noms de machines :

10.0.2.15      ldap1.fenestros.com
10.0.2.16      ldap2.fenestros.com

Replication

Le mécanisme de réplication syncrepl est basé sur l'architecture de serveurs homologues. Le serveur dit consommateur lance le démon syncrepl dans un thread. Ce dernier contact le serveur fournisseur et charge une première version de l'annuaire. Ensuite il se maintient à jour.

Configuration du serveur fournisseur

La configuration du serveur fournisseur se fait dans le fichier slapd.conf. L'exemple suivant démontre l'essentiel des directives à utiliser :

moduleload syncprov.la
overlay syncprov
syncprov-checkpoint 100 10
Directive Description
moduleload Sert à charger le module syncprov.
overlay Appel du module syncprov.
syncprov-checkpoint Un checkpoint est créé après chaque 100 modifications ou 10 minutes.

Configuration du serveur consommateur

La configuration du serveur consommateur se fait dans le fichier slapd.conf. L'exemple suivant démontre les directives à utiliser :

syncrepl rid=123
    provider=ldap://10.0.2.15:389
    type=refreshAndPersist
    interval=00:00:00:10
    retry="5 10 60 +"
    searchbase="dc=fenestros,dc=com"
    bindmethod=simple
    binddn="cn=Manager,dc=fenestros,dc=com"
    credentials=fenestros
updateref ldap://10.0.2.15
Directive Description
rid L'identifiant unique du consommateur.
provider Le serveur à répliquer.
type Deux modes sont possibles : le mode “refreshOnly” ou le consommateur initie une connexion à intervalle régulier avec le fournisseur. Toutes les modifications survenues depuis la dernière connexion sont répliquées sur le serveur consommateur. Le mode “refreshAndPersist” ou le consommateur initie une connexion avec le fournisseur pour la première synchronisation, puis garde la connexion ouverte de sorte que toute modification intervenant sur le fournisseur soit immédiatement répliquée sur le consommateur.
interval Définition de l’interval de réplication au format “jj:hh:mm:ss”
retry Définition du comportement à adopter en cas d’erreur de synchronisation. Ici, l’esclave tentera de ce reconnecter au maitre toutes les 5 secondes les 10 premières tentatives, ensuite il ré essayera toutes les 60 secondes indéfiniment (“+”). En remplacent le “+” par une valeur “N”, le consumer effectuera “N” tentative espacées de 60 secondes.
searchbase Définition de la branche à répliquer.
bindmethod Type d’authentification (simple ou sasl).
binddn Définition de l’utilisateur effectuant la réplication.
credentials Mot de passe associé avec le binddn.

Mise en place

La mise en place comporte plusieurs phases :

LAB #2 - Authentification Apache en utilisant OpenLDAP

Arrêtez le serveur slapd :

[root@centos6 ~]# service slapd stop
Arrêt de slapd :                                           [  OK  ]

Créez le répertoire /var/lib/ldap/fenestros pour contenir un nouveau base de données :

[root@centos6 ~]# mkdir /var/lib/ldap/fenestros

Nettoyez les anciens fichiers de configuration et fichiers de données :

[root@centos6 ~]# rm -Rf /etc/openldap/slapd.d/*
[root@centos6 ~]# rm -f /var/lib/ldap/alock
[root@centos6 ~]# rm -f /var/lib/ldap/__db.00?

Créez le fichier /etc/openldap/slapd.conf :

[root@centos6 ~]# touch /etc/openldap/slapd.conf

Editez le fichier /etc/openldap/slapd.conf ainsi :

/etc/openldap/slapd.conf
include		/etc/openldap/schema/corba.schema
include		/etc/openldap/schema/core.schema
include		/etc/openldap/schema/cosine.schema
include		/etc/openldap/schema/duaconf.schema
include		/etc/openldap/schema/dyngroup.schema
include		/etc/openldap/schema/inetorgperson.schema
include		/etc/openldap/schema/java.schema
include		/etc/openldap/schema/misc.schema
include		/etc/openldap/schema/nis.schema
include		/etc/openldap/schema/openldap.schema
include		/etc/openldap/schema/ppolicy.schema
include		/etc/openldap/schema/collective.schema
 
allow bind_v2
 
pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args
 
TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password
 
database config
access to *
	by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
	by * none
 
database monitor
access to *
	by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
        by dn.exact="cn=Admin,o=fenestros" read
        by * none
 
###############################################
 
database	bdb
suffix		"o=fenestros"
checkpoint      1024 15
rootdn		"cn=Admin,o=fenestros"
rootpw          
directory	/var/lib/ldap/fenestros
lastmod         on
index           cn,sn,st		eq,pres,sub

Créez un mot de passe crypté pour l'admistrateur LDAP :

[root@centos6 ~]# slappasswd -s fenestros
{SSHA}C7ieZyzD/uvgaIOca3iukkwYUfl3TRB2

Editez ensuite la section database du fichier /etc/openldap/slapd.conf :

...
database        bdb
suffix          "o=fenestros"
checkpoint      1024 15
rootdn          "cn=Admin,o=fenestros"
rootpw          {SSHA}C7ieZyzD/uvgaIOca3iukkwYUfl3TRB2
directory       /var/lib/ldap/fenestros
lastmod         on
index           cn,sn,st                eq,pres,sub

Initialisez la première base de données :

[root@centos6 ~]# echo “” | slapadd -f /etc/openldap/slapd.conf
The first database does not allow slapadd; using the first available one (2)
str2entry: entry -1 has no dn
slapadd: could not parse entry (line=1)

Initialisez ensuite l'arborescence dans /etc/openldap/slapd.d :

[root@centos6 ~]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
config file testing succeeded

Vérifiez que l'arborescence initiale soit créée :

[root@centos6 ~]# ls -l /etc/openldap/slapd.d
total 8
drwxr-x---. 3 root root 4096  8 sept. 18:25 cn=config
-rw-------. 1 root root 1127  8 sept. 18:25 cn=config.ldif

Modifiez le propriétaire, le groupe ainsi que le droits du répertoire /etc/openldap/slapd.d :

[root@centos6 ~]# chown -R ldap:ldap /etc/openldap/slapd.d
[root@centos6 ~]# chmod -R u+rwX /etc/openldap/slapd.d

Modifiez le propriétaire et le groupe répertoire /var/lib/ldap/fenestros ainsi que le fichier /etc/openldap/slapd.conf :

[root@centos6 ~]# chown -R ldap:ldap /var/lib/ldap/fenestros /etc/openldap/slapd.conf

Copiez le fichier /usr/share/openldap-servers/DB_CONFIG.example vers /var/lib/ldap/DB_CONFIG :

[root@centos6 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/fenestros/DB_CONFIG

Démarrez ensuite le service slapd :

[root@centos6 ~]# service slapd start
Démarrage de slapd :                                       [  OK  ]

Créez le fichier fenestros.ldif :

dn: o=fenestros
objectClass: top
objectClass: organization
o: fenestros
description: LDAP Authentification
 
dn: cn=Admin,o=fenestros
objectClass: organizationalRole
cn: Admin
description: Administrateur LDAP
 
dn: ou=GroupA,o=fenestros
ou: GroupA
objectClass: top
objectClass: organizationalUnit
description: Membres de GroupA
 
dn: ou=GroupB,o=fenestros
ou: GroupB
objectClass: top
objectClass: organizationalUnit
description: Membres de GroupB
 
dn: ou=group,o=fenestros
ou: group
objectclass: organizationalUnit
objectclass: domainRelatedObject
associatedDomain: fenestros
 
dn: cn=users,ou=group,o=fenestros
cn: users
objectClass: top
objectClass: posixGroup
gidNumber: 100
memberUid: jean
memberUid: jacques
 
dn: cn=Jean Legrand,ou=GroupA,o=fenestros
ou: GroupA
o: fenestros
cn: Jean Legrand
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: top
mail: jean.legrand@fenestros.com
givenname: Jean
sn: Legrand
uid: jean
uidNumber: 1001
gidNumber: 100
gecos: Jean Legrand
loginShell: /bin/bash
homeDirectory: /home/jean
shadowLastChange: 14368
shadowMin: 0
shadowMax: 999999
shadowWarning: 7
userPassword: secret1
homePostalAddress: 99 avenue de Linux, 75000 Paris
postalAddress: 99 avenue de Linux.
l: Paris
st: 75
postalcode: 75000
telephoneNumber: 01.10.20.30.40
homePhone: 01.50.60.70.80
facsimileTelephoneNumber: 01.99.99.99.99
title: Ingénieur
 
dn: cn=Jacques Lebeau,ou=GroupA,o=fenestros
ou: GroupA
o: fenestros
cn: Jacques Lebeau
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: top
mail: jacques.lebeau@fenestros.com
givenname: Jacques
sn: Lebeau
uid: jacques
uidNumber: 1002
gidNumber: 100
gecos: Jacques Lebeau
loginShell: /bin/bash
homeDirectory: /home/jacques
shadowLastChange: 14365
shadowMin: 0
shadowMax: 999999
shadowWarning: 7
userPassword: secret2
initials: JL
homePostalAddress: 99 route d'Unix, 75000 Paris
postalAddress: 99 route d'Unix.
l: Paris
st: 75
postalcode: 75000
pager: 01.04.04.04.04
homePhone: 01.05.05.05.05
telephoneNumber: 01.06.06.06.06
mobile: 06.01.02.03.04
title: Technicienne
facsimileTelephoneNumber: 01.04.09.09.09
manager: cn=Jean Legrand,ou=GroupA,o=fenestros

Injectez le fichier fenestros.ldif dans OpenLDAP :

[root@centos6 ~]# ldapadd -f fenestros.ldif -xv -D "cn=Admin,o=fenestros" -h 127.0.0.1 -w fenestros
ldap_initialize( ldap://127.0.0.1 )
add objectClass:
	top
	organization
add o:
	fenestros
add description:
	LDAP Authentification
adding new entry "o=fenestros"
modify complete

add objectClass:
	organizationalRole
add cn:
	Admin
add description:
	Administrateur LDAP
adding new entry "cn=Admin,o=fenestros"
modify complete

add ou:
	GroupA
add objectClass:
	top
	organizationalUnit
add description:
	Membres de GroupA
adding new entry "ou=GroupA,o=fenestros"
modify complete

add ou:
	GroupB
add objectClass:
	top
	organizationalUnit
add description:
	Membres de GroupB
adding new entry "ou=GroupB,o=fenestros"
modify complete

add ou:
	group
add objectclass:
	organizationalUnit
	domainRelatedObject
add associatedDomain:
	fenestros
adding new entry "ou=group,o=fenestros"
modify complete

add cn:
	users
add objectClass:
	top
	posixGroup
add gidNumber:
	100
add memberUid:
	jean
	jacques
adding new entry "cn=users,ou=group,o=fenestros"
modify complete

add ou:
	GroupA
add o:
	fenestros
add cn:
	Jean Legrand
add objectClass:
	person
	organizationalPerson
	inetOrgPerson
	posixAccount
	shadowAccount
	top
add mail:
	jean.legrand@fenestros.com
add givenname:
	Jean
add sn:
	Legrand
add uid:
	jean
add uidNumber:
	1001
add gidNumber:
	100
add gecos:
	Jean Legrand
add loginShell:
	/bin/bash
add homeDirectory:
	/home/jean
add shadowLastChange:
	14368
add shadowMin:
	0
add shadowMax:
	999999
add shadowWarning:
	7
add userPassword:
	secret1
add homePostalAddress:
	99 avenue de Linux, 75000 Paris
add postalAddress:
	99 avenue de Linux.
add l:
	Paris
add st:
	75
add postalcode:
	75000
add telephoneNumber:
	01.10.20.30.40
add homePhone:
	01.50.60.70.80
add facsimileTelephoneNumber:
	01.99.99.99.99
add title:
	NOT ASCII (10 bytes)
adding new entry "cn=Jean Legrand,ou=GroupA,o=fenestros"
modify complete

add ou:
	GroupA
add o:
	fenestros
add cn:
	Jacques Lebeau
add objectClass:
	person
	organizationalPerson
	inetOrgPerson
	posixAccount
	shadowAccount
	top
add mail:
	jacques.lebeau@fenestros.com
add givenname:
	Jacques
add sn:
	Lebeau
add uid:
	jacques
add uidNumber:
	1002
add gidNumber:
	100
add gecos:
	Jacques Lebeau
add loginShell:
	/bin/bash
add homeDirectory:
	/home/jacques
add shadowLastChange:
	14365
add shadowMin:
	0
add shadowMax:
	999999
add shadowWarning:
	7
add userPassword:
	secret2
add initials:
	JL
add homePostalAddress:
	99 route d'Unix, 75000 Paris
add postalAddress:
	99 route d'Unix.
add l:
	Paris
add st:
	75
add postalcode:
	75000
add pager:
	01.04.04.04.04
add homePhone:
	01.05.05.05.05
add telephoneNumber:
	01.06.06.06.06
add mobile:
	06.01.02.03.04
add title:
	Technicienne
add facsimileTelephoneNumber:
	01.04.09.09.09
add manager:
	cn=Jean Legrand,ou=GroupA,o=fenestros
adding new entry "cn=Jacques Lebeau,ou=GroupA,o=fenestros"
modify complete

Arrêtez le serveur Apache :

[root@centos6 ~]# service httpd stop
Arrêt de httpd :                                           [  OK  ]

Editez la section <Directory ”/var/www/html“> du fichier /etc/httpd/conf/httpd.conf :

...
<Directory "/var/www/html">
   AuthType Basic
   AuthName "Bienvenue : Connectez-vous avec votre nom d'utilisateur"
   AuthBasicProvider ldap
   AuthzLDAPAuthoritative on
   AuthLDAPURL ldap://localhost:389/o=fenestros?uid?sub
   AuthLDAPBindDN "cn=Admin,o=fenestros"
   AuthLDAPBindPassword fenestros
   require ldap-user jean jacques
   AllowOverride None
   Options Indexes FollowSymLinks
</Directory>
...

Démarrez le serveur apache :

[root@centos6 ~]# service httpd start
Démarrage de httpd :                                       [  OK  ]

Connectez-vous à http://localhost en utilisant le compte de jean puis le compte de jacques.


<html>

Copyright © 2004-2017 I2TCH LIMITED.<br><br>

</html>