summaryrefslogtreecommitdiffstats
path: root/documentation/exploitation-ldap.md
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/exploitation-ldap.md')
-rw-r--r--documentation/exploitation-ldap.md387
1 files changed, 387 insertions, 0 deletions
diff --git a/documentation/exploitation-ldap.md b/documentation/exploitation-ldap.md
new file mode 100644
index 0000000..3d3883c
--- /dev/null
+++ b/documentation/exploitation-ldap.md
@@ -0,0 +1,387 @@
+% 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`
+
+-----
+
+Historique du document
+======================
+
+> 20150217 tnoel -- première version
+