summaryrefslogtreecommitdiffstats
path: root/documentation/exploitation-ldap.md
blob: 82afdf2d4ec90296377dddc4afc51d56b79ae265 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
% Gestion d'identités PSL -- Exploitation LDAP
% Entr'ouvert SCOP -- http://www.entrouvert.com


Service `slapd`
===============

Le serveur LDAP est `slapd` du projet OpenLDAP.

Arrêt et démarrage du service
-----------------------------

`slapd` est démarré lors du boot de la machine et arrêté lors d'un _shutdown_. En dehors de ces moments, les commandes suivantes sont disponibles:

* `service slapd status` : état du service
* `service slapd stop` : arrêt du service
* `service slapd start` : démarrage du service
* `service slapd restart` : arrêt puis redémarrage du service


Logs
----

`slapd` envoie ses logs systèmes dans syslog, on y voit principalement le
démarrage ou l'arrêt du service. Par défaut c'est enregistré dans
`/var/log/syslog`.

Les logs des requêtes sont enregistrés dans la base LDAP, sous différents
suffixes:

* `cn=config-accesslog` : pour les accès à la configuration
* `cn=accesslog,<suffixe>` : pour les bases créées ensuite, par exemple
  `cn=accesslog,dc=univ-foobar,dc=fr`

L'accès à ces logs se fait via un client LDAP, par exemple avec `ldapsearch`:

	# ldapsearch -Y EXTERNAL -H ldapi:// -b "cn=config-accesslog" \
	  "(&(reqStart>=20150212091000.000000Z)(reqEnd<=20150212091500.000000Z))"

renvoie la liste des requêtes sur la configuration entre 9h10 et 9h15 le 12
février 2015.


Commande slapd-supann
=====================

Le pilotage bas niveau des données et configurations de l'annuaire LDAP
s'effectue via une commande spécifique développée dans le cadre de ce projet:
`slapd-supann`

	# slapd-supann help
	syntaxe: slapd-supann commande ...

	commandes disponibles:
	help		cette aide
	import		import d'un ou plusieurs fichiers LDIF
	metasync	synchronise un annuaire distant dans le méta-annuaire local
	newdb		création d'une nouvelle base, avec un nouveau suffixe
	reset		mise à zéro complète
	restore		restauration des données depuis un répertoire
	save		sauvegarde de la configuration et des données


Mise à zéro (_reset_)
---------------------

La commande `reset` met à zéro la configuration du LDAP (conformance norme
SUPANN 2009) ainsi que toute les données:

	# slapd-supann reset

Rappel : cette commande **efface toutes les données LDAP**, y compris les
configurations.


Ajout d'une base (_newdb_)
--------------------------

La commande `newdb` permet d'ajouter une base dans le LDAP, typiquement avec le
suffixe de l'établissement `dc=quelquechose,dc=fr`.

La commande est interactive, elle pose quelques questions puis créé une
nouvelle base dans l'annuaire, avec un administrateur dédié dont il faudra
saisir le mot de passe. Exemple de réponses aux questions :

	# slapd-supann newdb
	Suffixe de la base à créer (exemple : dc=dauphine,dc=fr) :
	-> dc=quelquechose,dc=fr

	Choisir un mot de passe administrateur (uid=admin,ou=people,dc=quelquechose,dc=fr) :
	-> 
	Une nouvelle fois :
	-> 

	Nom de l'organisation (o=...) :
	uniquement des majuscules, sans accent
	Exemple: ENS
	-> QUELQUECHOSE

	Code de l'établissement, préfixé par son origine (supannEtablissement={ORIG}CODE)
	Exemples :
	 {UAI}0350936C          Université de Rennes 1
	 {SIRET}18004312700067  AMUE
	 {CNRS}MOY1400          Délégation régionale de Toulouse du CNRS
	-> {UAI}0610000X

	Récapitulatif :
	 Suffixe : dc=quelquechose,dc=fr
	     Nom : QUELQUECHOSE
	Code UAI : {UAI}0610000X
	DN entité établissement : supannCodeEntite=QUELQUECHOSE,ou=structures,dc=quelquechose,dc=fr

	Créer cette base ? (taper oui)
	-> oui

	Chargement de la définition de la nouvelle base annuaire (/tmp/newdbsUdiiW.ldif) :
	(add) olcDatabase={1}mdb,cn=config
	(add) olcDatabase={1}mdb,cn=config
	(add) olcOverlay={0}syncprov,olcDatabase={1}mdb,cn=config
	(add) olcOverlay={1}accesslog,olcDatabase={2}mdb,cn=config
	(add) olcOverlay={2}refint,olcDatabase={2}mdb,cn=config
	(add) olcOverlay={3}constraint,olcDatabase={2}mdb,cn=config
	(add) olcOverlay={4}unique,olcDatabase={2}mdb,cn=config
	(add) dc=quelquechose,dc=fr
	(add) ou=people,dc=quelquechose,dc=fr
	(add) uid=admin,ou=people,dc=quelquechose,dc=fr
	(add) ou=structures,dc=quelquechose,dc=fr
	(add) supannCodeEntite=QUELQUECHOSE,ou=structures,dc=quelquechose,dc=fr
	(add) ou=groups,dc=quelquechose,dc=fr
	(add) cn=admin,ou=groups,dc=quelquechose,dc=fr
	OK
	# 

