exploitation LDAP

This commit is contained in:
Thomas NOËL 2015-02-19 13:05:00 +01:00
parent f48dc87ae3
commit a46cc11b2a
2 changed files with 389 additions and 1 deletions

View File

@ -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)

View File

@ -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