LDAP : Linux

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.