Résultat :

* une base `dc=quelquechose,dc=fr` est ajoutée dans l'annuaire
* l'administrateur attribué à cette base est
  `uid=admin,ou=people,dc=quelquechose,dc=fr` avec le mot de passe choisi lors
  de la commande `newdb`.
* les logs des requêtes sur cette base sont dans
  `cn=accesslog,dc=quelquechose,dc=fr`


Import de données (_import_)
----------------------------

La commande `import` permet d'importer des fichiers LDIF dans l'annuaire. Syntaxe:

	# slapd-supann import fichier1.ldif fichier2.ldif ...

* les fichiers LDIF doivent être correctement formatés et contenir des données à la
  norme SUPANN 2009
* les mots de passes en clair dans les fichier LDIF sont automatiquement
  chiffrés en utilisant l'algorithme SHA1 salé.
* `import` effectue une mise à jour des enregistrement déjà chargés

Exemple d'un fichier à importer:

	# cat import.ldif             # exemple de fichier à importer
	dn: uid=bdauvergne,ou=people,dc=quelquechose,dc=fr
	objectClass: inetOrgPerson
	objectClass: eduPerson
	objectClass: supannPerson
	givenName: Benjamin
	sn: Dauvergne
	cn: Dauvergne Benjamin
	displayName: Benjamin Dauvergne
	supannCivilite: M.
	supannEtablissement: {UAI}0610000X
	supannListeRouge: FALSE
	preferredLanguage: fr
	supannMailPerso: bdauvergne@entrouvert.com
	eduPersonNickname: bdauvergne
	uid: bdauvergne
	supannAliasLogin: bdauvergne
	eduPersonPrincipalName: bdauvergne@quelquechose.fr
	mail: bdauvergne@quelquechose.fr

Lancement de l'import:

	# slapd-supann import import.ldif
	- added entry uid=bdauvergne,ou=people,dc=quelquechose,dc=fr
	  - supanncivilite : M.
	  - displayname : Benjamin Dauvergne
	  - cn : Dauvergne Benjamin
	  - objectclass : inetOrgPerson, eduPerson, supannPerson
	  - edupersonnickname : bdauvergne
	  - supannmailperso : bdauvergne@entrouvert.com
	  - preferredlanguage : fr
	  - edupersonprincipalname : bdauvergne@quelquechose.fr
	  - sn : Dauvergne
	  - supannetablissement : {UAI}0610000X
	  - mail : bdauvergne@quelquechose.fr
	  - givenname : Benjamin
	  - supannlisterouge : FALSE
	  - supannaliaslogin : bdauvergne
	  - uid : bdauvergne

Résultat visible dans la base, par exemple en utilisant `ldapsearch`:

	# ldapsearch -Y EXTERNAL -H ldapi:// -b "dc=quelquechose,dc=fr" "uid=bdauvergne"


Note: pour voir tous les logs concernant l'entrée
`uid=bdauvergne,ou=people,dc=quelquechose,dc=fr` on regarderait
dans `cn=accesslog,dc=quelquechose,dc=fr` :

	# ldapsearch -Y EXTERNAL -H ldapi:// -b "cn=accesslog,dc=quelquechose,dc=fr" \
	  "reqDN=uid=bdauvergne,ou=people,dc=quelquechose,dc=fr"


Sauvegarde (_save_)
-------------------

La commande _save_ créée un répertoire de sauvegarde dans lequel toute la
**configuration** et toutes les **données** de toutes les bases de l'annuaire
sont enregistrées.

Ce répertoire est destiné à la commande `restore`, pour restaurer l'annuaire
dans l'état exact du `save`.

Par défaut, le répertoire est créé dans `/var/backups/`.

