Déléguer des autorisations d'agent de service à un compte de service géré par l'utilisateur

Pour les transferts sans agent, le service de transfert de stockage utilise par défaut un agent de service pour transférer vos données entre la source et la destination. Vous accordez à l'agent de service les autorisations nécessaires pour accéder à vos buckets Cloud Storage.

Étant donné que le même agent de service service de transfert de stockage est utilisé par tous les transferts d'un projet, il dispose nécessairement d'autorisations sur tous les buckets impliqués dans chaque transfert.

Vous pouvez également attribuer des autorisations de bucket à plusieurs comptes de service gérés par l'utilisateur. Ces comptes de service gérés par l'utilisateur disposent d'autorisations sur des buckets sources et de destination spécifiques, et sont également limités à des comptes utilisateur spécifiques (les comptes qui créent ou déclenchent le job de transfert).

Exemples de cas de figure

Les scénarios suivants illustrent différentes options d'autorisation à l'aide de l'agent de service et des comptes de service gérés par l'utilisateur.

Développez chaque section pour afficher les détails.

Scénario 1 : Agent de service uniquement

Dans ce scénario, toutes les autorisations sont accordées à l'agent de service.

  • L'agent de service dispose d'autorisations en écriture sur les buckets A, B, C et D.

Tout utilisateur disposant des autorisations appropriées pour créer un job de transfert peut transférer des données vers ou depuis les buckets A, B, C et D.

Cette approche fonctionne bien lorsque l'utilisateur du service de transfert de stockage est un utilisateur de confiance pour les données de tous les buckets et qu'il peut configurer correctement les jobs de transfert pour éviter de déplacer des données vers ou depuis le mauvais bucket.

Scénario 2 : Agents de service gérés par l'utilisateur uniquement

Dans ce scénario, toutes les autorisations sont accordées aux comptes de service gérés par l'utilisateur.

  • Le compte de service géré par l'utilisateur 1 dispose d'autorisations sur les buckets A et B.
  • Le compte de service n° 2 géré par l'utilisateur dispose d'autorisations sur les buckets C et D.

En outre :

  • L'utilisateur Alpha a accès au compte de service 1.
  • L'utilisateur Bravo obtient l'accès au compte de service 2.
  • L'utilisateur Charlie a accès aux comptes de service 1 et 2.

Dans ce cas :

  • Alpha ne peut être transféré qu'entre les buckets A et B.
  • Bravo ne peut transférer des données qu'entre les buckets C et D.
  • Charlie ne peut transférer des données qu'entre les buckets A et B, et entre les buckets C et D.
  • Charlie ne peut pas transférer de fichiers entre A et C, A et D, B et C ou B et D.

Scénario 3 : Autorisations mixtes

Dans ce scénario, votre projet contient un mélange d'autorisations d'agent de service et d'autorisations de compte de service géré par l'utilisateur.

  • L'agent de service dispose d'autorisations en écriture sur les buckets A et B.
  • Le compte de service n° 1 géré par l'utilisateur dispose d'autorisations en lecture seule sur le bucket C et d'autorisations en écriture sur le bucket D.
  • L'utilisateur Alpha a accès au compte de service n° 1 géré par l'utilisateur.

Dans ce cas :

  • Tout utilisateur disposant des autorisations appropriées pour créer un job de transfert peut transférer des données vers ou depuis les buckets A et B. Ils ne peuvent pas être transférés vers ou depuis les buckets C ou D.
  • L'utilisateur Alpha peut transférer des fonds vers ou depuis les buckets A et B.
  • Alpha peut transférer des éléments hors du bucket C vers le bucket D.
  • Alpha ne peut pas être transféré du bucket C vers les buckets A ou B.

Présentation de l'implémentation

L'implémentation est la suivante :

  • Vous créez un compte de service géré par l'utilisateur ou vous en utilisez un existant.
  • Vous accordez des autorisations :
    • Pour qu'un utilisateur puisse accéder au compte de service géré par l'utilisateur.
    • Pour que l'agent de service puisse générer un jeton d'accès à partir du compte de service géré par l'utilisateur.
    • Pour que le compte de service géré par l'utilisateur puisse accéder à vos buckets.
  • L'utilisateur crée un job de transfert qui spécifie le compte de service géré par l'utilisateur.
  • Service de transfert de stockage vérifie que l'utilisateur dispose des autorisations appropriées sur le compte de service. Si les autorisations appropriées n'ont pas été accordées, la création du job de transfert échoue.
  • L'agent de service génère un jeton OAuth au nom du compte de service géré par l'utilisateur. Le jeton OAuth permet au service de transfert de stockage d'accéder aux buckets concernés par le transfert.
  • La tâche de transfert s'exécute.
  • Le jeton OAuth est éphémère et expire. Si la tâche de transfert est en cours lorsque le jeton expire, le service de transfert de stockage en génère un autre et poursuit le transfert.

Configurer la délégation d'autorisations

Suivez les instructions pour déléguer l'accès de l'agent de service à un compte de service géré par l'utilisateur.

Conditions requises

  • Pour créer un compte de service géré par l'utilisateur, vous devez disposer du rôle Créer des comptes de service (roles/iam.serviceAccountCreator) sur le projet.
  • Pour accorder l'accès au compte de service géré par l'utilisateur à l'utilisateur et à l'agent de service, vous devez disposer du rôle Administrateur de compte de service (roles/iam.serviceAccountAdmin) sur le compte de service géré par l'utilisateur ou sur le projet.

Créer ou identifier un compte de service géré par l'utilisateur

