Mise en service d’un serveur LDAP  
 

 

Pré-requis
Introduction
1 - Installation de la BerkeleyDB
2 - Installation d’OpenSSL
3 - Installation d’OpenLDAP
4 - Paramétrage de syslogd
5 - Configuration d’OpenLDAP
6 - Structure de l’annuaire
7 - Jxplorer
8 - Réplication des données
9 - Restauration de la base de données
10 - Mise en place de scripts pour le lancement automatique des démons
Annexe


Pré-requis :

OpenSSL
BerkeleyDB

Introduction

Cette installation a été réalisée une Red Hat Entreprise 9.0.
Il est conseillé d’utiliser la dernière version de la BerkeleyDB afin d’éliminer les risques d’incompatibilité.

1 - Installation de la BerkeleyDB

Nous avons utilisé la version 4.2.52.
Il suffit de télécharger le fichier en tar.gz et d’entrer les commandes suivantes :

Tar xvzf (afin de décompresser l’archive dans le répertoire)
Cd db-4.2.52
Cd build_unix
./configure		-> prépare les fichiers nécessaires à la compilation
make			-> compile les fichiers du programme
make install		-> exécute les instructions nécessaires à l’installation du programme

2 - Installation d’OpenSSL

Il suffit aussi de télécharger la dernière version d’OpenSSL et de décompresser le fichier .tgz.
L’installation se déroule de la manière suivante :

Tar xvzf openssl-0.9.9d.tar.gz
Cd openssl-0.9.9d.tar.gz
./configure
make 
make test		-> teste le logiciel avant l’installation
make install

3 - Installation d’OpenLDAP

Il faut télécharger la dernière version d’OpenLDAP sur www.openldap.org (dans notre cas la version 2.18) et la décompresser pour procéder à l’installation.

Tar xvzf openldap.2.18
Cd openldap.2.18
env CPPFLAGS="-I/usr/local/BerkeleyDB.4.2/include/ -I/usr/local/ssl/include/ -I\
/usr/local/include/" LDFLAGS="-L/usr/local/ssl/openssl/ -L/usr/local/BerkeleyDB\
.4.2/lib/ -L/usr/local/lib -L/usr/local/lib/sasl2" LIBS="-lssl -lcrypt -lsasl2"\
 ./configure --enable-debug --with-tls --without-cyrus-sasl --enable-bdb
make depend				-> prépare les dépendances à la compilation
make
make test
make install

Une modification s’impose dans le fichier lapd.so.conf
Il faut ajouter la ligne :

