Gérer l'usurpation d'un compte de service

Cette page explique comment autoriser les membres et les ressources à emprunter l'identité d'un compte de service Cloud IAM (Cloud Identity and Access Management), ou à agir en tant que ce compte. Elle explique également comment identifier les membres autorisés à emprunter l'identité d'un compte de service Cloud IAM donné.

Avant de commencer

Assurez-vous de bien comprendre le fonctionnement des comptes de service dans Cloud IAM.

Autoriser les membres à emprunter l'identité des comptes de service

Il existe plusieurs rôles prédéfinis qui permettent à un membre d'emprunter l'identité d'un compte de service :

  • Utilisateur du compte de service (roles/iam.serviceAccountUser) : permet aux membres d'accéder indirectement à toutes les ressources auxquelles le compte de service a accès. Par exemple, si un membre dispose du rôle Utilisateur de compte de service sur un compte de service et du rôle Administrateur Cloud SQL (roles/cloudsql.admin) sur le projet, il peut emprunter l'identité du compte de service pour créer une instance Cloud SQL.

    Ce rôle permet également aux membres de lier un compte de service à une ressource, comme expliqué sur cette page.

  • Créateur de jetons de compte de service (roles/iam.serviceAccountTokenCreator) : permet aux membres d'emprunter l'identité des comptes de service pour créer des jetons d'accès OAuth 2.0, signer des jetons Web JSON (JWT) et signer des blobs binaires pour l'authentification. Pour en savoir plus, consultez la page Créer des identifiants de compte de service éphémères.

  • Utilisateur de Workload Identity (roles/iam.workloadIdentityUser) : permet aux membres d'emprunter l'identité des comptes de service associés aux charges de travail GKE. Ce rôle ne peut pas être accordé sur des comptes de service individuels, mais il peut l'être sur un projet, un dossier ou une organisation.

Vous pouvez également attribuer un rôle prédéfini différent ou un rôle personnalisé, qui inclut les mêmes autorisations que ces rôles.

Dans les sections suivantes, nous allons voir comment attribuer ces rôles sur des projets, des dossiers et des organisations, et comment les attribuer à des comptes de service individuels. Choisissez le niveau en fonction du niveau d'accès que vous souhaitez accorder :

Autoriser un membre à emprunter l'identité de plusieurs comptes de service

Pour autoriser un membre à emprunter l'identité de tous les comptes de service créés dans un projet, un dossier ou une organisation, accordez un rôle sur le projet, le dossier ou l'organisation.

Console

  1. Dans Cloud Console, accédez à la page IAM.

    Accéder à la page "IAM"

  2. Dans le sélecteur de projet en haut de la page, sélectionnez le projet, le dossier ou l'organisation pour lequel vous souhaitez attribuer le rôle.

  3. Cliquez sur Ajouter.

  4. Saisissez l'adresse e-mail du membre.

  5. Sélectionnez un rôle permettant au membre d'emprunter l'identité des comptes de service. Consultez la liste des rôles permettant d'emprunter l'identité des comptes de service.

  6. Cliquez sur Enregistrer.

gcloud

