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.