Installation d'OpenLDAP

Le but est d'installer et configurer un serveur LDAP pour que l'authentification des utilisateurs sur les machines GNU/Linux. On va installer un serveur minimal et créer un utilisateur.

Pour avoir plus d'informations sur le protocole LDAP voir la page de wikipedia sur LDAP, la page de wikipedia sur OpenLDAP et a page de wikipedia sur le format LDIF.

Installation des paquets

L'installation du serveur LDAP passe par le paquet slapd, cependant la base de données utilisée est sleepycat, il faut mieux installer les utilitaires associés. Pendant l'installation les réponses aux questions ne sont pas importantes puisqu'on va écraser les fichiers de configuration.

apt-get install slapd db4.2-util

Configuration

Toute la configuration de OpenLDAP passe par le fichier /etc/ldap/slapd.conf :

allow bind_v2
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

# verification que les entrees respectent les normes
schemacheck     on
# permet de renvoyer toutes les entrees qui correspondent a une recherche
sizelimit       unlimited

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

# le niveau 256 permet de logger les connexions et les requetes
# utile pour le debugage, sinon mettre 0 pour la production
loglevel        256

# Loading of backend modules - automatically generated
modulepath      /usr/lib/ldap
moduleload      back_bdb

backend         bdb

# indique les fichiers pour le TLS (authorité de certification,
# certificat du serveur, clé privé du serveur)
TLSCACertificateFile /etc/ldap/ssl-tls/cacert.pem
TLSCertificateFile /etc/ldap/ssl-tls/servercrt.pem
TLSCertificateKeyFile /etc/ldap/ssl-tls/serverkey.pem

# nom de la base de donnée
database        authentification

suffix          "dc=example,dc=com"
rootdn          "cn=admin,dc=example,dc=com"

# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
#
# generer avec : slappasswd -s mot_de_passe
# slappasswd est un utilitaire uniquement utilisable par root
password-hash   SSHA
rootpw          {SSHA}zQywC32BmCPj15Wpa2UMskrK16Pdd5Q2
#rootpw         supermotdepassesecret

# 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"

# indique si le serveur doit maintenir la date de dernière
# modification pour chaque entrée. Desactiver pour augmenter
# les performances
lastmod         off

# taille du cache en nombre d'entrées
cachesize       1000

# index à maintenir
# eq : equalité
# sub : sous chaine
# pres: presence/absence
index   objectClass,uidNumber,gidNumber eq
index   uid,cn,sn,givenName     pres,sub,eq

# les acl permettent de proteger certains attributs ou certaine branches
access to attrs=userPassword
        by self write
        by anonymous auth
        by dn.base="cn=admin,dc=example,dc=com" write
        by * none

access to *
        by dn="cn=admin,dc=univ-lehavre,dc=fr" write
        by * read

Le fichier ne doit être lisible que par root :

chmod 600 /etc/ldap/slapd.conf

Redirection des logs du démon slapd de syslog vers slapd.log

Si on laisse la configuration par défaut, le démon slapd journalise dans syslog, donc on ne fait plus la difference dans les messages, surtout si on a configuré un fort taux de log. Pour que syslog envoi le contenu vers un fichier à part il faut éditer le fichier /etc/syslog.conf :

# modification
*.*;local4,auth,authpriv.none   -/var/log/syslog
# ajout
local4.*            -/var/log/slapd.log

Gestion des logs binaires de BDB

Le backend qui gère la base LDAP est BDB, son fonctionnement produit des fichiers de logs qui s'accumulent sur le disque. Il contiennent les transactions (ajout/suppression) qui ont été effectuées sur l'annuaire. Par défaut chaque fichier fait 10 Mo et ils ne sont pas effacés. En quelques jours un arrive très vite à 1 Go.

Pour palier ce problème, il existe des utilitaires et un fichier de configuration. La documentation du paquet Debian est claire :

With libdb4.2 and previous versions, and thus with slapd 2.2, it is VERY IMPORTANT to correctly setup a DB_CONFIG file. It is not just a matter of performance: depending on the version of slapd and libdb being used, your slapd may just hang and stop answering queries.

Le fichier de configuration se nomme DB_CONFIG et doit être placé dans le repertoire où se situe la base LDAP (/var/lib/ldap). Son contenu doit ressembler à ceci :

