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