Lightweight Directory Access Protocol (LDAP)

Généralités

Le LDAP est la base de donnée centrale au ResEl. C'est dans cette base de donnée qu'est enregistré toutes les informations concernant les utilisateurs et leurs machines.

Le LDAP est hébergé sur la machine Beaune à Brest et Lussac à Rennes qui fait de la réplication LDAP. Le service utilisé est OpenLDAP.

Important : Ne jamais lancer slapd en tant que root (flo ne le répétera assez)

Structure de l'arbre

  • dc=maisel,dc=enst-bretagne,dc=fr
    • ou=anciens
    • ou=club-old : ancienne branche, n'est plus utilisée
    • ou=clubs : ancienne branche, n'est plus utilisée
    • ou=divers
    • ou=organisations : associations et clubs du campus
    • ou=people : personnes inscrites au ResEl
    • ou=webmasters : tous les webmasters
  • dc=resel,dc=enst-bretagne,dc=fr
    • cn=replicator
    • ou=admins : admins ResEl
    • ou=machines : machines inscrites au ResEl
    • ou=reseau : switch du ResEl
    • ou=sites : sites web (fortement lié avec golf)
    • ou=snmp : alias snmp pour les différents switchs

Lire dans le LDAP

Pour les lectures courantes (de la part d'administrateurs), il est conseillé d'utiliser l'interface admin. Vous ne risquez pas de faire trop de betises avec.

Dans certains cas, il est nécessaire de faire des requêtes personnalisés. Dans ce cas il est conseillé d'utiliser phpLdapAdmin. Sinon vous pouvez vous connecter sur Beaune et lancer ldapvi dessus :

ldapvi --discover

Si vous avez les droits nécessaire, vous pouvez faire les modifications que vous voulez.

Si vous avez besoin d'accéder au ldap dans des scripts il existe quelques ressources sur internet :

La syntaxe LDAP

La syntaxe pour faire une recherche LDAP est relativement simple :

(OPERATEUR_BOOLÉEN(attribut OPERATEUR_BINAIRE valeur)(attribut OPERATEUR_BINAIRE valeur)...)
Les opérateurs booléens étant :
  • la négation : !
  • la conjonction (ET) : &
  • la disjonction (OU) : |

Les opérateurs binaires étant :

  • Égalité : =
  • Approximation : ~=
  • Supérieur ou égal : >=
  • Inférieur ou égal : <=

Les opérateurs binaires restant s'obtiennent par combinaison des autres.

Exemples

Tous les uid ou firstname ou lastname ou nickname ou orgaName contenant "a"

(|(uid=*a*)(firstname=*a*)(lastname=*a*)(nickname=*a*)(orgaName=*a*))

Toutes les personnes ayant leur numéro de téléphone renseigné dans la base :

(&(objectclass=person)(telephoneNumber=*))

Toutes les personnes dont le nom commence par 'A' et n'habitant pas Paris :

(&(objectclass=person)(cn=A*)(!(location=Paris)))

Toutes les personnes dont le nom ressemble à Febvre (Faivre, Fèvre, Lefebvre, ...):

(&(objectclass=person)(cn~=febvre))

Idem que le premier exemple en excluant la branche eou=club-old,dc=maisel,dc=enst-bretagne,dc=fr :

(&(|(uid=*musique*)(firstname=*musique*)(lastname=*musique*)(nickname=*musique*)(orgaName=*musique*))
(!(entryDN:dnSubtreeMatch:=ou=club-old,dc=maisel,dc=enst-bretagne,dc=fr)))

Les URL et URI LDAP

Afin d'accéder rapidement à une ressource, nous pouvons utiliser une url ldap de la forme suivance :

ldap[s]://<hostname>:<port>/<base_dn>?<attributes>?<scope>?<filter>?<extensions>

avec les paramètres suivants:

  • hostname : Adresse du serveur. L'adresse peut être absente, le client est supposé connaître un serveur LDAP à contacter, en fonction du contexte.
  • port : Port TCP de la connexion. Par défaut il s'agit du port 389. Il ne peut y avoir de port s'il n'y a pas d'adresse.
  • base_dn : DN de l'entrée qui est le point de départ de la recherche.
  • attributes : Les attributs que l'on veut récupérer, séparés par des virgules.

Si la valeur n'est pas remplie, ou si elle est rempli avec une '''*''', tous les attributs d'usage userApplication doivent être retournés.

  • scope : La profondeur de la recherche dans l'arbre : base, one ou sub.
  • filter : Le filtre de recherche, tel que nous venons de le définir. Le filtre par défaut est (objectClass=*).
  • extensions : Les extensions sont un moyen pour pouvoir ajouter des fonctionnalités aux URLs

LDAP tout en gardant la même syntaxe. On peut mettre inclure plusieurs extensions dans une URL, en les séparant par des ,.

Les extensions ont le format suivant : type=value. La partie =value est optionnelle. Elle peuvent être préfixée par un ! pour signaler une extension critique. Une extension critique signifie que le client et le serveur doivent supporter tous les deux l'extension, sinon une erreur sera levée.

Exemple

Les genericPerson dans la branche dc=maisel,dc=enst-bretagne,dc=fr

ldaps://ldap.resel.fr:636/dc=maisel,dc=enst-bretagne,dc=fr??sub?(objectclass=genericPerson)

Écrire dans le LDAP

Pour la plupart des modifications faites dans le LDAP (ajout de machine ou de personne) il est recommandé de passer par le site admin

Pour d'autres modifications plus avancées vous pouvez utiliser phpLdapAdmin

Si vraiment vous voulez tout casser, il vous reste quelques solutions : :)

ldapvi

ldapvi est un éditeur en ligne de commande qui ouvre l'ensemble du LDAP dans votre éditeur de texte préféré, défini dans la variable $EDITOR. Pour l'utiliser, voilà une solution :

Éditer ~/.ldaprc

# ~/.ldaprc

HOST ldap.maisel.enst-bretagne.fr
BINDDN uid=mon_login,ou=admins,dc=resel,dc=enst-bretagne,dc=fr
TLS_CACERT chemin/vers/ca.pem

Se créer un alias pour le lancer comme il faut, c'est-à-dire :

ldapvi -d -D uid=mon_login,ou=admins,dc=resel,dc=enst-bretagne,dc=fr

Il faut rajouter cette ligne à votre .zshrc ou .bashrc (en modifiant le login) :

alias ldapresel="ldapvi -d -D uid=mon_login,ou=admins,dc=resel,dc=enst-bretagne,dc=fr"
Il vous suffira ensuite de taper "ldapresel".

Configuration et installation

On ne le saura peut être jamais... Voir le repo Git

Lancement du daemon

Pour redémarrer le daemon en cas de modification :

service slapd restart

Veuillez utiliser l'utilitaire slaptest pour tester la configuration avant de relancer le serveur

Informations complémentaires sur le LDAP

Les machines du ResEl ( machines utilisateurs et serveur ) sont enregistrées dans le ldap avec un type reselmachine qui contient un champ lastdate.

Ce champ lastdate permet de mettre les machines en zone inactive lorsqu'elle ne sont pas vues sur le réseau depuis un certains temps.

Le script check_ldap.pl situé sur Beaune qui vérifie l'intégrité du LDAP. -> il est disponible ici : https://git.resel.fr/resel/scripts/blob/master/ldap/check_ldap.pl

# Vérification de la branche ou=machines,dc=resel,dc=enst-bretagne,dc=fr
# - Vérification unicité et format des adresses MAC
# - Vérification unicité et format des adresses IPv4 et IPv6 (pour IPv6 :  globalement, pour IPv4 : 
# par Zone et globalement pour les User)
# - Vérification unicité (par Zone, globalement pour les User) et format des hostname et hostalias
# - Vérification format Zone
# - Vérification existence uidProprio et en minuscule
# - Vérification adéquation Zone -> adresse IPv4
# - Vérification adéquation adresse IPv4 -> Zone
# - Vérification objectClass unique: reselMachine
# - Vérification champ lastDate entre demain et il y a 3 an la vérification du champ lastDate 
# n'est pas effectué pour les machines en zone inactive et les serveurs 

# Vérification de la branche ou=admins,dc=resel,dc=enst-bretagne,dc=fr
# - Vérification unicité uid
# - Vérification unicité objectClass reselAdmin
# - Vérification liste droits

# Vérification de la branche cn=*,ou=*,ou=reseau,dc=resel,dc=enst-bretagne,dc=fr
# - Vérification objectClass correct: reselSwitch
# - Vérification cn unique
# - Vérification existence machine/switch dans la branche machines
# - Vérification existence type switch dans branche switchs
# - Vérification numéro unité entre 1 et 4.

# Vérification de la branche portnumber=*,cn=*,ou=*,ou=reseau,dc=resel,dc=enst-bretagne,dc=fr
# - Vérification objeclass unique: switchPort
# - Vérification unicité attribution chambre
# - Vérification uplink: vide

# Vérification des branches ou=(anciens|divers|people),dc=maisel,dc=enst-bretagne,dc=fr
# - Vérification unique uid et uid en minuscule
# - Vérification objectClass (pas guest et enstb en même temps !)
# - Vérification UPPERCASE lastName
# - Vérification Majuscule firstName et pas tout en majuscule
# - Vérification format adresse mail (unicité ?) (minuscule)

# Vérification de la branche ou=organisations,dc=maisel,dc=enst-bretagne,dc=fr
# -# Vérification de la branche ou=sites,dc=resel,dc=enst-bretagne,dc=fr
# - Vérification que cn match bien un user UNIX valide
# - Vérification que cnOrga existe (si != NULL)
# - Vérification que siteAccess et siteVisibility prennent soit la valeur EXT,EXT_RESEL ou INT
# - Vérification que memberUid est bien webmaster
# - Vérification que, si cnOrga != NULL, alors mainDir, vhosts et siteName ne sont pas vides
# - Vérification que, si cnOrga == NULL, alors mainDir est NULL

 Vérification que cn match un uid unix et est unique
# - Vérification que l'objectClass ne contient rien d'autre que tbClub, tbAsso, tbCampagne, ou studentOrganisation
# - Vérification que uidPrezs existent, et que promo > promo actuel - 4

# Vérification de la branche ou=webmasters,$branche_maisel
# - Vérification de l'existence de la personne
# - Vérification de la cohérence de objectClass
# - Vérification que les webmasters sont membres d'au moins un club

Synchro LDAP École

(TODO: Le nouveau site ne le gérant pas encore, ça serait pas très utile de le documenter maintenant)

Réplication Brest-Rennes

(TODO: https://trac.resel.fr/wiki/Services/LDAP#R%C3%A9plicationBrest-Rennes je ne suis pas sûr que ces infos sont correctes)

## Bugs connus

  • Janvier 2016 : Il y a une erreur au démarrage, pour que cela fonctionne il faut le lancer le démon slapd en mode débug.

Ressources utiles

Articles liés

TODO (rédacteur)

  • Synchro LDAP
  • Réplication LDAP
  • Installation et configuration

* Documentation de certains objets LDAP et l'utilité de chacun de leur champs

Rédigé depuis :