set_cachesize   0       52428800        0
set_flags DB_LOG_AUTOREMOVE
set_lg_bsize    1048576
set_lg_dir /var/lib/ldap/
set_lk_max_objects      5000
set_lk_max_locks        5000
set_lk_max_lockers      5000

Les lignes importantes sont les trois première. On place un cache en mémoire de 50 Mo qui contiendra les données les plus utilisées de l'annuaire. Le flag DB_LOG_AUTOREMOVE indique que les fichiers de log doivent être supprimés dès qu'ils ne sont plus nécessaires (c'est-à-dire plus impliqués dans une transaction active). Le troisième indique la taille unitaire des fichiers de log (10 Mo).

Les utilitaires pour gérer une base BDB sont installés avec le paquet db4.2-util. Voici un petit descriptif des commandes utiles, pour de plus amples informations voir [http://www.sleepycat.com/docs/utility/] :

  • db4.2_stat -m : donne une indication de l'usage du cache (plus le pourcentage est elevé mieux c'est)
  • db4.2_stat -t : donne la liste des fichiers de log concerné par une transaction active
  • db4.2_archive -d : efface les fichiers de log inutiles, mais ne produit aucun affichage... à coupler avec un ls

Optimistation des écritures

Il peut être judicieux de supprimer la mise à jour de la date d'accès sur la partition /var. Pour cela editez le fichier /etc/fstab et ajouter l'option noatime à la ligne de /var :

/dev/sda6       /var            ext3    defaults,noatime        0       2

Pour remonter le système de fichier sans redémarrer :

% mount -o remount /var

Initialisation de la base

L'étape la plus compliquée est de produire le squelette de la base dans lequel viendront s'insérer les utilisateurs. Heureusement cette opération n'est à réaliser qu'une seule fois.

Le LDAP étant une structure arborescente, on aura une racine (dc=example,dc=com), une branche où stocker les utilisateurs (ou=people) et les feuilles qui seront les utilisateurs (uid=toto). On ajoutera également le compte de l'administrateur comme défini dans le fichier de configuration.

On va utiliser un fichier au format LDIF pour insérer chacun des éléments dans le serveur LDAP.

Création du squelette

Le format LDIF impose que :

  • les enregistrements dans un fichiers soient séparés par une ligne vide
  • la première ligne contienne le dn (distinguish name) de l'entrée
  • le fichier se termine par 2 lignes vides

Dans notre LDIF nous aurons trois parties : la racine, la branche people et le compte de l'administrateur.

dn: dc=example,dc=com
dc: example.com
description: Organisation example
objectClass: dcObject
objectClass: organization
o: Organisation example

dn: ou=people,dc=example,dc=com
ou: people
objectClass: organizationalUnit

dn: cn=admin,dc=example,dc=com
description: Administrateur LDAP
objectClass: organizationalRole
cn: admin

Le compte de l'administrateur n'a pas de mot de passe dans la base LDAP, il est défini dans le fichier de configuration.

Pour insérer les données, on utilise la commande slapadd :

/etc/init.d/slapd restart
# pour créer les fichiers de la base de données

/etc/init.d/slapd stop
# pour l'insertion en ligne de commande on doit éteindre le service
# pour éviter les modifications "distante"

/usr/sbin/slapadd -l squelette.ldif -f /etc/ldap/slapd.conf
# import à partir du fichier ldif

/etc/init.d/slapd start

Si tout c'est bien passé, la base est prête à être utilisée.

Ajout d'un utilisateur

L'étape suivante consiste à insérer un utilisateur pour nous en servir pour l'authentification. On créé un utilisateur lambda avec peu d'informations :

dn: uid=toto,ou=people,dc=dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: toto
cn: John Doe
sn: Doe
uidNumber: 2000
gidNumber: 100
homeDirectory: /home/ldap/toto
userPassword: {MD5}9WykxdwZMl/jJjQWik9Ntg####

Le mot de passe est générer grâce à la commande :

slappasswd -s supermotdepassesecret -h \{MD5\}

L'utilisateur aura le numéro 2000 sur le système, il appartiendra au groupe 100 et son login sera toto.

Tests

Pour tester la connexion de l'utilisateur sur la machine cliente, il faut mettre en oeuvre la documentation pour les clients LDAP.