From a46cc11b2ab61230f5d9645aa056368ae6c3c06f Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Thu, 19 Feb 2015 13:05:00 +0100 Subject: [PATCH] exploitation LDAP --- documentation/Makefile | 3 +- documentation/exploitation-ldap.md | 387 +++++++++++++++++++++++++++++ 2 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 documentation/exploitation-ldap.md diff --git a/documentation/Makefile b/documentation/Makefile index ced4c31..2d0ffba 100644 --- a/documentation/Makefile +++ b/documentation/Makefile @@ -3,7 +3,8 @@ PANDOCFLAGS=--standalone --smart --toc -c pandoc.css ALL=installation-base.pdf installation-base.html \ installation-ldap.pdf installation-ldap.html \ installation-ldapsaisie.pdf installation-ldapsaisie.html \ - installation-idp.pdf installation-idp.html + installation-idp.pdf installation-idp.html \ + exploitation-ldap.pdf exploitation-ldap.html all: $(ALL) 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,` : 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=,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 +