درس 12 — Rag engine sync

07. Droits : qui peut faire quoi (matrice IAM)

6 دقائق قراءة

هذا المحتوى غير مترجم بعد. تُعرض النسخة الأصلية.

Le but : savoir exactement quelle identité a quel droit, pourquoi, et ce qui casse sans lui. Chaque ligne « vérifié » a été constatée en vrai sur le projet de test (erreur obtenue sans le droit).


1. Les identités

IdentitéCréée parSert à
rag-kit-sa@<projet>.iam.gserviceaccount.comle kitIdentité du service (interface + agent) et du job de synchro
service-<numéro>@gcp-sa-vertex-rag.iam.gserviceaccount.comGoogle (1re utilisation de RAG Engine)Importe les fichiers (Drive, bucket) dans le corpus, appelle le layout parser
rag-kit-scheduler-sa@…le kitLance le job toutes les 10 min (Cloud Scheduler)
rag-kit-build-sa@…le kitConstruit l'image (Cloud Build)
Vous et vos collègues—Ouvrent l'interface

(rag-kit = valeur de PREFIX.)

2. La matrice

IdentitéRessourceRôlePourquoiSans lui
rag-kit-saprojetroles/aiplatform.userAppeler Gemini ; chercher, importer, supprimer dans le corpusAucune réponse, aucune synchro
projetroles/discoveryengine.viewerReranking : permission discoveryengine.rankingConfigs.rank (API Ranking). Piège vérifié : discoveryengine.user ne la contient PAS, viewer (et editor) ouiVérifié : 403 Permission 'discoveryengine.rankingConfigs.rank' denied, l'agent ne trouve rien
projetlogging.logWriter, monitoring.metricWriter, cloudtrace.agent, telemetry.writerJournaux, métriques, tracesPas d'observabilité
bucketroles/storage.objectAdminÉcrire les dépôts, config.json, les rapports de synchroDépôt et synchro en échec
job rag-kit-syncroles/run.jobsExecutorWithOverridesLancer le job avec TRIGGER=auto/manuel (bouton, webhook). run.invoker ne suffit pas (pas de run.jobs.runWithOverrides, vérifié)Bouton en erreur 403
secrets rag-kit-oauth-client, rag-kit-google-tokenssecretAccessor (+ secretVersionManager sur les jetons)Lire le client OAuth ; ranger/détruire les jetons des comptes connectésConnexion Google impossible
job rag-kit-syncroles/run.viewerSavoir si une synchro tourne (« Synchronisation en cours… »)État inconnu
dossier DriveLecteur (partage Drive)Lister les fichiers → détecter les suppressions, vérifier un dossier à l'ajoutL'interface refuse le dossier : « Le kit ne voit pas ce dossier »
Agent de service RAGbucketroles/storage.objectViewerLire les fichiers déposésDépôts jamais indexés
bucketroles/storage.objectCreatorÉcrire le rapport détaillé d'import (sync/runs/…)Vérifié : 403 … does not have storage.objects.create access, la synchro échoue
dossier DriveLecteur (partage Drive)Importer les fichiersVérifié : import par dossier = 0 fichier sans erreur ; import par fichier (ce que fait le kit) = 404 Unable to find some Google Drive resource(s). Le kit l'affiche : « N fichier(s) illisible(s) pour l'agent RAG… »
Document AI(rien à ajouter)Layout parserVérifié : fonctionne avec le rôle aiplatform.ragServiceAgent donné par Google
rag-kit-scheduler-sajobroles/run.jobsExecutorWithOverridesLancer le job avec TRIGGER=autoPlus de synchro planifiée
Tout le monde (allUsers)service rag-kit-hookroles/run.invokerGoogle doit pouvoir envoyer les notifications push. Le service n'accepte que les canaux ouverts par le kit (identifiant + jeton secret, sinon 403) et ne fait que lancer une synchroPas de push (PUSH=false : synchro planifiée seule)
Comptes Google connectésleur Driveportée OAuth drive.readonlyLecture seule, accordée par la personne sur l'écran Google—
rag-kit-build-saprojetstorage.objectViewer, artifactregistry.writer, logging.logWriterLire le code envoyé, ranger l'image, écrire ses journauxConstruction en échec
Utilisateurs (USERS)service rag-kitroles/run.invokerOuvrir l'interface (via le proxy)403 Forbidden