Exemple d'exécution :

	# slapd-supann save 
	Sauvegarde de la configuration et des données slapd
	dans le répertoire /var/backups/slapd-save-20150219T122440
	  Export de la configuration dans /var/backups/slapd-save-20150219T122440/config.ldif ..
	ok
	  Export de le base 1 ..
	ok
	  Export de le base 2 ..
	ok
	(...)
	Sauvegarde des certificats SSL ..ok
	Efface les fichiers vides ..
	ok

	/var/backups/slapd-save-20150219T122440 contient :
	total 132
	-rw-r--r-- 1 root root 57122 févr. 19 12:24 config.ldif
	-rw-r--r-- 1 root root 40349 févr. 19 12:24 db-1.ldif
	-rw-r--r-- 1 root root  4480 févr. 19 12:24 db-2.ldif
	-rw-r--r-- 1 root root   431 févr. 19 12:24 db-4.ldif
	-rw-r--r-- 1 root root 14937 févr. 19 12:24 db-5.ldif
	-rw-r----- 1 root root  1704 févr. 19 12:24 slapd.key
	-rw-r--r-- 1 root root  1038 févr. 19 12:24 slapd.pem

Note: la commande `save` essaye de sauvegarder toutes les bases présentes, mais
certaines peuvent être vides voire inexistantes. Il peut donc y avoir
d'**éventuels affichages de messages d'erreurs** lors de l'exécution de la
commande, sans autre conséquence.

Attention: le répertoire de sauvegarde contient la clé privée `slapd.key`,
stockée en clair. À ne pas mettre entre toutes les mains…

Restauration (_restore_)
------------------------

La commande `restore` permet de remettre le serveur LDAP dans l'état exact de
la sauvegarde. Il faut fournir en argument de la commande un répertoire crée
par la commande `save`.

Attention: la commande `restore` **efface complètement** et définitivement la
configuration et toutes les données actuelle du serveur.

Exemple d'exécution :

	# slapd-supann restore /var/backups/slapd-save-20150219T122440/

	  *************
	  *           *   La configuration et toutes les données
	  * ATTENTION *   de l'annuaire LDAP vont être définitivement
	  *           *   effacées. Avez-vous fait un backup ?
	  *************

	Confirmez la MISE A ZÉRO COMPLÈTE avant restauration.

	Tapez oui en toutes lettres : oui
	[ ok ] Stopping OpenLDAP: slapd.
	Effacement des données actuelles ..ok

	Restauration du config.ldif ..
	_#################### 100.00% eta   none elapsed            none fast!         
	Closing DB...

	Restauration des certificats SSL ..
	ok

	Restauration de la base 1 ..
	-#################### 100.00% eta   none elapsed                 spd  39.4 k/s 
	Closing DB...
	Restauration de la base 2 ..
	_#################### 100.00% eta   none elapsed            none fast!         
	Closing DB...
	Restauration de la base 4 ..
	_#################### 100.00% eta   none elapsed            none fast!         
	Closing DB...
	Restauration de la base 5 ..
	_#################### 100.00% eta   none elapsed            none fast!         
	Closing DB...

	[ ok ] Starting OpenLDAP: slapd.
	# 


Méta-annuaire `o=meta` (_metasync_)
-----------------------------------

L'alimentation du méta-annuaire _o=meta_ s'effecture au travers de la commande
`metasync` qui permet de synchroniser un annuaire distant dans une branche
`dc=<distant>,o=meta`.

L'annuaire distant doit être **strictement SUPANN 2009**, c'est-à-dire:

* la racine utilise les classes _organization_, _dcObject_, _eduOrg_ et _supannOrg_
* les sous-branches organisationelles `ou=people`, `ou=structures` et `ou=groups`
  utilisent la classe _organizationalUnit_
* les groupes utilisent les classes _groupOfNames_ et _supannGroupe_
* les utilisateurs utilisent les classes _inetOrgPerson_, _eduPerson_ et _supannPerson_
* les entités utilisent les classes _supannEntite_ et _organizationUnit_ pour
  les sous-entités ou _supannEntite_, _organization_, _eduOrg_, _supannOrg_ pour
  les entités racines
* **aucune autre classe n'est utilisée**

Cette dernière contrainte est importante, par exemple `metasync` ne pourra pas
opérer sur un Active Direcory "supannisé" de façon partielle laissant
apparaitre une classe _user_.


Syntaxe de la commande:

	slapd-supann metasync [--quiet] [--fake] ldap_uri ldap_newbasedn
	                      ldap_basedn [ldap_binddn] [ldap_bindpwd]

