Publié le: 2014-02-26

OpenLDAP

OpenLDAP est l’annuaire libre de référence. Il intègre l’ensemble des fonctionnalités que l’on peut attendre d’un annuaire, et se base sur un système de schémas. Chaque schéma définit un ensemble d’attributs et de contraintes associées qui vont définir l’objet associé.

Un annuaire LDAP se base sur une arborescence d’objets, dont chacun est indentifié par un DN (dinstinguished name), réparti dans des unités d’organisation (OU) sous une racine (origin)

Installation d’OpenLDAP

Sous FreeBSD, on va installer OpenLDAP 2.4

cd /usr/ports/net/openldap24-server
make install clean

Sélectionnez les options suivantes suivant votre besoin:

  • Fetch
  • BDB
  • Passwd
  • Sock
  • ODBC
  • TCP_Wrappers
  • Collect
  • DynGroup
  • DynList
  • PPolicy
  • ProxyCache
  • SeqMode
  • Unique
  • Valsort
  • SmbPwd
  • Dynamic-Backends

Configuration

La configuration d’OpenLDAP s’effectue dans le fichier /usr/local/etc/openldap/slapd.conf

Schémas de base

On va ajouter quelques schémas de base utiles à l’annuaire, nous permettant de définir ce qu’est une personne, une unité d’organisation et le schéma posix nécessaire pour que les UNIX s’appuient dessus (l’ordre est important)

include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/misc.schema
include         /usr/local/etc/openldap/schema/nis.schema
include         /usr/local/etc/openldap/schema/openldap.schema

Racine LDAP

Il faut maintenant configurer la racine de l’annuaire. Editez la ligne suivante (cela peut ne pas correspondre à votre nom de domaine):

suffix          "dc=unix-experience,dc=fr"

Super utilisateur LDAP

L’utilisateur racine LDAP est l’objet qui a tous les pouvoirs sur l’annuaire, il n’existe pas forcément de manière visible dans l’arborescence et peut même être dans un chemin qui n’existe pas:

rootdn          "cn=admin,dc=unix-experience,dc=fr"

Afin de lui attribuer un mot de passe chiffré, exécutez la commande suivante:

slappasswd -s motdepasse
{SSHA}DRA+C7TAbDR+tWdD9x6cQBPnDKafBCLvY

Ensuite ajoutez le résultat de la commande au fichier slapd.conf, de la manière suivante:

rootpw {SSHA}DRA+C7TAbDR+tWdD9x6cQBPnDKafBCLvY

Lancement du service OpenLDAP

L’annuaire étant maintenant configuré de façon sommaire, on va désormais pouvoir le peupler et créer sa racine.

service slapd start

Créez un fichier root.ldif et entrez les données suivantes:

dn: dc=unix-experience,dc=fr
dc: unix-experience
objectClass: dcObject
objectClass: organization
o: unix-experience

dn: ou=people,dc=unix-experience,dc=fr
objectClass: top
objectClass: organizationalUnit
ou: people

La première entrée est l’origine LDAP, la seconde une première unité d’organisation contenant les utilisateurs dans des configurations standard.

On l’injecte désormais dans l’annuaire:

ldapadd -f root.ldif -D cn=admin,dc=unix-experience,dc=fr -W

Afin de vérifier que vos données sont présentes, on dump l’ensemble de l’annuaire:

slapcat

On aurait pu faire une recherche sur l’ensemble de l’annuaire

ldapsearch -b dc=unix-experience,dc=fr

Il faut noter qu’aucune identification n’est demandée, c’est parce qu’on est sur le serveur LDAP lui-même.

Support SSL

Un annuaire est un des éléments les plus sensibles d’un système d’informations. Celles-ci peuvent être extrêmement sensibles, il convient donc de les chiffres afin qu’elles ne puissent ni être interceptées ni altérées. On va rajouter la couche de chiffrement SSL au protocole LDAP.

On créée tout d’abord un certificat

openssl req -x509 -new -out ldap_cert.pem -keyout ldap_key.pem -days 3650 -nodes

Ensuite on définit le chemin vers les certificats au service OpenLDAP

