e637b8c417df4b1a85ee5cba8c425dcfb8e34571
Services/LDAP.md
... | ... | @@ -0,0 +1,254 @@ |
1 | +Lightweight Directory Access Protocol (LDAP) |
|
2 | +======================================= |
|
3 | + |
|
4 | +## Généralités |
|
5 | + |
|
6 | +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. |
|
7 | + |
|
8 | +Le LDAP est hébergé sur la machine [Beaune](Serveurs/Beaune), un machine à rennes dont je ne trouve pas le nom fait réplication LDAP. Le service utilisé est OpenLDAP. |
|
9 | + |
|
10 | +**Important : Ne jamais lancer slapd en tant que root (flo ne le répétera assez)** |
|
11 | + |
|
12 | +## Structure de l'arbre |
|
13 | + |
|
14 | + * dc=maisel,dc=enst-bretagne,dc=fr |
|
15 | + * ou=anciens |
|
16 | + * ou=club-old : ancienne branche, n'est plus utilisée |
|
17 | + * ou=clubs : ancienne branche, n'est plus utilisée |
|
18 | + * ou=divers |
|
19 | + * ou=organisations : associations et clubs du campus |
|
20 | + * ou=people : personnes inscrites au ResEl |
|
21 | + * ou=webmasters : tous les webmasters |
|
22 | + * dc=resel,dc=enst-bretagne,dc=fr |
|
23 | + * cn=replicator |
|
24 | + * ou=admins : admins ResEl |
|
25 | + * ou=machines : machines inscrites au ResEl |
|
26 | + * ou=reseau : switch du ResEl |
|
27 | + * ou=sites : sites web (fortement lié avec golf) |
|
28 | + * ou=snmp : alias snmp pour les différents switchs |
|
29 | + |
|
30 | +## Lire dans le LDAP |
|
31 | + |
|
32 | +Pour les lectures courantes (de la part d'administrateurs), il est conseillé d'utiliser [l'interface admin](https://admin.resel.fr). Vous ne risquez pas de faire trop de betises avec. |
|
33 | + |
|
34 | +Dans certains cas, il est nécessaire de faire des requêtes personnalisés. Dans ce cas il est conseillé d'utiliser [phpLdapAdmin](https://admin.resel.fr/phpldapadmin/). Sinon vous pouvez vous connecter sur [Beaune](Serveurs/Beaune) et lancer `ldapvi` dessus : |
|
35 | + |
|
36 | +``` |
|
37 | +ldapvi --discover |
|
38 | +``` |
|
39 | + |
|
40 | +Si vous avez les droits nécessaire, vous pouvez faire les modifications que vous voulez. |
|
41 | + |
|
42 | +Si vous avez besoin d'accéder au ldap dans des scripts il existe quelques ressources sur internet : |
|
43 | +* https://www.python-ldap.org/ |
|
44 | +* https://github.com/pyldap/pyldap |
|
45 | + |
|
46 | +### La syntaxe LDAP |
|
47 | + |
|
48 | +La syntaxe pour faire une recherche LDAP est relativement simple : |
|
49 | +``` |
|
50 | +(OPERATEUR_BOOLÉEN(attribut OPERATEUR_BINAIRE valeur)(attribut OPERATEUR_BINAIRE valeur)...) |
|
51 | +``` |
|
52 | +Les opérateurs booléens étant : |
|
53 | + * la négation : `!` |
|
54 | + * la conjonction (ET) : `&` |
|
55 | + * la disjonction (OU) : `|` |
|
56 | + |
|
57 | +Les opérateurs binaires étant : |
|
58 | + * Égalité : `=` |
|
59 | + * Approximation : `~=` |
|
60 | + * Supérieur ou égal : `>=` |
|
61 | + * Inférieur ou égal : `<=` |
|
62 | + |
|
63 | +Les opérateurs binaires restant s'obtiennent par combinaison des autres. |
|
64 | + |
|
65 | +#### Exemples |
|
66 | + |
|
67 | +Tous les uid ou firstname ou lastname ou nickname ou orgaName contenant "a" |
|
68 | +``` |
|
69 | +(|(uid=*a*)(firstname=*a*)(lastname=*a*)(nickname=*a*)(orgaName=*a*)) |
|
70 | +``` |
|
71 | + |
|
72 | +Toutes les personnes ayant leur numéro de téléphone renseigné dans la base : |
|
73 | +``` |
|
74 | +(&(objectclass=person)(telephoneNumber=*)) |
|
75 | +``` |
|
76 | + |
|
77 | +Toutes les personnes dont le nom commence par 'A' et n'habitant pas Paris : |
|
78 | +``` |
|
79 | +(&(objectclass=person)(cn=A*)(!(location=Paris))) |
|
80 | +``` |
|
81 | + |
|
82 | +Toutes les personnes dont le nom ressemble à Febvre (Faivre, Fèvre, Lefebvre, ...): |
|
83 | +``` |
|
84 | +(&(objectclass=person)(cn~=febvre)) |
|
85 | +``` |
|
86 | + |
|
87 | +Idem que le premier exemple en excluant la branche eou=club-old,dc=maisel,dc=enst-bretagne,dc=fr : |
|
88 | +``` |
|
89 | +(&(|(uid=*musique*)(firstname=*musique*)(lastname=*musique*)(nickname=*musique*)(orgaName=*musique*)) |
|
90 | +(!(entryDN:dnSubtreeMatch:=ou=club-old,dc=maisel,dc=enst-bretagne,dc=fr))) |
|
91 | +``` |
|
92 | + |
|
93 | +### Les URL et URI LDAP |
|
94 | + |
|
95 | +Afin d'accéder rapidement à une ressource, nous pouvons utiliser une url ldap de la forme suivance : |
|
96 | +``` |
|
97 | +ldap[s]://<hostname>:<port>/<base_dn>?<attributes>?<scope>?<filter>?<extensions> |
|
98 | +``` |
|
99 | + |
|
100 | +avec les paramètres suivants: |
|
101 | + * `hostname` : Adresse du serveur. L'adresse peut être absente, le client est supposé connaître un serveur LDAP à contacter, en fonction du contexte. |
|
102 | + * `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. |
|
103 | + * `base_dn` : DN de l'entrée qui est le point de départ de la recherche. |
|
104 | + * `attributes` : Les attributs que l'on veut récupérer, séparés par des virgules. |
|
105 | + |
|
106 | +Si la valeur n'est pas remplie, ou si elle est rempli avec une '''*''', tous les attributs d'usage userApplication doivent être retournés. |
|
107 | + * `scope` : La profondeur de la recherche dans l'arbre : base, one ou sub. |
|
108 | + * `filter` : Le filtre de recherche, tel que nous venons de le définir. Le filtre par défaut est (objectClass=*). |
|
109 | + * `extensions` : Les extensions sont un moyen pour pouvoir ajouter des fonctionnalités aux URLs |
|
110 | + |
|
111 | +LDAP tout en gardant la même syntaxe. On peut mettre inclure plusieurs extensions dans une URL, en les séparant par des `,`. |
|
112 | + |
|
113 | +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. |
|
114 | + |
|
115 | +#### Exemple |
|
116 | +Les genericPerson dans la branche dc=maisel,dc=enst-bretagne,dc=fr |
|
117 | +``` |
|
118 | +ldaps://ldap.resel.fr:636/dc=maisel,dc=enst-bretagne,dc=fr??sub?(objectclass=genericPerson) |
|
119 | +``` |
|
120 | + |
|
121 | +## Écrire dans le LDAP |
|
122 | + |
|
123 | +Pour la plupart des modifications faites dans le LDAP (ajout de machine ou de personne) il est recommandé de passer par le [site admin](https://admin.resel.fr/) |
|
124 | + |
|
125 | +Pour d'autres modifications plus avancées vous pouvez utiliser [phpLdapAdmin](https://admin.resel.fr/phpadmin.resel.fr) |
|
126 | + |
|
127 | +Si vraiment vous voulez tout casser, il vous reste quelques solutions : :) |
|
128 | + |
|
129 | +### ldapvi |
|
130 | + |
|
131 | +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 : |
|
132 | + |
|
133 | +Éditer `~/.ldaprc` |
|
134 | + |
|
135 | +``` |
|
136 | +# ~/.ldaprc |
|
137 | + |
|
138 | +HOST ldap.maisel.enst-bretagne.fr |
|
139 | +BINDDN uid=mon_login,ou=admins,dc=resel,dc=enst-bretagne,dc=fr |
|
140 | +TLS_CACERT chemin/vers/ca.pem |
|
141 | +``` |
|
142 | + |
|
143 | +Se créer un alias pour le lancer comme il faut, c'est-à-dire : |
|
144 | +``` |
|
145 | +ldapvi -d -D uid=mon_login,ou=admins,dc=resel,dc=enst-bretagne,dc=fr |
|
146 | +``` |
|
147 | + |
|
148 | +Il faut rajouter cette ligne à votre .zshrc ou .bashrc (en modifiant le login) : |
|
149 | +``` |
|
150 | +alias ldapresel="ldapvi -d -D uid=mon_login,ou=admins,dc=resel,dc=enst-bretagne,dc=fr" |
|
151 | +``` |
|
152 | +Il vous suffira ensuite de taper "ldapresel". |
|
153 | + |
|
154 | + |
|
155 | +## Configuration et installation |
|
156 | +*On ne le saura peut être jamais...* |
|
157 | + |
|
158 | +## Informations complémentaires sur le LDAP |
|
159 | + |
|
160 | +Les machines du ResEl ( machines utilisateurs et serveur ) sont enregistrées dans le ldap avec un type `reselmachine` qui contient un champ `lastdate`. |
|
161 | + |
|
162 | +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. |
|
163 | + |
|
164 | + |
|
165 | +Le script check_ldap.pl situé sur Beaune qui vérifie l'intégrité du LDAP. |
|
166 | +-> il est disponible ici : https://git.resel.fr/resel/scripts/blob/master/ldap/check_ldap.pl |
|
167 | + |
|
168 | +``` |
|
169 | +# Vérification de la branche ou=machines,dc=resel,dc=enst-bretagne,dc=fr |
|
170 | +# - Vérification unicité et format des adresses MAC |
|
171 | +# - Vérification unicité et format des adresses IPv4 et IPv6 (pour IPv6 : globalement, pour IPv4 : |
|
172 | +# par Zone et globalement pour les User) |
|
173 | +# - Vérification unicité (par Zone, globalement pour les User) et format des hostname et hostalias |
|
174 | +# - Vérification format Zone |
|
175 | +# - Vérification existence uidProprio et en minuscule |
|
176 | +# - Vérification adéquation Zone -> adresse IPv4 |
|
177 | +# - Vérification adéquation adresse IPv4 -> Zone |
|
178 | +# - Vérification objectClass unique: reselMachine |
|
179 | +# - Vérification champ lastDate entre demain et il y a 3 an la vérification du champ lastDate |
|
180 | +# n'est pas effectué pour les machines en zone inactive et les serveurs |
|
181 | + |
|
182 | +# Vérification de la branche ou=admins,dc=resel,dc=enst-bretagne,dc=fr |
|
183 | +# - Vérification unicité uid |
|
184 | +# - Vérification unicité objectClass reselAdmin |
|
185 | +# - Vérification liste droits |
|
186 | + |
|
187 | +# Vérification de la branche cn=*,ou=*,ou=reseau,dc=resel,dc=enst-bretagne,dc=fr |
|
188 | +# - Vérification objectClass correct: reselSwitch |
|
189 | +# - Vérification cn unique |
|
190 | +# - Vérification existence machine/switch dans la branche machines |
|
191 | +# - Vérification existence type switch dans branche switchs |
|
192 | +# - Vérification numéro unité entre 1 et 4. |
|
193 | + |
|
194 | +# Vérification de la branche portnumber=*,cn=*,ou=*,ou=reseau,dc=resel,dc=enst-bretagne,dc=fr |
|
195 | +# - Vérification objeclass unique: switchPort |
|
196 | +# - Vérification unicité attribution chambre |
|
197 | +# - Vérification uplink: vide |
|
198 | + |
|
199 | +# Vérification des branches ou=(anciens|divers|people),dc=maisel,dc=enst-bretagne,dc=fr |
|
200 | +# - Vérification unique uid et uid en minuscule |
|
201 | +# - Vérification objectClass (pas guest et enstb en même temps !) |
|
202 | +# - Vérification UPPERCASE lastName |
|
203 | +# - Vérification Majuscule firstName et pas tout en majuscule |
|
204 | +# - Vérification format adresse mail (unicité ?) (minuscule) |
|
205 | + |
|
206 | +# Vérification de la branche ou=organisations,dc=maisel,dc=enst-bretagne,dc=fr |
|
207 | +# -# Vérification de la branche ou=sites,dc=resel,dc=enst-bretagne,dc=fr |
|
208 | +# - Vérification que cn match bien un user UNIX valide |
|
209 | +# - Vérification que cnOrga existe (si != NULL) |
|
210 | +# - Vérification que siteAccess et siteVisibility prennent soit la valeur EXT,EXT_RESEL ou INT |
|
211 | +# - Vérification que memberUid est bien webmaster |
|
212 | +# - Vérification que, si cnOrga != NULL, alors mainDir, vhosts et siteName ne sont pas vides |
|
213 | +# - Vérification que, si cnOrga == NULL, alors mainDir est NULL |
|
214 | + |
|
215 | + Vérification que cn match un uid unix et est unique |
|
216 | +# - Vérification que l'objectClass ne contient rien d'autre que tbClub, tbAsso, tbCampagne, ou studentOrganisation |
|
217 | +# - Vérification que uidPrezs existent, et que promo > promo actuel - 4 |
|
218 | + |
|
219 | +# Vérification de la branche ou=webmasters,$branche_maisel |
|
220 | +# - Vérification de l'existence de la personne |
|
221 | +# - Vérification de la cohérence de objectClass |
|
222 | +# - Vérification que les webmasters sont membres d'au moins un club |
|
223 | +``` |
|
224 | + |
|
225 | +## Synchro LDAP École |
|
226 | + |
|
227 | +(TODO: Le nouveau site ne le gérant pas encore, ça serait pas très utile de le documenter maintenant) |
|
228 | + |
|
229 | +## Réplication Brest-Rennes |
|
230 | +(TODO: https://trac.resel.fr/wiki/Services/LDAP#R%C3%A9plicationBrest-Rennes je ne suis pas sûr que ces infos sont correctes) |
|
231 | + |
|
232 | + ## Bugs connus |
|
233 | + |
|
234 | +* 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. |
|
235 | + |
|
236 | +## Ressources utiles |
|
237 | +* [Page Wikipedia sur le LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) |
|
238 | +* [Le manuel de ldapvi](http://www.lichteblau.com/ldapvi/manual/) |
|
239 | +* [OpenLDAP](http://www.openldap.org/) |
|
240 | + |
|
241 | +## Articles liés |
|
242 | +* [Beaune](Serveurs/Beaune) |
|
243 | + |
|
244 | +## TODO (rédacteur) |
|
245 | +* Synchro LDAP |
|
246 | +* Réplication LDAP |
|
247 | +* Installation et configuration |
|
248 | +* Documentation de certains objets LDAP et l'utilité de chacun de leur champs |
|
249 | +------ |
|
250 | + |
|
251 | +Rédigé depuis : |
|
252 | +* https://trac.resel.fr/wiki/Services/LDAP |
|
253 | +* https://trac.resel.fr/wiki/Doc/Howto/LDAP |
|
254 | +* https://redmine.resel.fr/projects/netservices/wiki/LDAP |