Vous pouvez créer un compte de service géré par l'utilisateur ou en utiliser un existant.

  • Pour créer un compte de service géré par l'utilisateur, suivez les instructions de la section Créer des comptes de service.

  • Pour utiliser un compte de service géré par l'utilisateur existant, vous avez besoin de son adresse e-mail, qui suit le format suivant :

    SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Si le compte de service se trouve dans un projet différent de celui du job de transfert, consultez Activer l'association des comptes de service à plusieurs projets.

Accorder l'accès à l'utilisateur

Accordez au compte utilisateur l'accès au nouveau compte de service géré par l'utilisateur et attribuez-lui le rôle Utilisateur du compte de service (roles/iam.serviceAccountUser). Le compte utilisateur est celui utilisé pour créer ou mettre à jour le job de transfert.

Console Google Cloud

  1. Dans la console Google Cloud , accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Sélectionnez un projet.

  3. Cliquez sur l'adresse e-mail du compte de service géré par l'utilisateur.

  4. Sélectionnez l'onglet Autorisations.

  5. Cliquez sur  Accorder l'accès.

  6. Saisissez l'adresse e-mail de l'utilisateur. Par exemple, user1@example.com.

  7. Dans la liste déroulante Rôle, sélectionnez Utilisateur du compte de service.

  8. Cliquez sur Enregistrer. Le rôle est attribué au compte principal sur le compte de service.

gcloud

Pour attribuer un rôle à un compte principal, exécutez la commande add-iam-policy-binding :

gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --member=PRINCIPAL --role=roles/iam.serviceAccountUser

Remplacez les variables suivantes :

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service géré par l'utilisateur au format SA_NAME@PROJECT_ID.iam.gserviceaccount.com.
  • PRINCIPAL : adresse e-mail de l'utilisateur exécutant le job de transfert, au format user:name@example.com.

Accorder l'accès à l'agent de service

Pour permettre à l'agent de service de générer un jeton d'accès à partir du compte de service géré par l'utilisateur, accordez-lui l'accès à ce compte et attribuez-lui le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator).

Vous avez besoin de l'adresse e-mail de l'agent de service pour accorder l'accès. Pour trouver l'adresse e-mail de l'agent de service :

  1. Accédez à la page de référence googleServiceAccounts.get.

    Un panneau interactif s'affiche, intitulé Essayer cette méthode.

  2. Dans le panneau, sous Paramètres des requêtes, saisissez votre ID de projet. Le projet que vous spécifiez ici doit être le projet que vous utilisez pour gérer le service de transfert de stockage.

  3. Cliquez sur Exécuter.

    L'adresse e-mail de votre agent de service est renvoyée en tant que valeur de accountEmail. Il utilise le format project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com.

Ensuite, pour accorder à l'agent de service l'accès au compte de service géré par l'utilisateur :

Console Google Cloud

  1. Dans la console Google Cloud , accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Sélectionnez un projet.

  3. Cliquez sur l'adresse e-mail du compte de service géré par l'utilisateur.

  4. Sélectionnez l'onglet Autorisations.

  5. Cliquez sur  Accorder l'accès.

  6. Saisissez l'adresse e-mail de l'agent de service.

  7. Dans la liste déroulante Rôle, sélectionnez Créateur de jetons de compte de service.

  8. Cliquez sur Enregistrer. Le rôle est attribué au compte principal sur le compte de service.

gcloud

Pour attribuer un rôle à un compte principal, exécutez la commande add-iam-policy-binding :

gcloud iam service-accounts add-iam-policy-binding USER_MANAGED_SERVICE_ACCOUNT_EMAIL \
  --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/iam.serviceAccountTokenCreator

Remplacez les variables suivantes :

  • USER_MANAGED_SERVICE_ACCOUNT_EMAIL : adresse e-mail du compte de service géré par l'utilisateur au format SA_NAME@PROJECT_ID.iam.gserviceaccount.com.
  • SERVICE_AGENT_EMAIL : adresse e-mail de l'agent de service.

Accorder des autorisations de bucket au compte de service géré par l'utilisateur

Accordez les autorisations listées dans Autorisations de l'agent de service géré par Google au compte de service géré par l'utilisateur, et non à l'agent de service.

Créer un job de transfert à l'aide d'un compte de service géré par l'utilisateur

Une fois que vous avez accordé les autorisations appropriées, vous pouvez spécifier le compte de service géré par l'utilisateur lorsque vous créez une tâche de transfert.

Console Google Cloud

Suivez les instructions pour créer un transfert. Avant de finaliser la tâche de transfert :

  1. Sur la page Choisir les paramètres, recherchez la section Type de compte de service.
  2. Sélectionnez Compte de service géré par l'utilisateur.
  3. Saisissez l'adresse e-mail du compte de service géré par l'utilisateur, au format SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com.
  4. Cliquez sur Créer pour créer la tâche de transfert.

API REST

Spécifiez le compte de service géré par l'utilisateur comme valeur du champ serviceAccount dans la requête transferJobs.create.

La valeur doit utiliser le format projects/-/serviceAccounts/ACCOUNT_EMAIL_OR_UNIQUEID.

L'adresse e-mail du compte de service (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com) ou l'ID unique (123456789012345678901) sont acceptés dans la chaîne. Le caractère générique - est obligatoire. Le remplacer par un ID de projet n'est pas autorisé.

Exemple :

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
"description": "A transfer using a user-managed service account for bucket permissions",
"status": "ENABLED",
"projectId": "PROJECT_ID",
"serviceAccount": "projects/-/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com",
"transferSpec": {
    ...
  }
}