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)
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:
La configuration d’OpenLDAP s’effectue dans le fichier /usr/local/etc/openldap/slapd.conf
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
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"
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
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.
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/"'
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.
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
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.
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
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.
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
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
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
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.
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).
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
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/"
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é.