/usr/local/db-4.2.52/build_unix/*.libs	-> chemin d’accès de la libraire de la base de données

OpenLDAP est désormais installé…il serait judicieux d’observer avec attention le lancement du démon slapd afin de pouvoir diagnostiquer les problèmes éventuels.
Nous allons donc paramétrer syslogd afin d’obtenir un fichier de log à chaque démarrage/arrêt du démon.

4 - Paramétrage de syslogd

Le fichier de configuration a pour chemin d’accès :

/etc/syslog.conf

Il suffit de rajouter ces deux lignes à la fin du fichier

#Log pour LDAP
local4.*       /var/log/ldap.log

Il faut ensuite arrêter le démon syslogd et le relancer…ainsi qu’à chaque modification du fichier de configuration bien sûr.
Pour relancer ce dernier il faut exécuter la commande :

syslogd –h

Syslogd est désormais paramétrer et il ne nous reste plus qu’à modifier le fichier de configuration d’OpenLDAP.

5 - Configuration d’OpenLDAP

Le fichier de configuration d’OpenLDAP est slapd.conf.
Dans notre cas, il se trouve dans /usr/local/etc/openldap/.

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

Dans le cadre du projet de déploiement de Supann, nous avons intégrer les schémas internet2 et Supann à l’annuaire.

loglevel -1

Cette annotation permet de logger tous les événements survenus (aussi bien les interrogations de la base que son démarrage).

suffix          "dc=example,dc=fr"
rootdn          "cn=Manager,dc=example,dc=fr"

Il faut renseigner le fichier pour le suffixe de l’arborescence et le responsable de la base de données (dans notre cas, c’est Manager).

password-hash   {MD5}
rootpw         	     {MD5}

Afin de sécuriser le mot de passe du responsable de l’annuaire, nous avons crypté ce dernier en MD5.

Afin de crypter celui-ci, il suffit d’exécuter les commandes suivantes afin d’obtenir un prompt qui cryptera le mot de passe que vous taperez :

Slappasswd –c –v –h {MD5}

Afin de renforcer la sécurité de l’annuaire, nous avons utilisé différents certificats de sécurité :
Le premier certificat (ac-serveur.crt) est un certificat de sécurité délivré par le CRU (faisant ici office d’autorité de certification).

TLSCACertificate /usr/local/var/openldap-data/ac-serveur.crt

Nous utilisons un certificat public pour le serveur

TLSCertificateFile /usr/local/var/openldap-data/ldap.exemple.fr.crt

La directive suivante indique le chemin d’accès de la clé qui vérifie l’authenticité du certificat ldap.ensait.fr.crt

TLSCertificateKeyFile /usr/local/var/openldap-data/ldap.exemple.fr.key

Notre serveur est désormais sécurisé, il nous faut désormais ajouter les entrées dans l’annuaire grâce à des fichiers LDIF.

6 - Structure de l’annuaire

Notre service d’annuaire est désormais installé et il faut le lancer. Pour cela, il faut utiliser la commande suivante :

/usr/local/libexec/slapd –h « ldaps:/// ldap://127.0.0.1 »

Il faut ensuite rédiger un fichier de structure et l’ajouter à l’annuaire.

Le fichier, creation_ldap.ldif est le suivant :

dn: dc=exemple,dc=fr
objectclass: dcObject
objectclass: organization
o: exemple
dc: exemple
description: Notre exemple

dn: ou=Group,dc=exemple,dc=fr
ou: Group
objectclass: top
objectclass: organizationalUnit
description: Groupes des utilisateurs identifies par ldap

dn: ou=People,dc=exemple,dc=fr
ou: People
objectclass: top
objectclass: organizationalUnit
description: Utilisateurs identifies par ldap

Il faut ensuite exécuter la commande suivante afin de l’entrer dans l’annuaire :

ldapadd –x –D « cn=Manager,dc=exemple,dc=fr » -W –f /usr/local/openldap-2-2-18/creation_ldap.ldif

On peut utiliser cette commande pour modifier l’annuaire.
Par exemple, avec le fichier ok.ldif suivant :

dn: uid=essai,ou=People,dc=exemple,dc=fr
changetype: delete

En exécutant, la commande ci-dessous, on supprime l’entrée de l’annuaire.

ldapmodify –x –D « cn=Manager,dc=exemple,dc=fr » -W –f /usr/local/openldap-2-2-18/ok.ldif

On peut désormais utiliser un browser LDAP pour avoir un affichage de la structure de l’annuaire et des entrées de celui-ci.

Nous utiliserons JXplorer.

7 - Jxplorer

Pour commencer, il nous faut indiquer à notre browser LDAP que nous referons au CRU afin de savoir si le serveur LDAP auquel nous nous connectons est valide.

Pour cela, nous devons installons le certificat ac-serveur du CRU dans les « Serveurs Trusted et CAs ».

Il faut ensuite renseigner les champs hôte, port, le protocole utilisé, le nom de l’annuaire (base DN) et bien entendu les informations de sécurité (niveau de sécurité, login et password).

Le port 636 est utilisé pour interroger le serveur d’annuaire via une connexion SSL.

8 - Réplication des données

Afin de préparer une architecture de haute disponibilité pour notre service d’annuaire, nous devons déjà assurer la réplication des données selon un modèle maître/esclave.

Pour cela, il faut créer un compte de réplication sur les deux serveurs et lui allouer des droits en écriture sur l’annuaire.

Il nous faut pour cela éditer les fichiers de configuration des serveurs de la manière suivante :

Sur le serveur maître :

access to *
        …
        by dn="cn=replica,dc=exemple,dc=fr" write
        …

#replication vers le serveur esclave 
replogfile /var/lib/ldap/replica/replication.log
replica host=:389
 binddn="cn=replica,dc=exemple,dc=fr"
 bindmethod=simple credentials=

Sur le serveur esclave :

access to *
        …
        by dn="cn=replica,dc=exemple,dc=fr" write
        …

#replication depuis le serveur maitre 
updatedn "cn=replica,dc=exemple,dc=fr"
updateref "ldap://:389"

Pour vérifier le bon déroulement de la réplication, il est conseillé de lancer slapd sur le serveur maître puis sur le serveur esclave. On peut lancer slurpd sur le serveur maître, dans une session ssh de la manière suivante :

/usr/local/libexec/slurpd –d 65635

Ce niveau de debugging nous permet d’observer tous les événements survenu lors de la réplication (ouverture de socket, écriture,…).

Dans notre cas la réplication s’effectue en clair, le mot de passe est diffusée sur le réseau alors il faut mieux la crypter.

9 - Restauration de la base de données

Il se peut que la base de données soit endommagée après un certain nombre de manipulations, le service slapd ne se lance alors plus.

Pour remédier à cela, il convient d’assurer une sauvegarde de cette dernière.

Il faut ensuite exporter la base de données sauvegardée et exécuter un db_recover afin de la restaurer correctement.

10 - Mise en place de scripts pour le lancement automatique des démons

Afin de relancer les démons slapd et slurpd en cas de redémarrage des serveurs, il est nécessaire d’écrire quelques scripts qui nous simplifieront la vie.

Sur le serveur maître, il faut placer les scripts slapd et slurpd dans /etc/init.d mais aussi les rendre exécutable grâce à la commande chmod +x slapd.

Votre script est désormais exécutable et il ne reste plus qu’à l’ajouter à la base des services gérée par chkconfig. Pour cela, il faut faire la commande suivante :

chkconfig –add slapd

Vous n’avez plus qu’à faire de même pour le script slapd sur le serveur esclave.

Vous trouverez les deux scripts en annexe.

Annexe

Fichier de configuration slapd.conf

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/internet2.schema
include         /usr/local/etc/openldap/schema/supann.schema
include         /usr/local/etc/openldap/schema/nis.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral       ldap://root.openldap.org


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

loglevel -1

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

# 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 dn.base= by * read
access to * by * read

# access to *
#       by self write
#       by users read
#       by anonymous auth

access to attr=userPassword
        by self write
        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!

#######################################################################
# BDB database definitions
#######################################################################

database        bdb
suffix          "dc=exemple,dc=fr"
rootdn          "cn=Manager,dc=exemple,dc=fr"
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
password-hash   {MD5}
rootpw          {MD5}

# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory       /usr/local/var/openldap-data
# Indices to maintain
index   objectClass     eq

TLSCACertificate /usr/local/var/openldap-data/ac-serveur.crt
TLSCertificateFile /usr/local/var/openldap-data/ldap.exemple.fr.crt
TLSCertificateKeyFile /usr/local/var/openldap-data/ldap.exemple.fr.key
#TLSCipherSuite HIGH:MEDIUM:+SSLv2
#TLSVerifyClient never

Fichier ajoutdubreu.ldif

dn: uid=essai, ou=People, dc=exemple, dc=fr
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: supannPerson
objectClass: eduPerson
sn: Dubreu
givenName: Vincent
cn: Dubreu Vincent
displayName: dudule
uid: dubreuv
mail: example@exemple.fr
userPassword: truc
postalAddress: 3 rue marchin$59000 lille
preferredLanguage: fr
telephoneNumber: +33 3 33 33 33 33
facsimileTelephoneNumber: +33 3 33 33 33 33
mobile: +33 6 33 33 33 33
eduPersonAffiliation: faculty member
eduPersonPrimaryAffiliation: faculty
eduPersonNickname: nickname
eduPersonPrincipalName: example@exemple.fr
supannAliasLogin: nickname
supannOrganisme: achanger
supannCivilite: M.
supannRole: RSSI GROUPE-LOGICIEL
supannListeRouge: FALSE
supannAutreTelephone: +33 3 33 33 33 33
supannAffectation: cuisine
supannEmpId: 1234
supannCodeINE: 1234

Script bash pour slapd

#!/bin/bash
#
#description: lancement de slapd
#chkconfig: 345 99 0
#
#source function library
. /etc/init.d/functions

case $1 in
    'start')
    [ -f /var/lock/subsys/slapd ] &&
    exit 0
    echo -n "lancement de slapd"
    daemon /usr/local/libexec/slapd -h "ldaps:/// ldap:///"
    echo
    touch /var/lock/subsys/slapd
    ;;
'stop')
echo -n "arrêt de slapd"
killproc slapd
echo
rm -f /var/lock/subsys/slapd
 ;;
'restart')
$0 stop
$0 start
 ;;
'status')
status slapd
 ;;
*)
echo "usage : slapd \
 {start|stop|restart|status}"
exit 1
 ;;
esac
exit 0

Script bash pour slurpd

#!/bin/bash
#
#description: lancement de slurpd
#chkconfig: 345 99 0
#
#source function library
. /etc/init.d/functions

case $1 in
    'start')
    [ -f /var/lock/subsys/slurpd ] &&
    exit 0
    echo -n "lancement de slurpd"
    daemon /usr/local/libexec/slurpd
    echo
    touch /var/lock/subsys/slurpd
    ;;
'stop')
echo -n "arrêt de slurpd"
killproc slurpd
echo
rm -f /var/lock/subsys/slurpd
 ;;
'restart')
$0 stop
$0 start
 ;;
'status')
status slurpd
 ;;
*)
echo "usage : slurpd \
 {start|stop|restart|status}"
exit 1
 ;;
esac
exit 0

Plug'n - 11/2004
 

-= From guill.net =-