Serveur OpenLDAP

LDAP signifie Lightweight Directory Access Protocol, c'est une version simplifiée du protocole normalisé X500. La configuration de l'annuaire dans cette partie sera utilisée pour faire de l'authentification. Quoiqu'il en soit, un annuaire LDAP peut-être utilisé de différentes façons : authentification, annuaire partagé (pour les clients de messagerie), dans toutes sortes d'applications. LDAP est un standard largement utilisé.

Pour décrire brièvement un annuaire LDAP, toutes les informations sont stockées dans une structure arborescente (l'arbre d'informations de l'annuaire, le DIT). Nous commencerons avec un arbre simple avec deux nœuds au-dessus de la racine :

Vous devez d'abord déterminer qu'elle sera la racine de votre annuaire LDAP. Par défaut, votre arbre sera déterminé par votre domaine Internet. Par exemple, si votre domaine est example.com (ce que nous assumerons dans l'exemple qui suit), votre racine sera dc=example,dc=com.

Installation

Tout d'abord, installez le démon du serveur ldap (ldapd) sur la machine serveur ; installez les paquets suivants : slapd et ldap-utils.

Saisissez votre domaine et le mot de passe pour le compte administrateur de l'annuaire.

Seules quelques modifications seront apportées à la configuration par défaut. Tout d'abord, définissez le mot de passe de l'administrateur dans le fichier de configuration (au lieu de le faire dans l'annuaire) en éditant le fichier/etc/ldap/slapd.conf.

N'utilisez pas un mot de passe en clair. Pour générer un mot de passe crypté, utilisez au préalable la commande : slappasswd votremotdepasse

$ slappasswd
New password:
Re-enter password:
{SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

Cet exemple montre ce qu'il se passe quand on utilise la chaîne de caractère « secret » comme mot de passe. (De par la nature du processus de cryptage SSHA, votre résultat variera).

Maintenant, éditez le fichier /etc/ldap/slapd.conf et copier/coller la chaîne générée.

# Assurez-vous d'éditer ou bien de rajouter ces directives après la première directive 'database'.

suffix          "dc=example,dc=com"
directory       "/var/lib/ldap"
rootdn          "cn=admin,dc=example,dc=com"
rootpw          {SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

Peuplement du LDAP

L'annuaire a été créé au cours de l'installation. Il faut maintenant le peupler, avec des entrées « classiques » qui seront compatibles avec un annuaire (par exemple pour un annuaire partagé), avec des comptes classiques (pour une application web) ainsi qu'avec des comptes Unix (posix).

Un annuaire LDAP peut-être renseigné à l'aide d'un fichier ldif (ldif signifie ldap directory interchange format). Pour prendre un exemple, créer le fichier texte init.ldif suivant dans votre système :

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organizationalUnit
dc: example
ou: Example Dot Com

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

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

dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@example.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress: 
initials: JD

dn: cn=example,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: example
gidNumber: 10000

Dans l'exemple ci-dessus, on a défini un utilisateur, un groupe et la structure de l'annuaire. Dans un autre exemple, vous auriez pu voir l'attribut objectClass: top ajouté dans chaque entrée, mais comme il s'agit d'une valeur par défaut, il n'est pas nécessaire de l'indiquer explicitement.

Maintenant, ajoutez vos entrées dans l'annuaire LDAP :

  • arrêtez le démon LDAP : sudo /etc/init.d/slapd stop

  • supprimez le contenu ajouté automatiquement lors de l'installation : sudo rm -rf /var/lib/ldap/*

  • ajouter le contenu de fichier d'exemple ci-dessus : sudo slapadd -l init.ldif

  • redémarrez le démon LDAP : sudo /etc/init.d/slapd start

Nous pouvons maintenant vérifier que le contenu de notre fichier a bien été ajouté correctement, à l'aide des outils du paquet ldap-utils. Afin de faire une recherche dans un annuaire LDAP :

ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn
dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
sn: Doe
givenName: John

Une petite explication rapide :

  • -x : parce que nous n'utilisons pas la méthode d'authentification SASL (utilisée par défaut)

  • -LLL : n'affiche pas les informations LDIF

Paramétrage des ACL

L'authentification nécessite l'accès au champ du mot de passe, qui ne devrait pas être accessible par défaut. Un autre problème vient du fait qu'au cours du changement de mot de passe à l'aide de « passwd », shadowLastChange doit également être accessible. Le code suivant montre un exemple de paramétrage d'ACL qui autorise l'accès à shadowLastChange :

access to attr=shadowLastChange
        by dn="cn=manager,dc=example,dc=com" write
        by self write
        by * read

Réplication LDAP

Le service d'annuaire LDAP devient souvent rapidement un service hautement critique dans un système d'information : tout dépend de LDAP : l'authentification, les autorisations, la messagerie, etc. Configurer un système redondant est donc une bonne idée que l'on peut de surcroit facilement mettre en œuvre comme le montre la petite explication suivante.

La réplication sera basée ici sur une relation maître-esclave. Avant de mettre en œuvre la réplication LDAP, vérifiez les étapes suivantes :

  1. Arrêter le démon slapd du serveur maître.

  2. Reconfigurer le fichier slapd.conf du serveur maître afin de permettre la réplication sur le nouveau serveur esclave.

  3. Exporter la base de données du serveur maître.

  4. Configurer le fichier slapd.conf du serveur réplica.

  5. Importer la base de données du serveur maître sur le serveur esclave.

  6. (Re)démarrer le processus slapd du serveur réplica

  7. Redémarrer le processus slapd du serveur maître

Vous devez vous rappeler que les modifications doivent TOUJOURS être apportées sur le serveur maître. Si par mégarde vous modifiez le serveur esclave, vos modifications seront perdues.

Maître LDAP

Sur le serveur maître, vous devez modifier la section base de données du fichier /etc/ldap/slapd.conf pour ajouter une instruction de réplication. L'exemple suivant permet une réplication sur ldap-2.example.com avec l'utilisateur « Manager » et le mot de passe « secret ». Le journal de réplication contient les modifications effectuées avant qu'elles ne soient envoyées au serveur LDAP esclave.

replica uri=ldap://ldap-2.example.com:389 binddn="cn=Manager,dc=example,dc=com" bindmethod=simple credentials=secret

replogfile      /var/lib/ldap/replog

Exportez la base de données du maître à l'aide de slapcat. Puis copiez master.ldif sur l'esclave à l'aide de scp ou d'autres outils.

user@master:~$ sudo slapcat -l master.ldif

Esclave LDAP

Sur l'esclave, vous devez autoriser votre maître à mettre à jour la base de données LDAP. Ajoutez les lignes suivantes à votre fichier /etc/ldap/slapd.conf dans la section 'database' :

updatedn        cn=Manager,dc=example,dc=com
updateref       ldap://ldap-1.example.com

Importez le fichier master.ldif à l'aide de slapadd.

user@slave:~$ sudo slapadd -c -l master.ldif

Redémarrer le serveur maître.

user@master:~$ sudo /etc/init.d/slapd start

Rédémarrer le serveur esclave.

user@slave:~$ sudo /etc/init.d/slapd start