Associer des comptes de service aux ressources

Pour certaines ressources Google Cloud, vous pouvez spécifier un compte de service géré par l'utilisateur que la ressource utilise comme identité par défaut. Ce processus est appelé liaison du compte de service à la ressource, ou association du compte de service à la ressource.

Lorsque la ressource doit accéder à d'autres services et ressources Google Cloud, elle utilise son compte de service associé comme identité. Par exemple, si vous associez un compte de service à une instance Compute Engine et que les applications de l'instance utilisent une bibliothèque cliente pour appeler les API Google Cloud, ces applications s'authentifient automatiquement en tant que compte de service associé.

Cette page explique comment configurer des comptes de service afin de pouvoir les associer à des ressources.

Avant de commencer

Associer un compte de service à une ressource

Dans la plupart des cas, vous devez associer un compte de service à une ressource lorsque vous créez cette ressource. Une fois la ressource créée, vous ne pouvez pas modifier le compte de service qui lui est associé. Les instances Compute Engine font exception à cette règle : si nécessaire, vous pouvez modifier le compte de service associé à une instance.

Avant d'associer un compte de service à une ressource, vous devez configurer le compte de service. Ce processus diffère selon que le compte de service et la ressource se trouvent dans le même projet ou dans des projets différents. Après avoir configuré le compte de service, vous pouvez créer la ressource et lui associer le compte de service.

Configurer une ressource dans le même projet

Avant d'associer un compte de service à une autre ressource du même projet, accordez des rôles au compte de service afin qu'il puisse accéder aux ressources appropriées, de la même manière que vous attribueriez des rôles aux autres comptes principaux.

Configurer une ressource dans un autre projet

Dans certains cas, vous devrez peut-être associer un compte de service à une ressource située dans un autre projet. Par exemple, si vous créez tous vos comptes de service dans un seul projet, vous devrez peut-être en associer un à une nouvelle ressource d'un autre projet.

