proj-esup-grouper

Arborescence des pages

Vous regardez une version antérieure (v. /wiki/spaces/PROJESUPGRP/pages/1713438726/Envoi+de+groupes+dans+le+Gravitee+AMUE+via+SCIM) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 5) afficher la version suivante »

Cf ESUP-Days n°39#15%3A30%E2%80%93Grouper5.xetSCIM slide 27 le portail Gravitee poussé par l'AMUE propose, en plus de SAML/OIDC, la possibilité de synchroniser les utilisateurs et les groupes (qui vont correspondre à des rôles) via SCIM 2.

Quelques ajustements doivent être faits actuellement pour que ça fonctionne, nous les documentons ici.

On se place dans un environnement très similaire à ce qui est décrit sur la page Grouper 5.x.

Certificat HTTPS Harica

Actuellement, le gravitee de l'amue est proposé via https en présentant un certificat Harica avec une chaîne dont la racine est le certificat 2021 en auto-signé. Cela ne pose pas de problème sur quasiment l'ensemble des systèmes... mis à part sur java pour qui il faut préférer la chaîne Harica alternative présentant le certificat 2021 signé lui-même par celui de 2015 (présent dans les trustore java par défaut).

La JVM embarquée par le docker grouper est une JVM Amazon Corretto dont le trustore n'est pas celui du système. Aussi, on ne peut pas utiliser simplement une commande type update-ca-trust (équivalent du update-ca-certificates de debian sous rocky), il nous faut écraser le truststore par défaut proposé par la JVM.

Pour ce faire, et par rapport à ce qui était proposé dans la page Grouper 5.x. on va passer par un Dockerfile qui va nous rebuilder l'image Grouper.

On modifie le docker-compose :                                                                                                                                                   

services:
  grouper-ui:
    # image: "i2incommon/grouper:6.1.0"
    build:
      context: .
      dockerfile: Dockerfile

Puis on édite le Dockerfile ainsi : 

FROM i2incommon/grouper:6.1.0

COPY ca-certificates/ /tmp/ca-certificates/

