Cette page détaille la mise en oeuvre de Grouper V2 à Rennes1 : classification adoptée pour les groupes, les mécanismes d'alimentation à partir des bases métier, et les versements dans les annuaires.
Contexte -besoins
- gérer des groupes ad hoc (non-institutionnels) avec possibilité de délégation de droits
- gérer des groupes institutionnels issus des bases "métiers" : structure Harpège et structure des enseignements Apogée
- synchroniser les bases métiers, le référentiel Grouper et les services d'annuaires
- gestion multi-établissements
Organisation globale
Arborescence des groupes
Les choix de noms ont été conditionnés par les rendus des différents services (grouper-ui, annuaires) et la gestion par dossiers.
La racine
Le dossier de premier niveau (racine) s'appelle "Etablissements" , car nous sommes dans un contexte multi-établissements.
Le niveau établissement
Chaque établissement contient cinq dossiers:
Deux dossiers contiennent les groupes institutionnels (Etudiants , Personnels) et les trois autres les groupes non-institutionnels (Applications et services, Ressources, Autres groupes).
L'identifiant des dossiers : etu, pers, app, res, div
NB : il n'y a pas de dossier Administrateurs à ce niveau : les groupes des administrateurs délégués sont définis dans les dossiers eux-mêmes
Les groupes institutionnels de l'établissement
| Les principes suivants sont adoptés pour construire les arborescences des groupes des personnels et des étudiants:
avec :
Les groupes des PersonnelsIls sont issus d'Harpege et reflètent les différents niveaux des structures:
L'identifiant des dossiers : ser, ufr, lab Les groupes des EtudiantsIls sont issus d'Apogee et sont classés par inscription administrative selon le plan de classemement suivant année > “Inscription Administrative” > composante > type de diplôme > version de diplôme > version d'étape |
---|
Les groupes non institutionnels
Ces groupes peuvent être gérés par un administrateur délégué.
Ils sont classés selon leur type :
profils applicatifs ("Applications et services")
les groupes sont relatifs à une application (service métier, GED, sympa, ...)
les applications sont classées par domaine ("Communication", "GRH", "Stockage partagé", etc ...)
ressources informatiques ("Ressources")
ces groupes permettent de contôler l'accès/l'utilisation de ressources matérielles
deux types de ressources actuellement : imprimantes et postes de travail
exemple : les groupes d'utilisateurs autorisés pour chaque imprimante de la DSI
les autres groupes ("Autres groupes")
- ce sont des groupes transversaux de nature organisationnelle (projet, communication, collaboration,...) et fonctionnelle (correspondants téléphonie, correspondants techniques de la DSI, ...)
- ils sont internes à une structure ("Recherche", "Services", "Ufr,instituts,écoles") mais peuvent aussi êtres communs à plusieurs structures ("Communs", "Projets UdR", "Partages")
exemple : les correspondants de la DSI
Les règles de nommage des groupes et dossiers non-institutionnels
Les dossiers
Les groupes
Correspondance des champs dans Grouper et des attributs ldap
Correspondance_attributs_grouper_ldap.pdf
Alimentation des groupes
Groupes institutionnels
Les alimentations à partir des bases métiers et la base grouper se font par deux outils développés en interne à Rennes1 :
- le programme java synchroGrpInstit (esup-commons-2) qui permet de créer toute l'arborescence des personnels à partir d'Harpege : les services, les UFR et les laboratoires sous les branches respectives "Personnels/Services" , "Personnels/Ufr,instituts, écoles" et "Personnels/Laboratoires"
- le job Talend qui permet de créer toute l'arborescence des étudiants à partir d'Apogee sous la branche "Etudiants"
Ces batchs lisent les structures Apogée/Harpège et leurs membres et créent des fichiers de lot de commandes à la norme "grouper shell" qui contient les ordres de création/modification des groupes et de leurs membres.
Le fichier lot de commande est ensuite exécuté par le shell grouper.
Groupes manuels
Chaque groupe est géré par son administrateur désigné.
Délégation à un administrateur désigné
Les règles adoptées
L'"administrateur délégué" pourra :
- créer des sous-dossiers et des groupes dans le dossier qu'il administre,
- administrer les groupes du dossier qu'il administre,
- voir les groupes du dossier qu'il administre
- ajouter/supprimer des membres (personnes et/ou groupes) de ces groupes,
- voir la liste des membres de ces groupes,
- créer des groupes (ouverts ou fermés, fermés par défaut),
- attribuer tous les privilèges à d'autres personnes/groupes,
- voir tous les groupes institutionnels,
- voir les membres des groupes institutionnels,
- les droits d'administration « suivent » dans la sous-arborescence
Le "gestionnaire délégué" pourra :
- voir les groupes du dossier qu'il accède,
- ajouter/supprimer des membres (personnes et/ou groupes) de ces groupes, sauf celui des administrateurs délégués,
- voir la liste des membres de ces groupes,
- voir tous les groupes institutionnels (personnels et étudiants),
- voir les membres des groupes institutionnels,
- les droits de modification « suivent » dans la sous-arborescence
Le "gestionnaire délégué" ne pourra pas :
- administrer/créer des groupes
- créer des dossiers
Le « lecteur » pourra seulement :
- lire les membres des groupes délégués
- voir les autres groupes délégués
- les droits de lecture « suivent » dans la sous-arborescence
Le membre d'un groupe délégué pourra :
- lire les autres membres du groupe
Le modèle de délégation proposé
La DSI a souhaité garder le controle sur les délégation.
Le demandeur soumet sa requête écrite par ticket. A la réception la DSI lance un script gsh de génération du dossier qui aura les propriétés suivantes :
- les administrateurs Grouper administrent le groupe « Administrateurs »
- le groupe « Administrateurs »
- administre les groupes « Gestionnaires » et « Lecteurs »
- peut créer des groupes et des sous-dossiers dans le dossier délégué
- contient un seul membre : le demandeur de la délégation (ce peut être une personne ou un groupe)
- le groupe « Gestionnaires »
- peut voir, lire et mettre à jour les membres du groupe « Lecteurs »
- Il est vide
- Le groupe « Lecteurs » est vide
L'administrateur délégué peut alors créer son arborescence :
- lors de la création d'un sous-dossier par l'administrateur délégué, les privilèges de création de groupes et de sous-dossiers est donné au groupe « Administrateurs »
- lors de la création, par l'administrateur délégué, d'un groupe dans un sous-dossier :
- le privilège d'administration de groupes est donné au groupe « Administrateurs »
- le privilège de mise à jour des membres est donné au groupe « Gestionnaires »
- le privilège de lecture des membres du groupe est donné au groupe « Lecteurs »
- et ainsi de suite … (délégation totale sur toute l'arborescence) .
Exemple
Délégation pour la prise en main des partages de l'IUT sur le NAS de l'université
- le groupes des administrateurs Grouper gerde évidemment le droit d'administration sur tous les dossiers et groupes existants et futurs,
- le groupe "Administrateurs NAS DSI" a le droit d'administration sur tous les dossiers et groupes existants et futurs du dossier "NAS DSI" ,
- le groupe "Administrateurs IUT de Rennes" a le droit d'administration sur tous les dossiers et groupes existants et futurs du dossier "IUT de Rennes" ,
- le groupe "Gestionnaires NAS DSI" a le droit de mise à jour sur tous les groupes existants et futurs du dossier "NAS DSI" ,
- le groupe "Gestionnaires IUT de Rennes" a le droit de mise à jour sur tous les groupes existants et futurs du dossier "IUT de Rennes" ,
- le groupe "Lecterus NAS DSI" a le droit de voir les membres des groupes existants et futurs du dossier "NAS DSI" ,
- le groupe "Lecteurs IUT de Rennes" a le droit devoir les membres des groupes existants et futurs du dossier "IUT de Rennes" .
Code
Le code du script gsh est basé sur les règles d'héritage de Grouper V2 :
// DELEGATION : REGLES D'HERITAGE DES PRIVILEGES grouperSession = GrouperSession.startRootSession(); // // PARAMETRESi A RENSEIGNER: // le dossier a deleguer chemin = "ur1:app:stockage:nas" id = "920" nom = "IUT de Rennes" dossier = chemin + ":" +id description = "" // le demandeur : une personne ou un groupe demandeur="ur1:pers:ser:957:57in:57sys:tous" // les administrateurs Grouper qui auront le droit d'administrer le groupe des administrateurs delegues administrateursGrouper="ur1:ress:adm" // DOSSIER A DELEGUER dossierADeleguer = addStem(chemin, id, nom); dossierADeleguer = StemFinder.findByName(grouperSession, dossier); RuleApi.reassignStemPrivilegesIfFromGroup(SubjectFinder.findRootSubject(),dossierADeleguer, Stem.Scope.SUB); RuleApi.reassignGroupPrivilegesIfFromGroup(SubjectFinder.findRootSubject(), dossierADeleguer, Stem.Scope.SUB); // setStemAttr(dossierADeleguer.getName(),"description",description); // GROUPES A CREER // le groupe des administrateurs locaux administrateurs = addGroup(dossierADeleguer.getName(),"adm","Administrateurs "+ nom); administrateurs = GroupFinder.findByName(grouperSession, dossierADeleguer.getName()+":adm"); // le groupe des gestionnaires locaux gestionnaires = addGroup(dossierADeleguer.getName(),"ges","Gestionnaires "+ nom); gestionnaires = GroupFinder.findByName(grouperSession, dossierADeleguer.getName()+":ges"); // // le groupes des lecteurs des membres des groupes delegues lecteurs = addGroup(dossierADeleguer.getName(),"lec","Lecteurs "+ nom); lecteurs = GroupFinder.findByName(grouperSession, dossierADeleguer.getName()+":lec"); // // GROUPES INSTITUTIONNELS // les groupes institutionnels des personnels dossierDesPersonnels = StemFinder.findByName(grouperSession, "ur1:pers"); // les groupes institutionnels des etudiants dossierDesEtudiants = StemFinder.findByName(grouperSession, "ur1:etu"); // // GROUPES NON-INSTITUTIONNELS // les groupes applicatifs de Rennes 1 dossierApplicatifs = StemFinder.findByName(grouperSession, "ur1:app"); // les groupes des ressources de Rennes 1 dossierDesRessources = StemFinder.findByName(grouperSession, "ur1:ress"); // les autres groupes de Rennes 1 dossierAutresGroupes = StemFinder.findByName(grouperSession, "ur1:div"); // // Droits admin sur le groupe des administrateurs locaux , pour les administrateurs de Grouper grantPriv(administrateurs.getName(), administrateursGrouper, AccessPrivilege.ADMIN); // DELEGATION AUX ADMINISTRATEURS LOCAUX // droit de créion de sous-dossiers et de groupes dans le dossier delegue grantPriv(dossierADeleguer.getName(), administrateurs.getName(), NamingPrivilege.STEM); grantPriv(dossierADeleguer.getName(), administrateurs.getName(), NamingPrivilege.CREATE); addMember(administrateurs.getName(),demandeur); RuleApi.inheritFolderPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("stem, create")); // droit d'administraion des groupes du dossier delegue grantPriv(gestionnaires.getName(), administrateurs.getName(), AccessPrivilege.ADMIN); grantPriv(lecteurs.getName(), administrateurs.getName(), AccessPrivilege.ADMIN); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("admin")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("update")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("read")); // visibilitées sur les groupes institutionnels et non-institutionnels RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesPersonnels , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesPersonnels , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesEtudiants , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesEtudiants , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierApplicatifs , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierApplicatifs , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesRessources , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesRessources , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierAutresGroupes , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierAutresGroupes , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); // // DELEGATION AUX GESTIONNAIRES LOCAUX // droits de mise à our/consultation des membres des groupes du dossier delegue grantPriv(lecteurs.getName(), gestionnaires.getName(), AccessPrivilege.UPDATE); grantPriv(lecteurs.getName(), gestionnaires.getName(), AccessPrivilege.READ); grantPriv(lecteurs.getName(), gestionnaires.getName(), AccessPrivilege.VIEW); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, gestionnaires.toSubject(), Privilege.getInstances("update")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, gestionnaires.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, gestionnaires.toSubject(), Privilege.getInstances("view")); // droit de créion de groupes dans le dossier: RuleApi.inheritFolderPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, gestionnaires.toSubject(), Privilege.getInstances("create")); // visibilitées sur les groupes institutionnels et non-institutionnels RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesPersonnels , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesPersonnels , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesEtudiants , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesEtudiants , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierApplicatifs , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierDesRessources , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierAutresGroupes , Stem.Scope.SUB, administrateurs.toSubject(), Privilege.getInstances("view")); // // DELEGATION AUX LECTEURS LOCAUX // droit de consultation du contenu des groupes du dossier delegue RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, lecteurs.toSubject(), Privilege.getInstances("read")); RuleApi.inheritGroupPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, lecteurs.toSubject(), Privilege.getInstances("view"));
Synchronisation Grouper - Services d'annuaires
Grouper - annuaire ldap "global"
L'annuaire appelé "ldap global" est l'annuaire LDAP de référence, utilisé pour l'authentification et les recherche de personnes
La synchronisation se fait avec l'outil "PSP"
Les groupes sont placés dans une branche "ou=groupes", à plat (pas d'arborescence)
Les appartenances indirectes sont traduites en appartenances individuelles directes
La synchronisation met aussi à jour l'attribut "memberOf" de chaque personne
La configuration de PSP est conforme à psp-example-openldap:
Grouper - annuaire active directory
L'annuaire est utilisé pour la gestion des droits sur des espaces de stockage partagés, pour la configuration des postes de travail , pour la définition des autorisations aux imprimantes
La synchronisation se fait avec l'outil "PSP"
Les groupes sont placés dans une unité organisationnelle "ougroupes", en conservant l'arborescence de la base grouper
L'attribut sAMAccountName reçoit la valeur de l'id_path grouper avec conversion des ":" en "_" (obsolète)
Configuration PSP:
Résolution des correspondances d'attributs