LDAP

LDAP jpp

Nous sommes plusieurs à la maison à travailler sur des machines différentes et régulièrement l'un demande à l'autre : "peux-tu me donner le mail (ou le téléphone) de X" (phénomène identique dans une petite structure professionnelle). 
Il est donc intéressant de disposer d'un annuaire centralisé contenant l'ensemble des données de nos contacts. 
J'ai donc décidé de créer un annuaire partagé et LDAP a été choisi comme outil car:

  • C'est sa spécialité "Lightweight Directory Access Protocol" ou Protocole Simple de Gestion d'Annuaire
  • Il est interfacé avec la plupart des gestionnaires de mail.
  • Il est réputé pour être économe en moyens mémoire et CPU.

LDAP : Linux

LDAP : Linux jpp

Pour créer cet annuaire il faut installer des "paquets" suivants (pour Debian) :

  1. slapd  (le démon)
  2. ldap-utils

La structure de notre annuaire sera simple :

  • un "TOP" pour notre domaine "mondomaine.net"
  • Une branche "users" pour stocker les utilisateurs enregistrés (accès à l'annuaire)
  1. Un utilisateur "manager" : qui gère, entre autres les utilisateurs et qui peut effectuer des mises à jour.
  2. Un utilisateur  "totor" : standard pour les accès en lecture seule
  3. Le cas de l'utilisateur "propriétaire" : root (propriétaire de la base de données) est traité lors de la création de la base, il ne doit en général pas être utilisé. Son mot de passe doit donc rester secret ! 
     

Le fichier slapd.conf ne doit pas être lisible par tous : 
-rw-r-----   1 root openldap  3676 2010-01-26 20:29 slapd.conf 
S'il n'est pas correct le remettre "au secret" par : 

chown root:openldap slapd.conf 
chmod 640 slapd.conf

  • Une branche "people" qui contiendra nos contacts.

Une fois les paquets installés il faut s'occuper de la configuration et celle-ci est quasiment intégralement contenue dans le fichier "/etc/slapd.conf" 
Dont je présente les extraits importants ci dessous 
-------------------------------------------------- 
backend         bdb 
database        bdb 
# The base of your directory in database #1 
suffix          "dc=domaine,dc=net" 
rootdn          "cn=root,dc=domaine,dc=net" 
rootpw          le_mot_de_passe_secret_non_utilisé 
# Where the database file are physically stored for database #1 
directory       "/var/lib/ldap/domaine.net" 
... 
-------------------------------------------------- 
Vérifiez que les "acl" (Access Control List) sont corrects pour la mise à  jour des contacts et la mise à jour des mots de passe. Nos "acl" sont extrêmement simples et LDAP peut faire beaucoup mieux ! 
-------------------------------------------------- 
... 
# users can modify their passwords 
access to attrs=userPassword 
        by dn.regex="cn=manager,ou=users,dc=izzop,dc=net" write 
        by dn.regex="cn=root,dc=izzop,dc=net" write 
        by anonymous auth 
        by self write 
        by * read 
access to dn.base="" by * read 

# The manager has full write access to people,root too, everyone else 
# can read everything. 
access to dn.children="ou=people,dc=izzop,dc=net" 
        by dn.regex="cn=manager,ou=users,dc=izzop,dc=net" write 
        by dn.regex="cn=root,dc=izzop,dc=net" write 
        by * read 
# only root can update all 
access to * 
        by dn.regex="cn=manager,ou=users,dc=izzop,dc=net" read 
        by dn.regex="cn=root,dc=izzop,dc=net" write 
        by * read 
... 
-------------------------------------------------- 
Ainsi seul notre utilisateur principal "manager" peut modifier les mots de passe et en secours le "root". 
S'assurer que l'utilisateur principal "manager" et le propriétaire "root" peuvent accéder à tout en mise à jour : 
-------------------------------------------------- 
... 
access to * 
        by dn.regex="cn=manager,ou=users,dc=domaine,dc=net" read 
        by dn.regex="cn=root,dc=domaine,dc=net" write 
        by * read 
... 
-------------------------------------------------- 
stopper le service "slapd" et détruire la base "bdb" (c'est celle créée par défaut) située dans /var/lib/ldap/domaine.net : 
cd /var/lib/ldap/domaine.net 
rm -f * 

Copier ceci dans le fichier /var/lib/ldap/domaine.net/DB_CONFIG pour optimiser le fonctionnement 

set_cachesize 0 2097152 0 
set_lk_max_objects 1500 
set_lk_max_locks 1500 
set_lk_max_lockers 1500 

Ces valeurs ne sont pas miraculeuses mais elles fonctionnent fort bien pour la taille d'annuaire visée. 
Démarrer le service "slapd" pour recréer la base ldap puis impérativement le stopper ensuite pour exécuter les opérations suivantes. 
Créer un fichier "LDAPTOP" de définition de notre "structure" d'annuaire contenant : 
----------------- LDAPTOP -------------------------- 
dn: dc=domaine,dc=net 
dc: domaine 
description: Mon domaine à moi 
o: Domaine et Cie 
objectClass: dcObject 
objectClass: organization 
structuralObjectClass: organization 

dn: ou=users,dc=domaine,dc=net 
description: les utilisateurs 
objectClass: organizationalUnit 
objectClass: top 
ou: users 
structuralObjectClass: organizationalUnit 

dn: ou=people,dc=domaine,dc=net 
description: Les gens 
objectClass: organizationalUnit 
objectClass: top 
ou: people 
structuralObjectClass: organizationalUnit 
------------------------------------------------- 
Exécuter la commande suivante (slapd stoppé !) pour intégrer ces éléments dans la base : 

slapadd -f /etc/ldap/slapd.conf -l /root/LDAPTOP -c -v 

Créer un fichier "LDAPMANAGER" (définition de nos utilisateurs) contenant ------------------------------------------------- 
dn: cn=manager,ou=users,dc=domaine,dc=net 
cn: manager 
givenName: manager 
sn: Le responsable de l'annuaire 
userPassword: le_mot_de_passe_du_manager_qui_est_secret 
structuralObjectClass: inetOrgPerson 
objectClass: inetOrgPerson 
objectClass: top 
objectClass: person 
objectClass: organizationalPerson 

dn: cn=totor,ou=users,dc=domaine,dc=net 
cn: totor 
givenName: totor 
sn: utilisateur quelconque  
userPassword: le_mot_de_passe_pour_lecture_seule 
structuralObjectClass: inetOrgPerson 
objectClass: inetOrgPerson 
objectClass: top 
objectClass: person 
objectClass: organizationalPerson 
------------------------------------------------- 
Lancer la commande suivante pour intégrer ce fichier : 

slapadd -f /etc/ldap/slapd.conf -l /root/LDAPMANAGER -c -v 

Il reste quelques commandes pour améliorer les performances futures : 

slapindex -f /etc/ldap/slapd.conf 
cd /var/lib/ldap/domaine.net 
chown -R openldap:openldap * 

Dès que le service "slapd" est relancé l'annuaire est alors prêt pour l'enregistrement des adresses de vos contacts. 

Si vous disposez déja de données de contact vous pouvez les mettre au format suivant afin de les intégrer automatiquement ( awk est votre ami si le nombre d'adresses est étevé ) et les stocker dans le fichier "MESADRESSES" : 
--------------------------------------------------------- 
dn: cn=NOM,ou=people,dc=domaine,dc=net 
displayName: LE NOM DE DISPLAY 
objectClass: inetOrgPerson 
objectClass: person 
objectClass: organizationalPerson 
sn: NOM 
givenName: LE NOM DE DISPLAY 
mobile: 06 01 02 03 04 
homePhone: 01 01 02 03 04 
homePostalAddress: ADRESSE_RUE$ADRESSE_VILLE$CODE8POSTAL$PAYS 
cn: NOM 
mail: MAIL@DOMAINE 
-------------------------------------------------------------------------------------- 
Vous pourrez alors lancer les commandes destinées à  intégrer votre fichier d'adresses  ( les options "-c" permettent de continuer sur erreur "-v" donne un programme plus "bavard")  après avoir stoppé le service "slapd" 
# pour Debian; Ubuntu ... 
/etc/init.d/slapd stop 
# pour d'autres  
service slapd stop 
slapadd -f /etc/ldap/slapd.conf -l /tmp/MES_ADRESSES -c -v 

Relancer le service "slapd" 

Un utlitaire assez "sympa" à  utiliser pour voir et éventuellement mettre à jour le contenu d'un annuaire : "luma", c'est parfait pour changer un mot de passe. D'autres utilitaires graphiquesc LDAP: "gq" ou "lat" moins "amusants" mais aussi efficaces, on peut aussi citer "jxplorer" qui, écrit en Java, existe sur la plupart des plateformes. 
 

LDAP : la sécurité

LDAP : la sécurité jpp

J'ai maintenant un bel annuaire LDAP, il marche bien et contient, déjà, tout plein d'adresses mail, postales. 
Et si, horreur, un vilain bug passant par là me faisait perdre toutes ces données ? 
Je n'ose même pas y penser, les remarques désobligeantes de la famille, la nécessité de re-saisir ... noms, adresses mail, numéros de téléphone, être obligé de parcourir le site pagesjaunes (ou blanches) à la recherche d'une partie des données perdues. 
Il me faut une solution ! Et vite ! 
Heureusement il y a "ldap-utils" et il y a là dedans notre sauveur, on y trouve entre autres outils un petit programme appelé "slapcat" qui permet d'effectuer une copie ( "cat" ) d'un annuaire LDAP. 
Un petit script et nous voilà à l'abri d'une grosse catastrophe. 
#!/bin/bash 
mark=`date +%y_%m_%d `  
REPSAUVE='/ailleurs' 
DOMAINE='dc=domaine,dc=net' 
SAUVE=$REPSAUVE'/DumpLDAP_'$mark'.ldif' 
/usr/sbin/slapcat -f /etc/ldap/slapd.conf -b "$DOMAINE"  -l $SAUVE 
ret=$? 
if [ $ret -ne 0 ] 
   then 
    echo 'Erreur sauve ldap !!!' 
fi 
exit $ret 

Ce petit script effectue la copie dans un répertoire "/ailleurs" que vous pouvez mettre n'importe où, de préférence sur un autre disque. La sauvegarde doit être effectuée annuaire en marche et l'exécution peut être "cronée" pour s'assurer de la régularité de la sauvegarde. Au début tous les jours, puis toutes les semaines. 
Le vidage est effectué au format "ldif" qui est un standard dans le domaine LDAP et les fichiers sont "datés" pour l'historique. 
Le format "ldif" peut être utilisé avec un grand nombre d'outils tels ceux nous ayant permis de créer la structure de l'annuaire.

LDAP : haute disponibilité

LDAP : haute disponibilité jpp

J'ai un PC portable sous Linux (cela vous étonne ?) et cela m'ennuierai d'être séparé de mes chers contacts. 
Je pourrais, bien sûr, effectuer une copie locale des données. Cette opération est en général très simple à faire et est déclenchable dans les propriétés de l'annuaire de votre programme de mail favori  (Evolution et Thunderbird le font très bien). 
Mais, la nature humaine étant ce qu'elle est, on oublie la mise à jour ... et ... un seul être vous manque et tout est dépeuplé , qu'est ce que je raconte ? Il nous manquera toujours l'adresse de M. Untel dont on a un besoin urgent. 
La solution s'appelle "réplication". Il suffit d'installer un petit LDAP "local" et d'expliquer aux deux système que l'un est "Maître" et l'autre "Esclave". 
L'esclave interroge régulièrement le maître : 
"Maître avez-vous reçu des mises à jour depuis la dernière que vous m'avez fait l'honneur de me communiquer et qui portait le numéro NNN ? " 
Et le maître répond : "non esclave je n'ai aucune mise à jour " ou bien "Oui esclave j'ai des mises à jour, les voici ......". 
Grâce aux développeurs de OpenLdap il existe une possibilité toute simple de réaliser ce miracle. Quelques petites modifications dans les paramètres de configuration et ... le tour est joué. 
Modifications du "Maître"  
Dans le fichier "/etc/ldap/slapd.conf", oui oui, j'ai dupliqué le fichier avant d'y toucher : 
Au début du fichier de configuration il faut charger dynamiquement un module spécifique : 

moduleload syncprov 

Syncprov = Synchronization Provider ? 
Un peu plus loin dans le fichier, après la directive : 
"database        bdb" il faut ajouter les lignes suivantes : 

overlay syncprov 
syncprov-checkpoint 1 5 
replica host=MON_ESCLAVE:489 
        binddn="cn=root,dc=domaine,dc=net" 
        bindmethod=simple credentials="le_mot_de_passe_secret_de_root" 
        syncprov-reloadhint TRUE 

Cette petite manip permet au maître de savoir qu'il est maître de l'esclave nommé ici, les autres peuvent aller se faire voir ! 
Une fois "slapd" redémarré le maître est prêt. On n'est pas en SSL, ni sécurisé à mort, les mots de passe sont en clair dans le fichier ... on peut faire autrement, mais si c'est plus beau c'est aussi beaucoup plus difficile. Et puis le fichier de config n'est lisible que par "root" (c'est moi) et par le groupe "openldap" où je n'ai mis que le user du même nom. Et en plus les adresses dont je dispose ne sont pas classées "données sensibles", on admettra donc ce trou de sécurité. 

Modifications de l'esclave. 
Peu après la directive : 
"database bdb" il faut ajouter les lignes suivantes : 

syncrepl rid=007 
        provider=ldap://MON_MAITRE:489 
        type=refreshOnly 
        interval=00:02:00:00 
        searchbase="dc=domaine,dc=net" 
        filter="(objectClass=*)" 
        scope=sub 
        schemachecking=off 
        bindmethod=simple 
        binddn="cn=root,dc=domaine,dc=net" 
        credentials="le_mot_de_passe_secret_de_root" 

La petite zone "00:02:00:00" permet de régler la fréquence de la mise à jour (ici 2 heures) à la seconde près ! 
Dès le démarrage le client sait qu'il a un maître et va s'enquérir des nouveautés auprès de son maître. 

On peut même s'amuser à effectuer l'opération suivante ( SUR L'ESCLAVE !)  :

  1. Stopper "slapd", sur l'esclave je me répète
  2. Aller dans le répertoire "/var/lib/ldap/domaine.net"
  3. Y détruire tout (sauf le fichier DB_CONFIG), si on est bien sur la machine esclave !
  4. Relancer "slapd"

Et le miracle s'accomplit, l'annuaire est "rempli" de données toutes fraîches, c'est  m a g i q u e ! 

Donc comme cela les adresses de mon portable seront toujours "au top" car il est souvent branché sur le réseau au contact direct de son maître préféré. 
Le seul problème est que je ne peux pas saisir d'adresses sur le portable, j'ai d'ailleurs paramétré le client mail en lecture seule. 
 

LDAP : paramétrage clients

LDAP : paramétrage clients jpp

Maintenant que notre annuaire est opérationnel il faut pouvoir nous en servir et l'intermédiaire le plus courant est tout bêtement votre programme de gestion des mails. 
Il existe des interfaces permettant de consulter les annuaires LDAP et même des possibilités d'accès à cet annuaire par le Web, mais c'est une autre histoire. 

Les pages suivantes présentent le paramétrage de différents clients mails.

Note 2024 : je n'ai pas touché au paramétrage de mon mail (Evolution) depuis cette date, et cela marche toujours ...

Paramétrage Evolution

Paramétrage Evolution jpp

"Evolution" le client mail le plus abouti (et le plus complexe) sur Linux : 
Se rendre dans l'onglet "contacts" puis effectuer un clic droit dans la colonne de gauche (quelle précision) et de choisir : "Nouveau carnet d'adresses". 
Il faut ensuite remplir le premier onglet :

  1. Nommer le carnet d'adresses ici "kmail"
  2. Donner l'adresse ou le nom du serveur si vous avez un DNS.
  3. Donner le port (389 en standard, 489 ici).
  4. Choisir une connexion "pas de chiffrement" (on est chez nous à l'abri du grand méchant loup ! ).
  5. Prendre l'authentification "En utilisant de nom distinctif (DN)"
  6. Dans la zone "Connexion" inscrire "cn=manager,ou=users,dc=domaine,dc=net" pour ceux qui doivent effectuer des mises à jour des contacts ou "cn=totor,ou=users...." pour ceux qui n'ont qu'un accès en lecture. Pour ces derniers on pourraitt aussi se connecter "Anonymement".

 

 
Pour le deuxième onglet c'est beaucoup plus simple :

  1. Dans "base de recherche" on indique "ou=people,dc=domaine,dc=net"
  2. Pour "Domaine de recherche choisir "Un"
  3. "Filtre de recherche" on ne met rien, ça c'est sympa.
  4. Pour "Délai" laisser à 5 minutes
  5. Pour "Limite de téléchargement" laisser la valeur 100, sauf si vous avez une grosse base de contacts et que vous voulez la récupérer d'un seul coup.
  6. "Parcourir..." ne pas cocher

 

Il suffit ensuite  de valider et de relancer Evolution qui vous demandera le mot de passe au démarrage, pensez à cocher la case "Se souvenir du mot de passe". 
 

Vous avez alors un accès à votre liste de contacts partagés et cela peut durer plus de 10 ans ...

Paramétrage Thunderbird

Paramétrage Thunderbird jpp

Le client suivant, parmi les plus connus dont la version 2 vient de sortir est "Thunderbird" qui existe sous différents systèmes dont Windows, Mac et Linux. 
Thunderbird sous Windows XP. 
Il faut aller dans "Options" sélectionner l'onglet "Rédaction" puis dans l'onglet "Addressage" sélectionner "Serveur d'annuaire". 
 
Cliquer ensuite sur "Modifier les annuaires...". 
 
Cliquer ici sur "Ajouter". 
La boite de dialogue qui s'ouvre alors devant nos petits yeux émerveillés présente plusieurs onglets :

Premier onglet. 

  1. Nom : nommer votre carnet d'adresse
  2. Nom d'hôte : adresse IP ou nom du serveur d'annuaire
  3. Nom distinct de base : c'est la base de recherche des contacts "ou=people,dc=domaine,dc=net".
  4. Numéro de port : le port standard est le 389 (489 chez moi)
  5. Connecter avec l'utilisateur : c'est votre utilisateur, ici "cn=manager,ou=users,dc=domaine,dc=net" ou "cn=totor,ou=users,dc=domaine,dc=net".
  6. On ne coche pas "Utiliser une connexion chiffrée, on est en principe dans une zone de confiance !


Deuxième onglet : "Hors connexion" , laissez tomber pour l'instant, vous pourrez éventuellement y revenir plus tard (quand la connexion sera OK) pour effectuer une copie locale de l'annuaire. 

Troisième onglet : "Avancé" 
cocher "Un niveau" et laissez le filtre à blanc. 
 

Vous pouvez maintenant valider avec "OK". 
 
 

 

Le serveur d'annuaire apparait dans la liste :un simple "OK" suffit à vous ramener à l'écran suivant. 

 
où il ne faut pas oublier de sélectionner l'annuaire que nous venons de définir avant le "OK" final sinon cela ne sert à rien d'avoir fait tout cela ! 

La première utilisation de l'annuaire vous amènera à saisir le mot de passe sans oublier de cocher "Utiliser le gestionnaire....." pour enregistrer le mot de passe définitivement. 
 

Et en plus  ça marche : 
 
On voit bien que l'annuaire des contacts est garni. 

Allez, je vous quitte j'ai de nouveaux contacts à saisir ! Quel bagne !

Note 2024 : La machine sur laquelle était installé Thunderbird n'a pas supporté la migration vers Windows 7 avec un crash complet lors de la migration, elle ne démarrait plus ni en XP ni en 10. En montant le disque "data" sur une machine Linux j'ai réussi à récupérer l'intégralité des fichiers. Depuis Madame a une machine sous Linux, quelques grincements de dents au début (c'est pas pareil que WIndows !), et Thunderbird a démarré sur la nouvelle machine Linux quasiment sans problèmes ... et Thunderbird fonctionne toujours.