Propriétaires du projet : ils ont déjà run.invoker partout, inutile de les lister.

3. Pourquoi un seul compte pour le service et le job

Ils touchent les mêmes ressources (corpus, bucket, Drive), et RAG Engine n'a pas de rôle « lecture seule » sur un corpus : aiplatform.user sert à chercher et à importer. Deux comptes ajouteraient une adresse de plus à mettre dans chaque partage Drive, sans vraie séparation.

Variante plus stricte (si votre sécurité l'exige) : un compte rag-kit-web-sa pour le service, sans accès Drive, avec aiplatform.user, discoveryengine.viewer, objectAdmin sur le bucket et run.invoker/run.viewer sur le job ; le compte rag-kit-sa reste celui du job (seul à lire Drive). Conséquence : l'interface ne peut plus vérifier un dossier à l'ajout (elle l'accepte, et c'est le rapport de synchro qui signale un problème de partage).

4. Qui déploie : droits minimaux

Propriétaire du projet = le plus simple. Sinon, ces rôles suffisent pour terraform apply ou deployer_shell.sh :

RôlePour
roles/serviceusage.serviceUsageAdminActiver les API
roles/iam.serviceAccountAdmin + roles/iam.serviceAccountUserCréer les comptes et les attacher au service/job
roles/resourcemanager.projectIamAdminDonner les rôles projet aux comptes
roles/storage.adminBucket et ses droits
roles/aiplatform.adminCorpus RAG (+ palier RagManagedDb)
roles/documentai.adminLayout parser
roles/run.adminService, job et leurs droits
roles/cloudscheduler.adminPlanification
roles/artifactregistry.adminDépôt d'images
roles/cloudbuild.builds.editorLancer la construction

5. Accès à l'interface : proxy ou IAP

Par défaut : service privé + proxy. gcloud run services proxy rag-kit … ouvre http://localhost:8080 en ajoutant votre jeton : seuls les comptes qui ont run.invoker passent. Vérifié avec un compte Gmail, projet sans organisation. Rien n'est exposé sur Internet sans authentification.

Origines autorisées (ALLOW_ORIGINS). ADK refuse les appels d'une page dont l'origine ne correspond pas à l'hôte (protection contre les attaques inter-sites). Derrière le proxy, la page est sur http://localhost:<port> et l'hôte vu par le service est …run.app : le kit autorise donc localhost et 127.0.0.1 (tout port) par défaut. Le service restant privé, une page locale ne passe qu'avec un proxy ouvert par un compte autorisé.

Option : IAP (une vraie URL https, connexion Google dans le navigateur, pas de proxy). Il faut une organisation Google Cloud (écran de consentement interne). Non activée dans le kit car impossible à tester sur le projet de test (sans organisation) ; pour l'activer (commandes non testées ici, à valider sur un projet avec organisation) :

gcloud beta run services update rag-kit --region=europe-west4 --iap
gcloud beta iap web add-iam-policy-binding --resource-type=cloud-run --service=rag-kit --region=europe-west4 \
  --member=group:equipe@exemple.com --role=roles/iap.httpsResourceAccessor

(En Terraform : iap_enabled = true sur google_cloud_run_v2_service.app et google_iap_web_cloud_run_service_iam_member.)

6. Ce qu'un utilisateur de l'interface peut faire

Toute personne qui ouvre l'interface peut : interroger tout le corpus, ajouter/retirer un dossier Drive (s'il est partagé avec le kit), déposer et supprimer des fichiers déposés, lancer une synchro. Elle ne peut pas supprimer un fichier de Drive (le kit n'a que la lecture). Donnez l'accès en conséquence.

التالي