Pour accorder à un membre un rôle l'autorisant à emprunter l'identité d'un compte de service, modifiez la stratégie IAM de votre projet, dossier ou organisation.

  1. Lisez la stratégie Cloud AM de la ressource :

    gcloud resource get-iam-policy resource-id \
        --format=json > policy.json
    

    Remplacez les valeurs suivantes :

    • resource : type de la ressource sur laquelle vous souhaitez définir la stratégie. Cette valeur doit correspondre à l'une des valeurs suivantes : projects, resource-manager folders ou organizations.
    • resource-id : ID de la ressource sur laquelle vous souhaitez définir la stratégie.

    La commande stocke la stratégie de la ressource dans un fichier policy.json.

    Si une stratégie est déjà définie sur la ressource, le fichier policy.json se présente comme suit :

    {
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/owner"
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    

    S'il n'existe aucune règle sur la ressource, le fichier policy.json ne contient que la valeur etag par défaut.

    En l'absence de stratégie existante, créez-la manuellement en utilisant le code JSON des étapes suivantes comme modèle.

  2. Modifiez la stratégie pour attribuer les rôles appropriés à vos membres. Pour accorder un rôle, effectuez l'une des opérations suivantes :

    • Si aucune liaison pour le rôle n'existe, ajoutez un objet au tableau bindings qui indique le rôle que vous souhaitez attribuer et le membre auquel vous souhaitez l'accorder.
    • Si une liaison existe déjà pour le rôle, ajoutez le nouveau membre à la liste des membres existants. Si votre stratégie inclut des liaisons de rôle conditionnelles, assurez-vous également que la liaison contient les conditions appropriées avant d'ajouter le membre.

    Si le tableau bindings n'existe pas déjà, vous pouvez le créer.

    Exemple

    Pour accorder le rôle Utilisateur de compte de service (roles/iam.serviceAccountUser) à robin@example.com, modifiez l'exemple présenté à l'étape précédente comme suit :

    {
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/owner",
          "members": [
            "user:hollis@example.com"
          ]
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    
  3. Écrivez la stratégie mise à jour :

    gcloud resource set-iam-policy resource-id \
        policy-file
    

    Remplacez les valeurs suivantes :

    • resource : type de la ressource sur laquelle vous souhaitez définir la stratégie. Cette valeur doit correspondre à l'une des valeurs suivantes : projects, resource-manager folders ou organizations.
    • resource-id : ID de la ressource sur laquelle vous souhaitez définir la stratégie.
    • policy-file : chemin d'accès au fichier contenant la stratégie mise à jour.

    La commande imprime la stratégie mise à jour avec une valeur etag mise à jour.

REST

Pour attribuer un rôle à l'aide de l'API REST Resource Manager, vous devez lire la stratégie IAM actuelle de votre projet, dossier ou organisation, la modifier pour attribuer les rôles souhaités, puis écrire la stratégie mise à jour.

Consultez la stratégie Cloud IAM associée à la ressource.

La méthode getIamPolicy de l'API Resource Manager permet d'obtenir la stratégie IAM d'un projet, d'un dossier ou d'une organisation.

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

  • api-version : version de l'API à utiliser. Pour les projets et les organisations, utilisez v1. Pour les dossiers, utilisez v2.
  • resource-type : type de ressource dont vous souhaitez gérer la stratégie. Utilisez la valeur projects, folders ou organizations.
  • resource-id : ID du projet, de l'organisation ou du dossier Google Cloud.
  • policy-version : version de la stratégie à renvoyer. Les requêtes doivent spécifier la version de stratégie la plus récente, qui est la version 3. Pour plus d'informations, consultez la section Spécifier une version de stratégie lors de l'obtention d'une stratégie.

Méthode HTTP et URL :

POST https://cloudresourcemanager.googleapis.com/api-version/resource-type/resource-id:getIamPolicy

Corps JSON de la requête :

{
  "options": {
    "requestedPolicyVersion": policy-version
  }
}

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": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

En l'absence de stratégie existante, la réponse ne contient que la valeur etag par défaut. Si vous recevez cette réponse, ajoutez un champ version défini sur 3 et un champ bindings défini sur un tableau vide.

Modifiez la stratégie pour attribuer les rôles appropriés à vos membres.

Pour accorder un rôle, effectuez l'une des opérations suivantes :

  • Si aucune liaison pour le rôle n'existe, ajoutez un objet au tableau bindings qui indique le rôle que vous souhaitez attribuer et le membre auquel vous souhaitez l'accorder.
  • Si une liaison existe déjà pour le rôle, ajoutez le nouveau membre à la liste des membres existants.

Exemple :

Pour accorder le rôle Utilisateur de compte de service (roles/iam.serviceAccountUser) à robin@example.com, modifiez l'exemple présenté à l'étape précédente comme suit :

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.serviceAccountUser",
      "members": [
        "user:robin@example.com"
      ]
    },
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

Écrivez la stratégie mise à jour.

La méthode setIamPolicy de l'API Resource Manager définit la stratégie de la requête comme nouvelle stratégie IAM pour le projet, le dossier ou l'organisation.

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

  • api-version : version de l'API à utiliser. Pour les projets et les organisations, utilisez v1. Pour les dossiers, utilisez v2.
  • resource-type : type de ressource dont vous souhaitez gérer la stratégie. Utilisez la valeur projects, folders ou organizations.
  • resource-id : ID du projet, de l'organisation ou du dossier Google Cloud.
  • policy : représentation JSON de la stratégie que vous souhaitez définir. Pour en savoir plus sur le format d'une stratégie, consultez la documentation de référence sur les stratégies.

    Par exemple, pour définir la stratégie présentée à l'étape précédente, remplacez policy par ce qui suit :

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/owner",
          "members": [
            "user:owner@example.com"
          ]
        }
      ]
    }
    

