Compte de service au moindre privilège
Le principe du moindre privilège
Donner à chaque identité uniquement les droits nécessaires à sa tâche, sur le plus petit périmètre possible. Pour notre agent, la tâche est : appeler Gemini sur Vertex AI. Rien d'autre.
flowchart LR
subgraph Mauvais["Compte par défaut (à éviter)"]
D["PROJECT_NUMBER-compute@... : souvent Éditeur"] --> T1["lire / modifier / supprimer presque tout le projet"]
end
subgraph Bon["Compte dédié (ce lab)"]
S["lab-agent-cloud-run-iam@... : roles/aiplatform.user"] --> T2["appeler les modèles Vertex AI"]
end
Sans option --service-account, Cloud Run utilise le compte de service Compute Engine par défaut. Selon l'âge et la configuration du projet, ce compte peut avoir le rôle Éditeur : c'est pratique pour démarrer, dangereux en production.
Ce que contient roles/aiplatform.user
| Permission (exemples) | Utile à l'agent ? |
|---|---|
aiplatform.endpoints.predict | oui : c'est elle qu'utilise generateContent sur les modèles Gemini |
| lecture des ressources Vertex AI | rarement, sans danger |
| création de ressources Vertex AI (jeux de données, jobs…) | non ; c'est le prix d'un rôle prédéfini |
Pourquoi n'accorde-t-on PAS roles/logging.logWriter au compte de service de l'agent ?
Les journaux écrits sur la sortie standard sont collectés par l'infrastructure Cloud Run, sans passer par l'identité du service. Le rôle d'écriture n'est nécessaire que si le code appelle directement l'API Cloud Logging (bibliothèque google-cloud-logging).
Les commandes
Extrait de deployer.sh. Le nom du compte reprend le préfixe du lab (lab-agent-cloud-run-iam, 30 caractères au plus) pour qu'on le retrouve et le supprime sans ambiguïté :
SERVICE="lab-agent-cloud-run-iam"
SA="${SERVICE}@${PROJECT_ID}.iam.gserviceaccount.com"
# 1. Compte de service dédié, sans aucun rôle au départ
gcloud iam service-accounts describe "$SA" --project "$PROJECT_ID" >/dev/null 2>&1 || \
gcloud iam service-accounts create "$SERVICE" --project "$PROJECT_ID" \
--display-name "Lab agent-cloud-run-iam : identité de l'agent"
# 2. Un seul rôle : appeler Gemini sur Vertex AI
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member "serviceAccount:${SA}" --role roles/aiplatform.user --condition NonePour déployer un service avec ce compte, vous (la personne qui déploie) devez avoir le droit d'« agir en tant que » ce compte (iam.serviceAccounts.actAs, inclus dans Propriétaire, Éditeur ou roles/iam.serviceAccountUser). C'est une protection : sans elle, n'importe quel développeur pourrait lancer du code sous une identité plus puissante que la sienne.
Alice a le rôle Développeur Cloud Run mais pas iam.serviceAccountUser sur le compte lab-agent-cloud-run-iam. Que se passe-t-il si elle déploie avec --service-account sur ce compte ?
Attacher un compte de service à une ressource exige la permission iam.serviceAccounts.actAs sur ce compte. Sans elle, gcloud renvoie une erreur de permission et rien n'est déployé.
Vérifier ce qui a été accordé
gcloud projects get-iam-policy "$PROJECT_ID" \
--flatten="bindings[].members" \
--filter="bindings.members:serviceAccount:lab-agent-cloud-run-iam@" \
--format="value(bindings.role)"Résultat obtenu
Sortie réelle du 2026-10-15, après deployer.sh (identifiants masqués) :
Created service account [lab-agent-cloud-run-iam].
Updated IAM policy for project [mon-projet-gcp].
$ gcloud projects get-iam-policy ... --format="value(bindings.role)"
roles/aiplatform.userUn seul rôle, comme prévu. Et l'agent répond bien (leçon suivante) : la preuve que ce rôle suffit.
Exercice
Votre assistant doit maintenant lire un fichier de politiques dans un bucket gs://politiques-internes. Quelles commandes ajoutez-vous, et lesquelles évitez-vous ?
Voir la solution
Accorder la lecture seule, sur ce seul bucket :
gcloud storage buckets add-iam-policy-binding gs://politiques-internes \
--member "serviceAccount:lab-agent-cloud-run-iam@${PROJECT_ID}.iam.gserviceaccount.com" \
--role roles/storage.objectViewerÀ éviter :
gcloud projects add-iam-policy-binding ... --role roles/storage.objectViewer: lecture de tous les buckets du projet ;roles/storage.adminouroles/storage.objectAdmin: droit d'écrire et de supprimer, inutile pour lire.
Et pensez à retirer ce droit dans nettoyer.sh (ou à supprimer le bucket).
Je sais faire
- Créer un compte de service dédié, nommé avec le préfixe du lab
- Accorder un rôle unique et vérifier les rôles effectifs
- Expliquer le rôle de
iam.serviceAccounts.actAs - Restreindre un droit à une ressource précise plutôt qu'au projet