TLSCertificateFile /usr/local/etc/openldap/ldap_cert.pem
TLSCertificateKeyFile /usr/local/etc/openldap/ldap_key.pem

Et enfin on active le support SSL en rajoutant les flags au service dans le fichier /etc/rc.conf

slapd_flags='-h "ldaps://0.0.0.0/ ldap://0.0.0.0/"'

Intégration du schéma SMB/MS-CHAP

Afin d’intégrer le schéma SMB à notre annuaire et ainsi pouvoir utiliser de l’authentification type MS-CHAPv2 voire de faire contrôleur de domaine Active Directory, on a besoin de quelques outils supplémentaires

cd /usr/ports/net/samba36
make KRB5_HOME=/usr/local
make install clean
cd /usr/ports/net/smbldap-tools
make install clean

On copie le schéma

cp /usr/local/share/examples/samba36/LDAP/samba.schema /usr/local/etc/openldap/schema/

et on l’intègre dans le slapd.conf:

include         /usr/local/etc/openldap/schema/samba.schema

Plus d’informations sur la gestion de ce schéma seront ajoutées ultérieurement.

Intégration du schéma Supann (enseignement supérieur)

Copiez le contenu de ce fichier dans le fichier /usr/local/etc/openldap/schema/supann.schema et supprimez les commentaires avec des accents qui risquent d’empêcher le démarrage d’OpenLDAP.

Ajoutez ensuite le schéma à OpenLDAP

include         /usr/local/etc/openldap/schema/supann.schema

Réplication OpenLDAP

Depuis la version 2.4 d’OpenLDAP, celui-ci intègre un mécanisme de réplication LDAP. Il était auparavant possible de configurer des serveurs maîtres esclave, mais cette fonctionnalité est plus intéressante dans un contexte de haute disponibilité et permet la répartition de charge.

Lorsqu’une donnée est altérée sur l’un des noeuds, celui-ci va envoyer, dès que la queue de réplication sera disponible, un ordre via LDAP pour définir la mise à jour sur les autres noeuds.

Si vous ne l’avez pas activé pour la compilation, activez le module syncprov et recompilez OpenLDAP.

Configuration de l’utilisateur de réplication

Il n’est pas recommandé d’utiliser le superutilisateur pour la réplication, on va donc configurer un compte de réplication:

dn: cn=replicator,ou=system,dc=unixperience,dc=it
objectClass: top
objectClass: organizationalPerson
userPassword: {SSHA}cqz/RnlJiooZ12aseBczGK87VrpR25mZ
sn: replicator
ldapadd -Z -c -f replica.ldif -D cn=admin,dc=unixperience,dc=it -W

Ouvrez le fichier slapd.conf afin de donner les droits d’écriture à l’utilisateur de réplication:

access to *
        by self write
        by dn="cn=replicator,ou=system,dc=unixperience,dc=it" write
        by anonymous auth

Configuration de la réplication

Chaque noeud LDAP possède un serverID l’identifiant au sein du cluster LDAP et un RID (replication ID) qui doit être identique sur chaque noeud.

serverID        1
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
syncrepl        rid=1
        provider=ldap://ldap2.unixperience.it:389/
        bindmethod=simple
        binddn="cn=replicator,ou=system,dc=unixperience,dc=it"
        credentials=r3pl1c@t0r
        searchbase="dc=unixperience,dc=it"
        schemachecking=on
        type=refreshAndPersist
        retry="5 +"
mirrormode on

La directive searchbase est pratique, car elle permet de n’effectuer qu’une réplication partielle de l’annuaire en sélectionnant une branche.

La directive retry définit un délai avant nouvel essai, ici 5 secondes. Le symbole + définit une boucle de nouvel essai. Il est possible de définir des périodes plus spéciques en inscrivant retry=“5 10 30 60 180 +”, ce qui aura pour effet d’essayer après 5,10,30… secondes.

Les directives de checkpoint sont extrêmement importantes, et les positionner comme ici devrait satisfaire vos besoins courants.

Amélioration de la sécurité

Empêcher de voir le mot de passe