Avant d'associer un compte de service à une ressource d'un autre projet, procédez comme suit :

  1. Dans le projet où se trouve le compte de service, suivez les étapes décrites sur cette page pour activer l'association des comptes de service entre les projets.
  2. Identifiez le projet dans lequel vous allez créer la ressource.
  3. Identifiez le type de ressource auquel vous allez associer le compte de service, ainsi que le service qui possède ce type de ressource.

    Par exemple, si vous créez un abonnement Pub/Sub, Pub/Sub est le service qui possède la ressource.

  4. Recherchez l'adresse e-mail de l'agent de service du service.

    Les différents services utilisent des agents de service différents. Pour en savoir plus, consultez la section Agents de service.

  5. Attribuez le rôle de créateur de jetons de compte de service (roles/iam.serviceAccountTokenCreator) aux agents de service :

    Console

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

      Accéder à la page "Comptes de service"

    2. Sélectionnez le projet qui possède le compte de service que vous allez associer à une ressource.

    3. Cliquez sur l'adresse e-mail du compte de service que vous allez associer à une ressource.

    4. Accédez à l'onglet Autorisations, puis recherchez la section Comptes principaux ayant accès à ce compte de service.

    5. Cliquez sur  Accorder l'accès, puis saisissez l'adresse e-mail de l'agent de service.

    6. Cliquez sur Sélectionner un rôle, saisissez Service Account Token Creator, puis cliquez sur le rôle.

    7. Cliquez sur Enregistrer pour enregistrer les modifications.

    8. Facultatif : si vous devez attribuer le rôle à un autre agent de service, répétez les étapes précédentes.

    gcloud

    Exécutez la commande gcloud iam service-accounts add-iam-policy-binding :

    gcloud iam service-accounts add-iam-policy-binding \
        SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member=serviceAccount:SERVICE_AGENT_EMAIL \
        --role=roles/iam.serviceAccountTokenCreator
    

    Remplacez les valeurs suivantes :

    • SERVICE_ACCOUNT_NAME : nom du compte de service géré par l'utilisateur que vous associez à une ressource.
    • PROJECT_ID : ID du projet dans lequel se trouve le compte de service géré par l'utilisateur.
    • SERVICE_AGENT_EMAIL : adresse e-mail associée au compte de service.

    La commande affiche la stratégie d'autorisation mise à jour du compte de service géré par l'utilisateur.

    Facultatif : si vous devez attribuer le rôle à un autre agent de service, exécutez à nouveau la commande.

    REST

    Pour accorder ce rôle, utilisez le modèle lecture-modification-écriture afin de mettre à jour la stratégie d'autorisation de votre compte de service géré par l'utilisateur.

    Tout d'abord, lisez la stratégie d'autorisation du compte de service géré par l'utilisateur :

    La méthode projects.serviceAccounts.getIamPolicy renvoie la stratégie d'autorisation pour le compte de service.

    Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

    • PROJECT_ID : ID de votre projet Google Cloud. Les ID de projet sont des chaînes alphanumériques, telles que my-project.
    • USER_SA_NAME : nom du compte de service géré par l'utilisateur que vous associez à une ressource.

    Méthode HTTP et URL :

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/USER_SA_NAME@PROJECT_ID.iam.gserviceaccount.com:getIamPolicy

    Corps JSON de la requête :

    {
      "requestedPolicyVersion": 3
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    Vous devriez recevoir une réponse JSON de ce type :

    {
      "version": 1,
      "etag": "BwWl3KCTUMY=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

    Ensuite, modifiez la stratégie d'autorisation pour accorder le rôle de créateur de jetons du compte de service à l'agent de service.

    {
      "version": 1,
      "etag": "BwWl3KCTUMY=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "serviceAccount:SERVICE_AGENT_EMAIL"
          ]
        },
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

    Remplacez les éléments suivants :

    • SERVICE_AGENT_EMAIL : adresse e-mail associée à l'agent de service.
    • SERVICE_ACCOUNT_NAME : nom du compte de service géré par l'utilisateur.
    • PROJECT_ID : ID du projet dans lequel se trouve le compte de service géré par l'utilisateur.

    Enfin, écrivez la stratégie d'autorisation mise à jour :

    La méthode projects.serviceAccounts.setIamPolicy met à jour la stratégie d'autorisation de votre compte de service.

    Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

    • PROJECT_ID : ID de votre projet Google Cloud. Les ID de projet sont des chaînes alphanumériques, telles que my-project.
    • USER_SERVICE_ACCOUNT_NAME : nom du compte de service géré par l'utilisateur que vous associez à une ressource.
    • SERVICE_AGENT_EMAIL : adresse e-mail de l'agent de service qui créera des jetons d'accès pour votre compte de service géré par l'utilisateur.

    Méthode HTTP et URL :

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com:setIamPolicy

    Corps JSON de la requête :

    {
      "policy": {
        "version": 1,
        "etag": "BwWl3KCTUMY=",
        "bindings": [
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:SERVICE_AGENT_EMAIL"
            ]
          },
          {
            "role": "roles/iam.serviceAccountUser",
            "members": [
              "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com"
            ]
          }
        ]
      }
    }
    

    Pour envoyer votre requête, développez l'une des options suivantes :

    Vous devriez recevoir une réponse JSON de ce type :

    {
      "version": 1,
      "etag": "BwWo331TkHE=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "serviceAccount:SERVICE_AGENT_EMAIL"
          ]
        },
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
          ]
        }
      ]
    }
    

Associer le compte de service à la nouvelle ressource

Après avoir configuré le compte de service géré par l'utilisateur, vous pouvez créer une ressource et lui associer le compte de service. Assurez-vous de créer la ressource dans le projet approprié.

Consultez les instructions concernant le type de ressource que vous souhaitez créer :

