exploitation LDAP
This commit is contained in:
parent
f48dc87ae3
commit
a46cc11b2a
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
Reference in New Issue