Par sécurité vous pouvez empêcher les utilisateurs de voir leur mot de passe dans l’annuaire. ajoutez les règles suivantes, avant la règle globale d’accès:

access to attrs=userPassword
        by self =wx
        by * =x

Améliorations de performances

Configuration du cache

Dans le cas d’un annuaire très gros (plus de 3000 utilisateurs), avec énormément d’attributs, il peut être nécessaire de bien gérer le cache LDAP. Pour permettre à OpenLDAP d’utiliser plus de mémoire pour son cache copiez tout d’abord le fichier suivant:

cp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data/DB_CONFIG

et éditez la ligne suivante (ici on affecte 768Mo de ram au cache)

 set_cachesize 0 768435456 1

Configuration de l’indexation

Lors de recherches, la notion d’index est un point fondamental. Certains attributs d’un annuaire peuvent être demandés afin de référencer un utilisateur et de le retrouver de manière régulière. Dans ce cas, il convient de réorganiser la base OpenLDAP en indexant efficacement. Ajoutez par exemple la ligne suivante:

index   cn,uid          eq

L’indexation se fait à froid. Coupez le service et lancez la commande suivante (avant de le redémarrer)

slapindex

Gestion au quotidien

Commandes générales

Ajout d’entrées dans l’annuaire

La commande permettant d’ajouter des entrées à l’annuaire LDAP est la suivante:

ldapadd -f /path/file.ldif

On peut également utiliser ldapmodify

ldapmodify -a -f /path/file.ldif

Si vous n’êtes pas sur la machine contenant l’annuaire ou que vous avez interdit la modification de l’annuaire de manière non authentifiée, tapez la commande suivante (il n’est pas nécessaire d’utiliser le super utilisateur LDAP, un utilisateur avec les droits d’écriture suffit):

ldapadd -x -D "cn=admin,dc=unix-experience,dc=fr" -W -f /path/file.ldif

Attention ! ldapadd ne fusionne pas une entrée, si elle existe la commande échouera et passera à l’entrée suivante.

Suppression d’une entrée de l’annuaire

La commande est très simple:

ldapdelete <dn>
ldapdelete < /path/file
ldapdelete -f /path/file

Dans le cas des fichiers, il s’agit d’une liste de DN (un DN par ligne).

Ajouter un groupe

Si cela n’existe pas, vous pouvez rajouter une OU dédiée aux groupes, afin de garder une vision claire de l’annuaire:

dn: ou=groups,dc=unix-experience,dc=fr
objectclass:organizationalunit
ou: groups
description: generic groups branch

Voici maintenant un fichier ldif simple contenant un groupe:

dn: cn=unixadm,ou=groups,dc=unix-experience,dc=fr
objectclass: groupofnames
cn: unixadm
description: UNIX admins
member: cn=titi.toto,ou=people,dc=unix-experience,dc=fr
member: cn=misc.user,ou=people,dc=unix-experience,dc=fr

Résolution de problèmes OpenLDAP

Si vous remarquez qu’OpenLDAP ne se lance pas, ou qu’il met énormément de temps à se lancer, une fois la commande de lancement effectuée, tuez la commande et démarrez OpenLDAP en mode debug. Pour se faire prenez votre ligne de commande slapd et ajoutez l’option -d 50. Exemple:

/usr/local/libexec/slapd -d 50 -h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/ ldaps://0.0.0.0/"

Cas du “unable to join the environment”

Cela signifie que votre base LDAP est inconsistante et qu’OpenLDAP ne comprend pas le contexte de la base (backend bdb). Il faut procéder à une récupération de la base via les commandes OpenLDAP/bdb associées. Pour se faire, tapez simplement la commande suivante (changez la version par votre version bdb ou ultérieure et le chemin par celui de votre distribution, ici FreeBSD):

db-recover4.6 -h /var/db/openldap-data

Patientez, normalement rien ne s’affiche et au bout d’un moment on vous rend la main. Vous devriez maintenant pouvoir démarrer OpenLDAP, le mode debug vous montrera si ca a marché.

Articles complémentaires

Nettoyer les logs d’OpenLDAP