Associer un compte de service lors de la création d'une ressource
AI Platform Prediction Versions de modèle
AI Platform Training Tâches
Environnement standard App Engine Versions d'application
Environnement flexible App Engine Versions d'application
Cloud Composer Environnements
Cloud Functions Fonction Cloud
Cloud Life Sciences Pipelines
Cloud Run Services
Cloud Scheduler Tâches
Cloud Source Repositories
Compute Engine
Dataflow Tâches
Datalab Instances
Dataproc Clusters
Eventarc Déclencheurs
Google Kubernetes Engine
Notebooks Instances de notebook
Pub/Sub Abonnements
Vertex AI
Workflows Workflows

Après avoir créé la ressource et associé le compte de service à celle-ci, vous pouvez attribuer des rôles au compte de service afin qu'il puisse accéder aux ressources appropriées. Ce processus revient à attribuer un rôle à un autre compte principal.

Pour savoir comment attribuer des rôles, consultez la section Accorder, modifier et révoquer les accès aux ressources.

Associer un compte de service à une ressource d'un autre projet

Par défaut, vous ne pouvez pas créer un compte de service dans un projet et l'associer à une ressource d'un autre projet. Si vous souhaitez conserver tous vos comptes de service dans un seul projet, vous devez mettre à jour la règle d'administration pour ce projet.

Activer l'association des comptes de service à plusieurs projets

Pour permettre aux utilisateurs d'associer des comptes de service d'un projet aux ressources d'un autre projet, vérifiez les contraintes booléennes suivantes dans la règle d'administration du projet où se trouvent vos comptes de service :

  • Assurez-vous que la contrainte booléenne iam.disableCrossProjectServiceAccountUsage n'est pas appliquée pour le projet.

    Cette contrainte booléenne détermine si vous pouvez associer un compte de service à une ressource d'un autre projet. La contrainte est appliquée par défaut.

    Si cette contrainte n'est pas appliquée, IAM ajoute un privilège de projet qui empêche la suppression du projet. Ce privilège a l'origine iam.googleapis.com/cross-project-service-accounts. Nous vous déconseillons vivement de supprimer ce privilège.

  • Recommandé : assurez-vous que la contrainte booléenne iam.restrictCrossProjectServiceAccountLienRemoval est appliquée pour le projet.

    Cette contrainte booléenne garantit que les comptes principaux ne peuvent supprimer le privilège du projet que s'ils disposent de l'autorisation resourcemanager.projects.updateLiens au niveau de l'organisation. Si cette contrainte n'est pas appliquée, les comptes principaux peuvent supprimer le privilège du projet s'ils disposent de cette autorisation au niveau du projet.

Pour savoir comment afficher ou modifier une contrainte booléenne dans une règle d'administration, consultez Créer et gérer des règles d'administration.

Désactiver l'association de comptes de service à plusieurs projets

Si vous avez déjà activé l'association de comptes de service entre projets, nous vous déconseillons vivement de désactiver cette fonctionnalité, en particulier dans les environnements de production.

Plus précisément, dans le projet où se trouvent vos comptes de service, vous ne devez effectuer aucune des modifications suivantes :

  • Ne modifiez pas la règle d'administration du projet pour appliquer la contrainte booléenne iam.disableCrossProjectServiceAccountUsage.
  • Ne modifiez pas la règle d'administration du projet pour désactiver l'application de la contrainte booléenne iam.restrictCrossProjectServiceAccountLienRemoval.
  • Ne supprimez pas le privilège de projet avec l'origine iam.googleapis.com/cross-project-service-accounts, car il vous empêche de supprimer le projet.
  • Ne supprimez pas le projet.

Si vous êtes prêt à accepter le risque de désactiver cette fonctionnalité, vous pouvez tout de même réduire les risques en désactivant les comptes de service que vous utilisez dans les projets, puis en surveillant votre environnement Google Cloud pour détecter d'éventuels problèmes. Si vous rencontrez des problèmes, vous pouvez réactiver les comptes de service. Si vous ne constatez aucun problème, vous ne disposez peut-être pas de ressources Google Cloud qui dépendent d'un compte de service situé dans un autre projet.

Étape suivante