Cette page détaille la mise en oeuvre de Grouper V2 à Rennes1 :
synchro incrémentale PspChangeLogConsumer toutes les 10 secondes
Les choix de noms ont été conditionnés par les rendus des différents services (grouper-ui, annuaires) et la gestion par dossiers. C'est pour cela que nous avons mis dans des branches différentes les services, les UFR et les laboratoires.
Pour la facilité des utilisateurs finaux, nous avons essayé de garder une sémantique unique à chaque niveau de l'arborescence.
Le dossier de premier niveau (racine) s'appelle "Etablissements" , car nous sommes dans un contexte multi-établissements.
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 (ID Path) : 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 principes suivants sont adoptés pour construire les arborescences des groupes des personnels et des étudiants:
avec :
Ils sont issus d'Harpege et reflètent les différents niveaux des structures:
L'identifiant des dossiers : ser, ufr, lab
Ils sont issus d'Apogee et sont classés par inscription administrative selon le plan de classement suivant :
"2014-2015" ("2014") > “Inscriptions Administratives” ("IA") > libellé composante (code Apogee) > type de diplôme (code Apogee) > version de diplôme (code Apogee) > version d'étape (code Apogee) |
NB : il est prévu à moyen terme de développer la branche "Inscription Pédagogique".
Nous souhaitons que l'administration de ces groupes soit faite par une (ou plusieurs) personne nommée.
La pricipale difficulté pour ces administrateurs est de savoir quand il faut créer un profil applicatif, quand créer un groupe d'accès à une ressource, et surtout quand créer un groupe oragnisationnel ou fonctionnel:
Ils sont classés selon leur type :
les groupes sont relatifs à une application (service métier, GED, sympa, ...)
les applications sont classées par domaine ("Communication", "GRH", "Stockage partagé", etc ...)
exemple : les rôles pour le référencement des thèses
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
Correspondance_attributs_grouper_ldap.pdf
Les alimentations à partir des bases métiers et la base grouper se font par deux outils développés en interne à Rennes1 :
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.
Chaque groupe est géré par son administrateur désigné.
De plus en plus de groupes non-institutionnels sont issus d'un base de données tierce (les correspondants téléphonie de Harpege, les contributeurs Nuxeo, les administrateurs Gestimmo, etc...) via grouperLoader : ce sont surtout des rôles applicatifs.
Les autres s'appuient la plupart du temps sur les groupes institutionnels des personnels et étudiants pour constituer la liste de leurs membres qui sera maintenue automatiquement à jour.
Cette bonne pratique évitera des soucis de déprovisionning par la suite, en cas de modification de situation des membres : changement de structure, de catégorie, de mise à disposition ...
L'"administrateur délégué" pourra :
Le "gestionnaire délégué" pourra :
Le "gestionnaire délégué" ne pourra pas :
Le « lecteur » pourra seulement :
Le membre d'un groupe délégué pourra :
La DSI a souhaité garder le controle sur les délégations.
Le demandeur soumet sa requête dans le helpdesk. A la réception la DSI lance un script gsh de génération du dossier qui aura les propriétés suivantes :
L'administrateur délégué peut alors créer son arborescence :
Délégation pour la prise en main des partages de l'IUT sur le NAS de l'université
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:.....:tous" // les administrateurs Grouper qui auront le droit d'administrer le groupe des administrateurs delegues administrateursGrouper="...: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 de Rennes 1 dossierDesPersonnels = StemFinder.findByName(grouperSession, "ur1:pers"); // les groupes institutionnels des etudiants de Rennes 1 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éation 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 delegué 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és 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 à jour/consultation des membres des groupes du dossier delegué 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éation de groupes dans le dossier: RuleApi.inheritFolderPrivileges(SubjectFinder.findRootSubject(), dossierADeleguer , Stem.Scope.SUB, gestionnaires.toSubject(), Privilege.getInstances("create")); // visibilités 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 delegué 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")); |
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-grouper-to-openldap, a ceci-près:
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)
La configuration PSP est tirée de psp-exemple-grouper-to-active-directory.
Les groupes institutionnels sont tous des groupes grouperLoader branchés sur Harpege et Apogee : l'execution des requêtes SQL se fait toutes les heures
Ce sont les bases métier qui fixent les règles de déprovisionning. Les membres des groupes institutionnels des personnels et étudiants sont toujours à jour, grâce à grouperLoader.
Les cas de changement de situation peuvent être :
Comme vu plus haut, le compte d'un utilisateur référencé comme membre de groupes non-institutionnels peut avoir expiré. Il apparaitra alors comme “entité non trouvée” dans Grouper. Il ne sera jamais versé comme membre de groupe dans les annuaires (sources des personnes), cependant un nettoyage régulier sera lancé pour supprimer leurs appartenances dans Grouper.
./bin/gsh.sh -usdu -source rennes1:ldap -delete |
NB : les groupes non-institutionnels devenus vides sont conservés dans Grouper et donc dans les annuaires.