Contexte -besoins
- gérer des groupes ad hoc avec possibilité de délégation de droits
- gérer des groupes institutionnels issus des bases "métiers" : structure Harpège et structure des enseignement 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.
Le dossier de premier niveau (racine) s'appelle "Groupes", faute d'avoir trouvé quelque chose de mieux. Dans une gestion mono-établissement, le nom de l'établissement conviendrait mieux...
En deuxième niveau, six dossiers (2 globaux + 4 établissements) :
- Administrateurs : Groupes des administrateurs de services ou d'applications, contient un groupe par service. Pas développé pour l'instant
- Applications : Droits d'accès aux applications. Contient un dossier par application, chaque dossier applicatif contient N groupes selon les types d'accès gérés par chaque application (par exemple, concultation et modification). Les groupes de chaque dossier seront gérés par l'administrateur de l'application.
- Université Rennes1 : Groupes internes à l'établissement. Contient les dossiers de troisième niveau :
- etu : étudiants. Contient un groupe "tous_etu" (tous les étudiants) + les dossiers
- comp : composantes. contient un groupe "tous_etu" (tous les étudiants des composantes) + un dossier par composante
- Chaque dossier composante contient un groupe "tous_etu" (tous les étudiants de la composante) + un dossier par étape.
- Chaque dossier étape contient un groupe "tous_etu" (tous les étudiants de l'étape) + un dossier par version d'étape
- Chaque dossier version d'étape contient un groupe "tous_etu" (tous les étudiants de la version d'étape)
- Les membres du groupe "tous les étudiants des composantes" sont les groupes "tous les étudiants de la composante", donc un étudiant est membre indirect de ce groupe. Idem pour les niveaux inférieurs. On ne trouve donc normalement des membres individuels qu'aux niveaux version d'étapes.
- 4S : comptes non issus des bases métiers
- transversaux : pour groupes de travail ou transversaux
- comp : composantes. contient un groupe "tous_etu" (tous les étudiants des composantes) + un dossier par composante
- pers : personnels. Contient un groupe "tous_pers" (tous les personnels) + les dossiers
- comp :Même organisation que le dossier "etu", avec des niveaux selon les structures Harpège (composante, service, etc.)
- labos : laboratoires de recherches : même organisation
- 4S : comptes non issus des bases métiers
- transversaux : pour groupes de travail ou transversaux
- exetu : anciens diplômés
- lecteurs : possesseurs d'une carte de bibliothèque universitaire
- retraites : anciens personnels
- transversaux : groupes de travail
- etu : étudiants. Contient un groupe "tous_etu" (tous les étudiants) + les dossiers
- ENSCR, IEP, UEB : un dossier pour chaque établissement supplémentaire géré
Tableau de l'arborescence des groupes (projet) : Proposition d'arborescence de groupes Grouper.pdf
Types de groupes
On distingue deux types de groupes :
- les groupes institutionnels, constitués automatiquement à partir des bases métier Apogés et Harpège. ces groupes sont placés dans les dossiers :
- etu/comp
- pers/comp
- pers/labos
- les groupes dits ad hoc ou manuels, gérés individuellements par un administrateur
Nommage des groupes et attributs
Correspondance_attributs_grouper_ldap.pdf
Alimentation des groupes
Groupes institutionnels
La synchronisation entre les bases métiers et la base grouper se fait par un outil développé en interne r1 : synchroGrpInstit (esup-commons-2)
Ce programme batch lit les structures Apogée/Harpège et leurs membres et crée un fichier 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 designé par l'interface web de grouper : grouper-ui, ou grouper-ui lite
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 "LDAPPC"
Les groupes sont placés dans une branche "groups", à plat (pas d'arborescence)
Les appartenances indirectes sont traduites en appartenances indiciduelles directes
La synchronisation met aussi à jour l'attribut "memberOf" de chaque personne
Configuration ldappc :
<?xml version="1.0" encoding="utf-8"?> <ldappc> <grouper> <group-queries> <subordinate-stem-queries> <stem-list> <stem>groupes</stem> </stem-list> </subordinate-stem-queries> </group-queries> <groups structure="flat" root-dn="ou=Groups,${edu.vt.middleware.ldap.base}" ldap-object-class="groupOfNames" ldap-rdn-attribute="cn" grouper-attribute="name" provision-member-groups="false" > <group-members-dn-list list-object-class="groupOfNames" list-attribute="member" /> <group-attribute-mapping ldap-object-class="groupOfNames"> <group-attribute-map group-attribute="displayExtension" ldap-attribute="description" /> </group-attribute-mapping> </groups> <memberships> <member-groups-list list-object-class="inetuser" list-attribute="memberOf" naming-attribute="name" temporary-directory="" /> </memberships> </grouper> <source-subject-identifiers> <source-subject-identifier source="rennes1:ldap" subject-attribute="id"> <ldap-search base="ou=people,${edu.vt.middleware.ldap.base}" scope="subtree_scope" filter="(uid={0})" on-not-found="warn" /> </source-subject-identifier> </source-subject-identifiers> </ldappc>
Grouper - annuaire active directory
L'annuaire est utilisé pour la gestion des droits sur des espaces partagés
La synchronisation se fait avec l'outil "LDAPPC"
Les groupes sont placés dans une unité organisationnelle "groupes", en conservant l'arborescence de la base grouper
L'attribut sAMAccountName reçoit la valeur de l'id_path grouper avec conversion des ":" en "_"
Configuration ldappc :
<?xml version="1.0" encoding="utf-8"?> <ldappc> <grouper> <group-queries> <subordinate-stem-queries> <stem-list> <stem>groupes</stem> </stem-list> </subordinate-stem-queries> </group-queries> <groups structure="bushy" root-dn="ou=GROUPER,ou=rennes1,${edu.vt.middleware.ldap.base}" ldap-object-class="group" ldap-rdn-attribute="cn" grouper-attribute="name" bundle-modifications="false" > <group-members-dn-list list-object-class="group" list-attribute="member" /> <resolver-attribute-mapping ldap-object-class="group"> <resolver-attribute-map resolver-attribute="grouptypead" ldap-attribute="groupType" ldap-attribute-empty-value="-2147483646"/> <resolver-attribute-map resolver-attribute="sAMAccountName" ldap-attribute="sAMAccountName" /> </resolver-attribute-mapping> </groups> </grouper> <source-subject-identifiers> <source-subject-identifier source="rennes1:ldap" subject-attribute="id"> <ldap-search base="ou=rennes1,${edu.vt.middleware.ldap.base}" scope="subtree_scope" filter="(cn={0})" on-not-found="warn" /> </source-subject-identifier> </source-subject-identifiers> </ldappc>
Résolution des correspondances d'attributs :
<?xml version="1.0" encoding="UTF-8"?> <AttributeResolver xmlns="urn:mace:shibboleth:2.0:resolver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:resolver="urn:mace:shibboleth:2.0:resolver" xmlns:ad="urn:mace:shibboleth:2.0:resolver:ad" xmlns:dc="urn:mace:shibboleth:2.0:resolver:dc" xmlns:grouper="http://grouper.internet2.edu/shibboleth/2.0" xsi:schemaLocation=" urn:mace:shibboleth:2.0:resolver classpath:/schema/shibboleth-2.0-attribute-resolver.xsd urn:mace:shibboleth:2.0:resolver:dc classpath:/schema/shibboleth-2.0-attribute-resolver-dc.xsd urn:mace:shibboleth:2.0:resolver:ad classpath:/schema/shibboleth-2.0-attribute-resolver-ad.xsd http://grouper.internet2.edu/shibboleth/2.0 classpath:/schema/shibboleth-2.0-grouper.xsd"> <!-- group data connector --> <resolver:DataConnector id="groupDataConnector" xsi:type="grouper:GroupDataConnector"> </resolver:DataConnector> <resolver:AttributeDefinition xsi:type="Script" xmlns="urn:mace:shibboleth:2.0:resolver:ad" id="sAMAccountName" sourceAttributeID="name"> <resolver:Dependency ref="groupDataConnector" /> <Script><![CDATA[ // Import Shibboleth attribute provider importPackage(Packages.edu.internet2.middleware.shibboleth.common.attribute.provider); value = name.getValues().get(0); value = value.replaceAll("\\/", "_"); value = value.replaceAll("\\/", "_"); value = value.replaceAll("\\[", "_"); value = value.replaceAll("\\]", "_"); value = value.replaceAll("\\:", "_"); value = value.replaceAll("\\;", "_"); value = value.replaceAll("\\|", "_"); value = value.replaceAll("\\=", "_"); value = value.replaceAll("\\,", "_"); value = value.replaceAll("\\+", "_"); value = value.replaceAll("\\*", "_"); value = value.replaceAll("\\?", "_"); sAMAccountName = new BasicAttribute("sAMAccountName"); sAMAccountName.getValues().add(value); ]]></Script> </resolver:AttributeDefinition> <resolver:AttributeDefinition id="grouptypead" xsi:type="Script" xmlns="urn:mace:shibboleth:2.0:resolver:ad" sourceAttributeID="name" > <resolver:Dependency ref="groupDataConnector" /> <Script><![CDATA[ // Import Shibboleth attribute provider importPackage(Packages.edu.internet2.middleware.shibboleth.common.attribute.provider); value = -2147483646; grouptypead = new BasicAttribute("grouptypead"); grouptypead.getValues().add(value); ]]></Script> </resolver:AttributeDefinition> </AttributeResolver>