* `ldap_uri` est l'URI du LDAP distant, par exemple `ldap://ldap.univ-test.fr/`
* `ldap_newbasedn` est l'emplacement local où l'annuaire sera synchronisé. Le
  suffixe doit absolument être **`o=meta`**, par exemple `dc=univ-test,o=meta`.
  Attention, le suffixe ne doit contenir **qu'un seul niveau par rapport au dn de
  base du méta-annaire `o=meta`** (`dc=univ-test,dc=fr,o=meta` ne marchera pas)
* `ldap_basedn` le base DN de l'annuaire distant, ex.: `dc=univ-test,dc=fr`
* `ldap_binddn` et `ldap_bindpwd` : identifiants et mots de passe pour accéder
  à l'annuaire distant (optionnels)
* option `--quiet` : limite l'affichage aux seules erreurs
* option `--fake` : calcule et affiche les actions nécessaires à la
  synchronisation mais ne les effectue pas

Exemple d'exécution:

	# slapd-supann metasync ldap://ldap.univ-test.fr dc=univ-test,o=meta \
	      dc=univ-test,dc=fr uid=admin,ou=people,dc=univ-test,dc=fr motdepasse
	Synchronizing LDAP directory at uid=admin,ou=people,dc=univ-test,dc=fr locally.
	BaseDN: dc=univ-test,dc=fr
	BindDN: uid=admin,ou=people,dc=univ-test,dc=fr
	BindPWD: admin
	Actions:
	- Create dc=univ-test,o=meta
	- Create ou=groups,dc=univ-test,o=meta
	- Create ou=people,dc=univ-test,o=meta
	- Create ou=structures,dc=univ-test,o=meta
	- Create cn=admin,ou=groups,dc=univ-test,o=meta
	- Create uid=admin,ou=people,dc=univ-test,o=meta
	- Create uid=bdauvergne,ou=people,dc=univ-test,o=meta
	- Create supannCodeEntite=test1,ou=structures,dc=univ-test,o=meta
	- Create supannCodeEntite=test2,ou=structures,dc=univ-test,o=meta
	- Create supannCodeEntite=racine,ou=structures,dc=univ-test,o=meta
	- Create supannCodeEntite=test3,ou=structures,dc=univ-test,o=meta
	- Create supannCodeEntite=test4,ou=structures,dc=univ-test,o=meta
	Waiting for completion..  done

_Note technique_ : l'outil de synchronisation utilise l'extension LDAP
`PagedResult` permettant de parcourir sans limitation la plupart des serveurs
LDAP. Pour OpenLDAP la limitation par défaut s'applique même avec cette
extension. Pour permettra la synchronisaton on ajoutera la ligne de
configuration suivante dans la section de la base concernée sur le serveur
distant:

> `limits * size.prtotal=unlimited`

Rappel: attention à l'horloge des machines, à la fois celle de la présente
solution mais aussi celle de l'annuaire distant. Toutes les machines en jeu
doivent être en permanence **parfaitement à l'heure** sous peine de grave
dysfonctionnement.

La lecture du méta-annuaire se fait via des comptes de lecture dans la branche
ou=readers,o=meta. Un premier compte est initialisé nommé
uid=reader,ou=readers,o=meta ayant le mot de passe « reader ». Pour changer ce mot de passe on pourra faire (en tant que root):

	ldappasswd -Y EXTERNAL -H ldapi:// -s "new-password" uid=reader,ou=readers,o=meta

Pour créer d'autres utiliateurs on utilisera ldapvi, en s'inspirant des
utilisateurs existant:

	ldapvi -b ou=readers,o=meta

Mise à jour
===========

La mise à jour du système doit être effectuée aussi fréquement que possible,
typiquement une fois par jour (mises à jour de sécurité Debian). Entr'ouvert
informera aussi le projet en cas de mise à jour urgente de sécurité à
effectuer sur les composants mis en jeu par la solution.

La procédure de mise à jour est la suivante, en **deux étapes**.

Mise à jour de la liste des logiciels disponibles sur les dépôts de la solution
(Debian et Entr'ouvert):

> `# apt-get update`

Mise à jour des paquets qui ont une version plus récente que celle installée :

> `# apt-get upgrade`


Il est possible que des versions futures de la solution nécessitent
l'installation de nouveaux paquets, dans ce cas Entr'ouvert mettra à jour les
dépendances de ses paquets et il faudra utiliser la commande `apt-get
dist-upgrade`.

-----

Historique du document
======================

> 20150217 tnoel -- première version
> 20150624 bdauvergne -- ajout documentation accès en lecture au méta-annuaire