Description
Le LDAP est la base de donnée centrale au ResEl. C'est dans cette base de donnée que sont enregistrés toutes les informations concernant les utilisateurs et leurs machines, les clubs, ainsi que les serveurs du ResEl.
Le LDAP pour Lightweight Directory Access Protocol est à l'origine un protocole et sert de norme pour l'architecture d'un annuaire. Un serveur LDAP permet de gérer un arbre LDAP.
Mise en place
Pour gérer le LDAP, le ResEl utilise la suite OpenLDAP, dont le serveur est slapd (pour stand alone LDAP daemon).
Le serveur LDAP est hébergé sur la machine Beaune à Brest et Lussac à Rennes qui fait de la réplication LDAP.
Le serveur LDAP écoute sur ldap.adm.resel.fr, le port est 389 pour une connexion non-sécurisée ou 636 pour une connexion TLS. Le LDAP n'est accessible que depuis le vlan admin. Le DNS a une entrée ldap.resel.fr pointant vers le serveur selon le campus.
En plus de cela, un service de synchronisation, syncrepl permet de synchroniser les arbres entre les deux serveurs. Beaune est maître. Voir replication.
Un script permet la vérification de l'intégrité du LDAP. Voir intégrité.
Structure de l'arbre
(en gras, les branches les plus importantes)
-
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 (voir sites des clubs pour des détails précis sur cette branche)
- ou=snmp : alias snmp pour les différents switchs
Description des objets ResEl
Un annuaire LDAP contiennent des branches, dans ces branches, on peut avoir des groupes organizationalUnit
, puis finalement à la fin de la hiérarchie, on trouve des éléments commonName
. Chaque élément est une instance d'une classe (objectClass
) et ces objets contiennent des attributs.
Pour son utilisation, le ResEl a défini quelques objets LDAP spécifiques, vous pouvez les retrouver dans la configuration, voici une description :
Classes définies :
- enstbPerson : pesonne ayant un compte ecole (tt le monde sur l'annuaire)
- maiselPerson : personne ayant une chambre a la maisel
- reselPerson : personne ayant au moins une machine au resel
- mailPerson : personne ayant un compte mail sur le resel
- aePerson : personne membre de l'Association des Eleves
- club : un club
- poste : un poste dans un club
- machine : une machine ayant une ip sur le resel
- administrateur : personne ayant des droits d'administration sur le resel
- reselSwitch : switch (contenant des ports comme fils)
- switchPort : association port/(No de chambre ou autre switch ou rien)
- snmpType : type de switch, ses fils d?crivent comment manipuler un switch
- mib : reference vers une valeur lisible (voire modifiable) du switch
- mibValue : valeur possible pour un mib donn?
- guestPerson : personne residant a la MaisEl temporairement mais ne disposant pas de compte ecole
Utilisation
Interfaces admins
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.
Manuellement
Lire dans le LDAP
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à deux solutions :
- Se connecter sur Beaune et lancer
ldapvi
dessus :
Si vous avez les droits nécessaire, vous pouvez faire les modifications que vous voulez.ldapvi --discover
- En local, éditer
~/.ldaprc
Puis on peut lancer :HOST ldap.adm.resel.fr BINDDN uid=mon_login,ou=admins,dc=resel,dc=enst-bretagne,dc=fr TLS_CACERT chemin/vers/ca.pem
ldapvi -d -D uid=mon_login,ou=admins,dc=resel,dc=enst-bretagne,dc=fr
Export avec ldapsearch
On peut exporter des portions du LDAP au format LDIF avec ldapsearch :
ldapsearch -LLL -x -H ldap://lussac.adm.maisel.rennes.enst-bretagne.fr -b "dc=resel,dc=enst-bretagne,dc=fr"
-LLL Affichage au format LDIF (sans commentaires, sans version LDIF)
-x Authentification simple (sans utiliser SASL)
-D dn DN de connexion
-W Demande le mot de passe
-h uri URI du serveur LDAP
-b base Base de la recherche
-s scope Etendue de la recherche (base, one, sub)
-S "attr" trie selon l'attribut
Scripting
Si vous avez besoin d'accéder au ldap dans des scripts, ou depuis quelconque code d'un projet ResEl il existe quelques ressources sur internet :
Les filtres LDAP
Pour faire des recherches, on peut utiliser des filtres. La syntaxe pour faire ces filtres suit la notation polonaise inversée :
(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 ou=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 suivante :
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. 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)
Ajout d'un nouveau switch
ObjectClass reselMachine Importer dans le LDAP en remplacant host par le nom du switch :
dn: host=pessac,ou=machines,dc=resel,dc=enst-bretagne,dc=fr
host: pessac
objectClass: reselMachine
uidProprio: uid=reselMachine,ou=people,dc=maisel,dc=enst-bretagne,dc=fr
zone: Rennes
zone: SW-Adm
ipHostNumber: 0.7
lastDate: 20101017000000Z
macAddress: 00:1c:57:4b:42:41
ObjectClass: reselSwitch
Importer dans le LDAP en remplacant l'ou=C1 par l'emplacement du switch, le cn et host par le nom du switch. Il faut aussi incrémenter unite:
dn: cn=pessac,ou=C1,ou=reseau,dc=resel,dc=enst-bretagne,dc=fr
objectClass: reselSwitch
cn: pessac
machine: host=pessac,ou=machines,dc=resel,dc=enst-bretagne,dc=fr
switchType: type=C3750,ou=snmp,dc=resel,dc=enst-bretagne,dc=fr
unite: 1
Configuration
La configuration du LDAP fait l'objet d'un versionnage sur le dépôt Git confs/LDAP. N'oubliez pas de commitez vos modifications !
La configuration du serveur slapd se trouve sur Beaune et Lussac dans /etc/ldap
.
Le dépôt contient la configuration du maître (Beaune), et de l'esclave (Lussac), donc les fichiers peuvent êtres en double, suffixés par un -master
ou un -slave
. On a les fichiers suivants :
-
slapd.conf
: configuration principale. Existe en version maîtreslapd-master.conf
et esclaveslapd-slave.conf
. C'est le seul fichier qui a besoin d'être renommé enslapd.conf
sur la machine. Chaque fichier inclus les autres fichiers avec le bon nom. -
access.ldap
: configure les droits nécéssaires pour accéder en lecture ou en écriture à une partie du LDAP. Existe en versionaccess-master.ldap
etaccess-slave.ldap
. overlay-chain.ldap
replication-maisel.ldap
replication-resel.ldap
-
rootdn.ldap
: Existe en versionrootdn-master.ldap
etrootdn-slave.ldap
. -
schema/
: dossier contenant les schémas. -
ssl/
ettls/
: dossiers contenant les configurations et certificats pour la sécurisation SSL/TLS.
L'utilitaire slaptest
permet de tester la validité de la configuration du serveur.
Le daemon est géré par un simple service SysVinit : service slapd (start|stop|restart|status)
Important : Ne jamais lancer slapd en tant que root
Général
Voici des éléments importants de la configuration du LDAP :
Dans master.cf
, on commence par définir divers paramètres de fonctionnement du serveur, on inclut les fichiers de configurations annexes, notemment les schémas LDAP.
include /etc/ldap/schema/resel-14628.schema
include /etc/ldap/access-master.ldap
La première ligne inclut les schémas spécifiques au ResEl, la seconde inclut les règles d'accès aux éléments du LDAP en configurant les droits. Voir les parties suivantes pour plus de détails.
Ensuite on configurer l'emplacement des certificats TLS.
TLSVerifyClient never
TLSCertificateKeyFile /etc/ldap/tls/ldap-key.pem.nopass
TLSCertificateFile /etc/ldap/tls/ldap-crt.pem
TLSCACertificateFile /etc/ldap/tls/cacert.pem
Divers configurations pour les pid files et log files, certains paramètres de lancement définis dans le fichier /var/run/slapd/slapd.args
.
Puis des définitions des noms des modules noyaux qui vont être lancés par sladp.
Enfin commence la configuration elle même des bases de données.
On commence par indiquer que le backend est bdb : backend bdb
.
On déclare la branche ldap maisel
avec :
database bdb
suffix "dc=maisel,dc=enst-bretagne,dc=fr"
Puis la configuration de cette branche suit, on commence par définir le DN root et le mot de passe root contenus dans le fichier include /etc/ldap/rootdn-master.ldap
. Puis le chemin de sauvegarde physique de la BDD directory "/var/lib/ldap/maisel"
et finalement divers options d'indexing et d'activation de fonctionnalité comme memberof
.
Les lignes suivantes active la synchronisation de la branche.
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 100
Puis la configuration de la branche resel
suit, configurée de la même manière.
Schéma
La configuration de schémas est incluses dans tout les fichiers schema/*.schema
. Elle configure tout les objectClass et attributeType décrits dans la section Mise en place.
Voici la syntaxe des fichiers de schéma.
Création d'un attribut
Syntaxe :
attributetype ( 1.3.6.1.4.1.14628.3.0 NAME 'firstName'
DESC 'Prénom'
EQUALITY caseIgnoreMatch
ORDERING caseIgnoreOrderingMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE )
Le numéro 1.3.6.1.4.1.14628.3.0
définit ??
Le champ syntaxe
??
Création d'un ObjectClass
Syntaxe:
objectclass ( 1.3.6.1.4.1.14628.1.7 NAME 'reselMachine' STRUCTURAL
DESC 'Machine ayant une IP et une entrée dans le DNS'
MUST ( host $ uidProprio $ ipHostNumber $ macAddress $ zone )
MAY ( hostAlias $ lastDate $ ipv6HostNumber $ paramConn $ duidHostNumber $ ipv6HostPrefix $ description $ group ) )
Le champ MUST
précise les attributs obligatoires à renseigner, MAY
ceux optionnels.
Droits
La configuration des droits est définie dans acces-(slave|master).conf
À Brest, on définit globalement les règles suivantes :
- Accès au CN Monitor par l'utilisateur
admin
(pas les admins en général). - Accès au CN accesslog par un ldapadmin (cn ayant le champ droit
ldapadmin
), l'admin et le replicator. - Accès au CN à divers élements (et le droit associé) aux admins ayant le droit en question. (Voir l'article gestion des droits des admins
- Accès au mot de passe par l'utilisateur lui même, par un ladpadmin, par le replicator en lecture, par tout le monde en comparaison.
- Accès à la clé privé d'un admin par lui même, ansible et le replicator en lecture
- Accès au branche organisation et au sites par les membres qui sont dans le memberUid du site, ou les reseladmin.
- Acces à tout par tout le monde en lecture.
Explication de la syntaxe
Voir la documentation officielle pour plus de détails.
La syntaxe est la suivante :
access to <champ>
by <regle dacces> <droit>
Globalement, on configure l'accès à un endroit précis du LDAP via le champ, cela peut être sous la forme d'un DN : dn.subtree="cn=Monitor"
, ce DN va préciser le CN précise, ou tout une branche ou un groupe ; ou plus généralement avec des wildcars comme *
.
On peut un attribut avec attrs=droit
ou plus spécifiquement l'attribut d'un objet précis avec attrs=<attr> dn.subtree=<dn_voulu>
.
Puis les règles d'accès consiste à vérifier comparer le CN de l'utilisateur qui accède (car tout les utilisateurs qui accèdent au LDAP se connectent avec un CN du LDAP). On peut donc vérifier que le cn vaut exactement quelque chose by dn.exact="cn=admin,dc=maisel,dc=enst-bretagne,dc=fr"
ou être plus précis en vérifiant un attribut du CN : set.exact="user/droit* & [ldapadmin]" write
.
Dans cette règle d'accès, this
pointe sur l'élément auquel on tente d'accéder, et user
pointe sur l'utilisateur qui veut y accéder. On accède aux valeurs des attributs par le /
. On précise une chaîne telle quelle entre [ ]
Pour vérifier une égalité de champs, on peut utilise set.exact="this/attr1 & user/attr2", ou
set.exact="user/attr & [foo]"
Finalement le droit est soit read soit write ou compare. Le droit compare est par exemple utile pour vérifier si un mot de passe est le bon sans avoir à le lire.
Réplication Brest-Rennes
On utilise pour la réplication SyncRepl, la configuration dans le fichier replication-resel.ldap
et replication-maisel.ldap
, un fichier par branche.
Le LDAP de Rennes établi une connexion persistante vers l’annuaire maître et synchronise l’annuaire en temps réel. Il est possible de vérifier que la connexion est bien établie avec la commande netstat :
sudo netstat -naptu | grep "ESTABLISHED.*slapd"
Le résultat de cette commande doit montrer une connexion TCP établie entre l’adresse IP de l’esclave et l’adresse IP du maître sur le port 389 ou 636 (TLS) suivant ce qui est défini dans les fichiers replication-resel.ldap et replication-maisel.ldap.
Documentation sur la réplication LDAP:
Synchro avec le LDAP école
(TODO: Le nouveau site ne le gérant pas encore, ça serait pas très utile de le documenter maintenant)
Sur l'ancien site admin RA2 :
Lorsqu'un personne enregistré auprès de l'école, souhaite un accès au resel, il est possible de récupèrer son compte depuis le ldap de l'école. Il suffit d'aller dans RA2, dans synchro ldap, https://admin.resel.fr/ldap/synchro.php , puis de remplir le champ de recherche avec un filtre de recherche ldap.
Script
Il existe un script permettant d'importer une promo code source.
Scripts
Désactivation des machines
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 /srv/ldap/desactivation_machines.pl
sur Beaune permet de désactiver les machines absentes du réseau depuis longtemps.
Il est lancé par un cron à une fréquence 37 13 * * 1
Son code source est versionné et est disponible dans ResEl/scripts.
Vérification de l'intégrité
Le script /srv/ldap/check_ldap.pl
situé sur Beaune permet de vérifier l'intégrité du LDAP.
Il est lancé par un cron à une fréquence 37 */4 * * *
.
Son code source est versionné est disponible dans ResEl/scripts.
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.
Liens utiles
Articles connexes
Ressources externes
- Page Wikipedia sur le LDAP
- Le manuel de ldapvi
- OpenLDAP
- Repo de la configuration
- Note sur la synchro LDAP
TODO (rédacteur)
- Documentation de certains objets LDAP et l'utilité de chacun de leurs champs
- Configuration générale, de synchro, et des droits + détail de la syntaxe