Méthode HTTP et URL :

POST https://iam.googleapis.com/api-version/resource-type/resource-id:setIamPolicy

Corps JSON de la requête :

{
  "policy": policy
}

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

La réponse contient la stratégie mise à jour.

Autoriser un membre à emprunter l'identité d'un seul compte de service

Pour permettre à un membre d'emprunter l'identité d'un seul compte de service, attribuez un rôle sur le compte de service :

Console

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

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez un projet et cliquez sur Ouvrir.

  3. Sélectionnez un compte de service. Si le panneau d'informations n'est pas déjà visible, cliquez sur Afficher le panneau d'informations. Le panneau affiche la liste des rôles attribués au compte de service.

  4. Cliquez sur Ajouter un membre.

  5. Saisissez l'adresse e-mail du membre.

  6. Sélectionnez un rôle autorisant le membre à emprunter l'identité des comptes de service. Consultez la liste des rôles permettant d'emprunter l'identité des comptes de service.

  7. Cliquez sur Ajouter pour appliquer le rôle au membre du projet.

Pour attribuer des rôles sur plusieurs comptes de service, répétez ces étapes pour chaque compte de service.

gcloud

Pour accorder à un membre un rôle l'autorisant à emprunter l'identité d'un compte de service, modifiez la stratégie IAM de votre compte de service.

  1. Utilisez la commande service-accounts get-iam-policy pour lire la stratégie actuelle :

    gcloud iam service-accounts get-iam-policy sa-id \
        --format=json > policy.json
    

    Remplacez les valeurs suivantes :

    • sa-id : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format sa-name@project-id.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

    La commande stocke la stratégie du compte de service dans un fichier policy.json.

    Si une stratégie est déjà définie sur le compte de service, le fichier policy.json se présente comme suit :

    {
      "bindings": [
        {
          "members": [
            "user:hollis@example.com"
          ],
          "role": "roles/iam.serviceAccountAdmin"
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    

    Si aucune stratégie n'est définie sur le compte de service, le fichier policy.json ne contient que le etag par défaut.

    En l'absence de stratégie existante, créez-la manuellement en utilisant le code JSON des étapes suivantes comme modèle.

  2. Dans un éditeur de texte, modifiez le tableau de liaisons dans le fichier policy.json afin d'attribuer les rôles appropriés aux membres. Pour accorder un rôle, effectuez l'une des opérations suivantes :

    • Si aucune liaison pour le rôle n'existe, ajoutez un objet au tableau bindings qui indique le rôle que vous souhaitez attribuer et le membre auquel vous souhaitez l'accorder.
    • Si une liaison existe déjà pour le rôle, ajoutez le nouveau membre à la liste des membres existants. Si votre stratégie inclut des liaisons de rôle conditionnelles, assurez-vous également que la liaison contient les conditions appropriées avant d'ajouter le membre.

    Si le tableau bindings n'existe pas déjà, vous pouvez le créer.

    Exemple

    Pour accorder le rôle Utilisateur de compte de service (roles/iam.serviceAccountUser) à robin@example.com, modifiez l'exemple présenté à l'étape précédente comme suit :

    {
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountAdmin",
          "members": [
            "user:hollis@example.com"
          ]
        }
      ],
      "etag": "BwUqLaVeua8=",
      "version": 1
    }
    
  3. Exécutez la commande service-accounts set-iam-policy pour écrire la stratégie mise à jour :

    gcloud iam service-accounts set-iam-policy sa-id \
        policy-file
    

    Remplacez les valeurs suivantes :

    • sa-id : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format sa-name@project-id.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.
    • policy-file : chemin d'accès au fichier contenant la stratégie mise à jour.

    La commande imprime la stratégie mise à jour avec une valeur etag mise à jour.

REST

Pour attribuer un rôle à l'aide de l'API REST IAM, vous devez lire la stratégie IAM actuelle du compte de service, la modifier pour attribuer les rôles souhaités, puis écrire la stratégie mise à jour.

Lisez la stratégie Cloud IAM du compte de service.

La méthode serviceAccounts.getIamPolicy permet d'obtenir la stratégie IAM d'un 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.
  • sa-id : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format sa-name@project-id.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

  • policy-version : version de la stratégie à renvoyer. Les requêtes doivent spécifier la version de stratégie la plus récente, qui est la version 3. Pour plus d'informations, consultez la section Spécifier une version de stratégie lors de l'obtention d'une stratégie.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:getIamPolicy

Corps JSON de la requête :

{
  "options": {
    "requestedPolicyVersion": policy-version
  }
}

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": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

En l'absence de stratégie existante, la réponse ne contient que la valeur etag par défaut. Si vous recevez cette réponse, ajoutez un champ version défini sur 3 et un champ bindings défini sur un tableau vide.

Modifiez la stratégie pour attribuer les rôles appropriés à vos membres.

Dans un éditeur de texte, modifiez le tableau de liaisons du corps de la réponse pour attribuer les rôles appropriés aux membres. Pour accorder un rôle, effectuez l'une des opérations suivantes :

  • Si aucune liaison pour le rôle n'existe, ajoutez un objet au tableau bindings qui indique le rôle que vous souhaitez attribuer et le membre auquel vous souhaitez l'accorder.
  • Si une liaison existe déjà pour le rôle, ajoutez le nouveau membre à la liste des membres existants.

Exemple :

Pour accorder le rôle Utilisateur de compte de service (roles/iam.serviceAccountUser) à robin@example.com, modifiez l'exemple présenté à l'étape précédente comme suit :

{
  "version": 1,
  "etag": "BwUqLaVeua8=",
  "bindings": [
    {
      "role": "roles/iam.serviceAccountUser",
      "members": [
        "user:robin@example.com"
      ]
    },
    {
      "role": "roles/iam.serviceAccountAdmin",
      "members": [
        "user:admin@example.com"
      ]
    }
  ]
}

Écrivez la stratégie mise à jour.

La méthode serviceAccounts.setIamPolicy définit une stratégie IAM mise à jour 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.
  • sa-id : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format sa-name@project-id.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

  • policy : représentation JSON de la stratégie que vous souhaitez définir. Pour en savoir plus sur le format d'une stratégie, consultez la documentation de référence sur les stratégies.

    Par exemple, pour définir la stratégie présentée à l'étape précédente, remplacez policy par ce qui suit :

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:admin@example.com"
          ]
        }
      ]
    }
    

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:setIamPolicy

Corps JSON de la requête :

{
  "policy": policy
}

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

La réponse contient la stratégie mise à jour.

Répertorier les membres pouvant accéder à un compte de service

Utilisez Cloud Console pour afficher tous les membres ayant accès à un compte de service, soit en raison des rôles attribués à celui-ci, soit en raison des rôles attribués au projet, au dossier ou à l'organisation :

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

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez un projet et cliquez sur Ouvrir.

  3. Cochez la case à côté du compte de service souhaité.

  4. Si le panneau d'informations n'est pas déjà visible, cliquez sur Afficher le panneau d'informations. La liste des rôles accordés sur le compte de service s'affiche.

  5. Développez chaque rôle pour voir les membres à qui a été accordé ce rôle sur le compte de service.

Associer un compte de service à une ressource

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 emprunte l'identité du compte de service qui lui est associé. Par exemple, si vous associez un compte de service à une instance Compute Engine, les applications de l'instance utilisent automatiquement ce compte de service lorsqu'elles appellent les API Google Cloud.

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.

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 Notebooks Instances de notebook
AI Platform Prediction Versions de modèle
AI Platform Training Tâches
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
Google Kubernetes Engine
Pub/Sub Abonnements

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 membre.

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

Étapes suivantes