RUN for cert in /tmp/ca-certificates/*.crt; do \
      alias=$(basename "$cert" .crt); \
      keytool -importcert \
        -noprompt \
        -trustcacerts \
        -alias "$alias" \
        -file "$cert" \
        -keystore /usr/lib/jvm/java-17-amazon-corretto/lib/security/cacerts \
        -storepass changeit; \
    done \
    && rm -rf /tmp/ca-certificates/

On n'a plus qu'à disposer le certificat Harica dans le répertoire ca-certificates : 

cat /opt/grouperContainer/ca-certificates/HARICA_TLS_RSA_Root_CA_2021.crt 
-----BEGIN CERTIFICATE-----
MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs
MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg
Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL
MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv
b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l
mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE
4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv
a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M
pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw
Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b
LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY
AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB
AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq
E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr
W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ
CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU
X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3
f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja
H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP
JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P
zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt
jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0
/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT
BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79
aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW
xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU
63ZTGI0RmLo=
-----END CERTIFICATE-----

Le même Dockerfile est partagé avec l'ensemble des 3 services/images docker grouper, mais il faudra les rebuilder à chaque fois pour prise en compte d'une modification du Dockerfile.

cd /opt/grouperContainer/
systemctl stop grouper-docker-compose@ui.service
docker compose build grouper-ui
systemctl start grouper-docker-compose@ui.service

On peut aussi rajouter un --build dans /etc/systemd/system/grouper-docker-compose@.service simplement : 

...
ExecStart=/usr/bin/docker compose up grouper-%i -d --remove-orphans --build
...

Avec cet ajout, Grouper reconnait le certificat Harica du Gravitee de l'AMUE.

Notez que cette modification peut vous permettre d'ajouter d'autres certificats internes, par exemple le certificat racine autosigné de votre Microsoft Active Directory (AD).

Authentification par client_secret_basic

La récupération du bearerToken sur le Gravitee Amue via oidc fonctionne via client_secret_basic tel que décrit sur https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication

Grouper ne l'implémente actuellement pas... mais la modiification de code à faire pour le supporter est assez simple.

C'est ce qu'on a fait ici (on en fait un Pull Request au passage) : https://github.com/Internet2/grouper/pull/262

Sans l'intégration de ce PR dans le grouper, vous pouvez l'embarquer en écrasant la classe (une fois compilée) WsBearerTokenExternalSystem.class (vous pouvez y ajouter les fichiers de propriétés également).

Pour appliquer ces modifications on positionne l'ensemble des fichiers/classes modifiés dans /opt/grouperContainer : 

tree /opt/grouperContainer/classes/
/opt/grouperContainer/classes/
├── edu
│   └── internet2
│       └── middleware
│           └── grouper
│               └── app
│                   └── externalSystem
│                       └── WsBearerTokenExternalSystem.class
├── grouper-loader.base.properties
└── grouper.textNg.en.us.base.properties

Pour prise en compte, on copie le contenu de classes du hôte dans l'image.

Le Dockerfile est modifié ainsi (cf dernière ligne) : 

FROM i2incommon/grouper:6.1.0

COPY ca-certificates/ /tmp/ca-certificates/

RUN for cert in /tmp/ca-certificates/*.crt; do \
      alias=$(basename "$cert" .crt); \
      keytool -importcert \
        -noprompt \
        -trustcacerts \
        -alias "$alias" \
        -file "$cert" \
        -keystore /usr/lib/jvm/java-17-amazon-corretto/lib/security/cacerts \
        -storepass changeit; \
    done \
    && rm -rf /tmp/ca-certificates/

COPY classes/ /opt/grouper/grouperWebapp/WEB-INF/classes/

Fixe du endpoint SCIM

Si vous voulez  également avoir l'interface web qui vous permet de configurer le "endpoint" dans ce cadre, vous pouvez aussi récupérer le PR https://github.com/Internet2/grouper/pull/263

Sans cela, ajoutez simplement le paramètre endpoint via l'IHM permettant d''éditer les "fichiers" de configuration (grouper-loader.properties) ; le nom du paramètre étant donné par l'erreur lors du provisioning SCIM : 

provisionerClass: GrouperScim2Provisioner, configId: sandbox-api-amue-identite, provisioningType: fullProvisionFull, instanceId: wykao35y, state: retrieveAllDataFromGrouperAndTarget, retrieveSyncGroupsMillis: 4, syncGroupCount: 1, retrieveSyncEntitiesMillis: 2, syncEntityCount: 2, retrieveSyncMshipsMillis: 1, syncMshipCount: 2, propagateProvisioningAttributes_millis: 102, targetRetrieveAllGroups: 1, exception: java.lang.RuntimeException: Cant find property: grouper.wsBearerToken.sandbox-api-amue.endpoint in properties file: grouper-loader.properties, it is required
	at edu.internet2.middleware.grouperClient.config.ConfigPropertiesCascadeBase.propertyValueStringHelper(ConfigPropertiesCascadeBase.java:569)
	at edu.internet2.middleware.grouperClient.config.ConfigPropertiesCascadeBase.propertyValueString(ConfigPropertiesCascadeBase.java:517)
	at edu.internet2.middleware.grouperClient.config.ConfigPropertiesCascadeBase.propertyValueStringRequired(ConfigPropertiesCascadeBase.java:422)
	at edu.internet2.middleware.grouper.app.scim2Provisioning.GrouperScim2ApiCommands.httpMethod(GrouperScim2ApiCommands.java:839)
	at edu.internet2.middleware.grouper.app.scim2Provisioning.GrouperScim2ApiCommands.executeMethod(GrouperScim2ApiCommands.java:901)
	at edu.internet2.middleware.grouper.app.scim2Provisioning.GrouperScim2ApiCommands.retrieveScimGroups(GrouperScim2ApiCommands.java:1915)
	at edu.internet2.middleware.grouper.app.scim2Provisioning.GrouperScim2TargetDao.retrieveAllGroups(GrouperScim2TargetDao.java:91)
...

→ grouper.wsBearerToken.sandbox-api-amue.endpoint in properties file: grouper-loader.properties ici donc

Utilisation

Avec ces modifications, l'envoi des groupes et utilisateurs depuis Grouper vers le Gravitee de l'AMUE via SCIM est fonctionnel.

Il vous faut : 

  • ajouter un "External System" type "Web Service"

  • ajouter un provisionner de type scim

  • sélectionner une branche à provisionner (notez qu'on pousse uniquement les noms 'extensions' en tant que name, par choix, cf configuration ci-dessus)

  • et enfin vérifier que ça se synchronse bien, en commençant par faire des synchronisations totale avec le Daemon de synchronisation complète (full) simplement dans un premier temps : 


En parallèle, on peut requête l'api SCIM de gravitee via le swagger proposé au travers du portail gravitee de l'amue et véifier ainsi que les groupes, utilisateurs et membres (affectations) sont bien synchronisés.


  • Aucune étiquette