Gérer l'accès aux projets, aux dossiers et aux organisations

Cette page explique comment accorder, modifier et révoquer des accès à des projets, des dossiers et des organisations. Pour savoir comment gérer l'accès à d'autres ressources, consultez les guides suivants :

Dans Identity and Access Management (IAM), l'accès est géré via les stratégies IAM. Une stratégie IAM est associée à une ressource Google Cloud. Chaque stratégie contient un ensemble de liaisons de rôles qui associent un ou plusieurs comptes principaux, tels que des utilisateurs ou des comptes de service, à un rôle IAM. Ces liaisons de rôles accordent les rôles spécifiés aux comptes principaux, à la fois sur la ressource associée à la stratégie et sur tous les descendants de cette ressource. Pour en savoir plus sur les stratégies IAM, consultez la page Comprendre les stratégies.

Vous pouvez gérer l'accès aux projets, aux dossiers et aux organisations à l'aide de Google Cloud Console, de l'outil de ligne de commande gcloud, de l'API REST ou des bibliothèques clientes Resource Manager.

Avant de commencer

  • Activez Resource Manager API.

    Activer l'API

Autorisations requises

Pour gérer l'accès à un projet, un dossier ou une organisation, vous devez disposer d'un rôle qui inclut les autorisations suivantes, où RESOURCE_TYPE correspond au type de ressource dont le compte principal gérera l'accès (projects, folders ou organizations) :

  • resourcemanager.RESOURCE_TYPE.get
  • resourcemanager.RESOURCE_TYPE.getIamPolicy
  • resourcemanager.RESOURCE_TYPE.setIamPolicy

Pour obtenir ces autorisations tout en suivant le principe du moindre privilège, demandez à votre administrateur de vous attribuer l'un des rôles suivants :

  • Pour gérer l'accès aux projets : Administrateur de projet IAM (roles/resourcemanager.projectIamAdmin)
  • Pour gérer l'accès aux projets et aux dossiers : Administrateur de dossier (roles/resourcemanager.folderAdmin)
  • Pour gérer l'accès aux projets, aux dossiers et aux organisations : Administrateur de l'organisation (roles/resourcemanager.organizationAdmin)
  • Pour gérer l'accès à presque toutes les ressources Google Cloud : Administrateur de sécurité (roles/iam.securityAdmin)

Votre administrateur peut également vous attribuer un autre rôle qui inclut les autorisations requises, par exemple un rôle personnalisé ou un rôle prédéfini moins restrictif.

Afficher l'accès actuel

Vous pouvez voir qui a accès à votre projet, dossier ou organisation à l'aide de Cloud Console, de l'outil gcloud, de l'API REST ou des bibliothèques clientes Resource Manager.

Console

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

    Accéder à IAM

  2. Sélectionnez un projet, un dossier ou une organisation.

    Cloud Console répertorie tous les comptes principaux auxquels des rôles ont été attribués sur votre projet, dossier ou organisation. Cette liste inclut les comptes principaux qui ont hérité de rôles sur la ressource à partir de ressources parentes. Pour en savoir plus sur l'héritage des stratégies, consultez la section Héritage des stratégies et hiérarchie des ressources.

  3. Facultatif : Pour afficher les attributions de rôles sur les comptes de service gérés par Google, cochez la case Inclure les attributions de rôles fournies par Google.

gcloud

Pour savoir qui a accès à votre projet, dossier ou organisation, obtenez la stratégie IAM de la ressource. Pour apprendre à interpréter les stratégies IAM, consultez la page Comprendre les stratégies.

Pour obtenir la stratégie IAM associée à la ressource, exécutez la commande get-iam-policy correspondant à cette ressource :

gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

Indiquez les valeurs suivantes :

  • RESOURCE_TYPE : type de la ressource dont vous souhaitez consulter l'accès. Utilisez l'une des valeurs suivantes : projects, resource-manager folders ou organizations.
  • RESOURCE_ID : ID de votre projet, dossier ou organisation Google Cloud. Les ID de projets sont alphanumériques, par exemple my-project. Les ID de dossiers et d'organisations sont numériques, tels que 123456789012.
  • FORMAT : format souhaité pour la stratégie. Utilisez json ou yaml.
  • PATH : le chemin d'accès à un nouveau fichier de sortie pour la stratégie.

Par exemple, la commande suivante récupère la stratégie du projet my-project et l'enregistre dans votre répertoire d'accueil au format JSON :

gcloud projects get-iam-policy my-project --format=json > ~/policy.json

REST

Pour savoir qui a accès à votre projet, dossier ou organisation, obtenez la stratégie IAM de la ressource. Pour apprendre à interpréter les stratégies IAM, consultez la page Comprendre les stratégies.

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, 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. Les ID de projet sont des chaînes alphanumériques, telles que my-project. Les ID de dossier et d'organisation sont numériques, tels que 123456789012.
  • 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 :

La réponse contient la stratégie IAM de la ressource. Exemple :

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

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class GetPolicy {

  // Gets a project's policy.
  public static Policy getPolicy(String projectId) {
    // projectId = "my-project-id"

    Policy policy = null;

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return policy;
    }

    try {
      GetIamPolicyRequest request = new GetIamPolicyRequest();
      policy = service.projects().getIamPolicy(projectId, request).execute();
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    } catch (IOException e) {
      System.out.println("Unable to get policy: \n" + e.toString());
      return policy;
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

def get_policy(project_id, version=1):
    """Gets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )
    policy = (
        service.projects()
        .getIamPolicy(
            resource=project_id,
            body={"options": {"requestedPolicyVersion": version}},
        )
        .execute()
    )
    print(policy)
    return policy

Attribuer ou révoquer un rôle unique

Vous pouvez utiliser Cloud Console et l'outil gcloud pour accorder ou révoquer rapidement un rôle unique pour un seul compte principal, sans modifier directement la stratégie IAM de la ressource. Les types de membres courants incluent les comptes principaux Google, les comptes de service, les Google Groupes et les domaines. Pour obtenir la liste de tous les types de comptes principaux, consultez la page Concepts liés à l'identité.

Si vous avez besoin d'aide pour identifier le rôle prédéfini le plus approprié, consultez la section Choisir des rôles prédéfinis.

Attribuer un rôle unique

Pour attribuer un seul rôle à un compte principal, procédez comme suit :

Console

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

    Accéder à IAM

  2. Sélectionnez un projet, un dossier ou une organisation.

  3. Sélectionnez un compte principal auquel attribuer un rôle :

    • Pour attribuer un rôle à un compte principal disposant déjà d'autres rôles sur la ressource, recherchez la ligne contenant l'adresse e-mail du compte principal, puis cliquez sur Modifier le compte principal sur cette ligne, puis sur Ajouter un rôle.

      Pour attribuer un rôle à un compte de service géré par Google, cochez la case Inclure les attributions de rôles fournies par Google pour afficher son adresse e-mail.

    • Pour attribuer un rôle à un compte principal qui ne dispose pas déjà d'autres rôles sur la ressource, cliquez sur Ajouter un compte principal, puis saisissez l'adresse e-mail du compte principal.

  4. Sélectionnez un rôle à attribuer dans la liste déroulante. Pour respecter les bonnes pratiques de sécurité, choisissez un rôle qui n'inclut que les autorisations dont votre compte principal a besoin.

  5. Facultatif : ajoutez une condition au rôle.

  6. Cliquez sur Enregistrer. Le rôle est attribué au compte principal sur la ressource.

Pour attribuer un rôle à un compte principal sur plusieurs projets, dossiers ou organisations, procédez comme suit :

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Sélectionnez tous les projets pour lesquels vous souhaitez accorder des autorisations.

  3. Si le panneau d'informations n'est pas déjà visible, cliquez sur Afficher le panneau d'informations. Cliquez ensuite sur Autorisations.

  4. Sélectionnez un compte principal auquel attribuer un rôle :

    • Pour attribuer un rôle à un compte principal qui dispose déjà d'autres rôles, recherchez une ligne contenant l'adresse e-mail du compte principal, puis cliquez surModifier le compte principal sur cette ligne, puis sur Ajouter un rôle.

    • Pour attribuer un rôle à un compte principal qui ne dispose pas déjà d'autres rôles, cliquez sur  Ajouter un compte principal, puis saisissez son adresse e-mail.

  5. Sélectionnez un rôle à attribuer dans la liste déroulante.

  6. Facultatif : ajoutez une condition au rôle.

  7. Cliquez sur Enregistrer. Le rôle sélectionné est attribué au compte principal sur chacune des ressources sélectionnées.

gcloud

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

gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
    --member=PRINCIPAL --role=ROLE_ID \
    --condition=CONDITION

Indiquez les valeurs suivantes :

  • RESOURCE_TYPE : type de ressource dont vous souhaitez gérer l'accès. Utilisez projects, resource-manager folders ou organizations.
  • RESOURCE_ID : ID de votre projet, dossier ou organisation Google Cloud. Les ID de projets sont alphanumériques, par exemple my-project. Les ID de dossier et d'organisation sont numériques, tels que 123456789012.
  • PRINCIPAL : l'identifiant du compte principal, qui se présente généralement sous la forme suivante : PRINCIPAL_TYPE:ID. Exemple : user:my-user@example.com. Pour obtenir la liste complète des valeurs possibles pour PRINCIPAL, consultez la documentation de référence sur les liaisons de stratégie.

    Pour le type de membre user, le nom de domaine indiqué dans l'identifiant doit être un domaine Google Workspace ou Cloud Identity. Pour savoir comment configurer un domaine Cloud Identity, consultez la présentation de Cloud Identity.

  • ROLE_ID : nom du rôle que vous souhaitez attribuer. Exemple :roles/resourcemanager.projectCreator Pour obtenir la liste des rôles, consultez la page Comprendre les rôles.

  • CONDITION : facultatif. Condition à ajouter à la liaison de rôle. Pour en savoir plus sur les conditions, consultez la présentation des conditions.

Par exemple, pour accorder le rôle de créateur de projet à l'utilisateur my-user@example.com sur le projet my-project, procédez comme suit :

gcloud projects add-iam-policy-binding my-project \
    --member=user:my-user@example.com --role=roles/resourcemanager.projectCreator

Révoquer un rôle unique

Pour révoquer un seul rôle d'un compte principal, procédez comme suit :

Console

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

    Accéder à IAM

  2. Sélectionnez un projet, un dossier ou une organisation.

  3. Recherchez la ligne contenant l'adresse e-mail du compte principal dont vous souhaitez révoquer l'accès. Cliquez ensuite sur Modifier le compte principal sur cette ligne.

  4. Cliquez sur le bouton Supprimer () pour chaque rôle que vous souhaitez révoquer, puis cliquez sur Enregistrer.

gcloud

Pour révoquer un rôle d'un utilisateur, exécutez la commande remove-iam-policy-binding :

gcloud RESOURCE_TYPE remove-iam-policy-binding RESOURCE_ID \
    --member=PRINCIPAL --role=ROLE_ID

Indiquez les valeurs suivantes :

  • RESOURCE_TYPE : type de ressource dont vous souhaitez gérer l'accès. Utilisez projects, resource-manager folders ou organizations.
  • RESOURCE_ID : ID de votre projet, dossier ou organisation Google Cloud. Les ID de projets sont alphanumériques, par exemple my-project. Les ID de dossier et d'organisation sont numériques, tels que 123456789012.
  • PRINCIPAL : l'identifiant du compte principal, qui se présente généralement sous la forme suivante : PRINCIPAL_TYPE:ID. Exemple : user:my-user@example.com. Pour obtenir la liste complète des valeurs possibles pour PRINCIPAL, consultez la documentation de référence sur les liaisons de stratégie.

    Pour le type de membre user, le nom de domaine indiqué dans l'identifiant doit être un domaine Google Workspace ou Cloud Identity. Pour savoir comment configurer un domaine Cloud Identity, consultez la présentation de Cloud Identity.

  • ROLE_ID : nom du rôle que vous souhaitez révoquer. Exemple :roles/resourcemanager.projectCreator Pour obtenir la liste des rôles, consultez la page Comprendre les rôles.

Par exemple, pour révoquer le rôle de créateur de projet de l'utilisateur my-user@example.com sur le projet my-project, procédez comme suit :

gcloud projects remove-iam-policy-binding my-project \
    --member=user:my-user@example.com --role=roles/resourcemanager.projectCreator

Attribuer ou révoquer plusieurs rôles

Pour effectuer des modifications d'accès à grande échelle impliquant l'attribution et la révocation de plusieurs rôles, utilisez le modèle lecture-modification-écriture pour mettre à jour la stratégie IAM de la ressource :

  1. Lire la stratégie actuelle en appelant getIamPolicy().
  2. Modifier la stratégie renvoyée, à l’aide d’un éditeur de texte ou de façon automatisée, afin d'ajouter ou de supprimer des comptes principaux ou des liaisons de rôles.
  3. Écrire la stratégie mise à jour en appelant setIamPolicy().

Vous pouvez utiliser l'outil gcloud, l'API REST ou les bibliothèques clientes Resource Manager pour mettre à jour la stratégie.

Obtenir la stratégie actuelle

gcloud

Pour obtenir la stratégie IAM associée à la ressource, exécutez la commande get-iam-policy correspondant à cette ressource :

gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

Indiquez les valeurs suivantes :

  • RESOURCE_TYPE : type de la ressource pour laquelle vous souhaitez obtenir la stratégie. Utilisez l'une des valeurs suivantes : projects, resource-manager folders ou organizations.
  • RESOURCE_ID : ID de votre projet, dossier ou organisation Google Cloud. Les ID de projets sont alphanumériques, par exemple my-project. Les ID de dossiers et d'organisations sont numériques, tels que 123456789012.
  • FORMAT : format souhaité pour la stratégie. Utilisez json ou yaml.
  • PATH : le chemin d'accès à un nouveau fichier de sortie pour la stratégie.

Par exemple, la commande suivante récupère la stratégie du projet my-project et l'enregistre dans votre répertoire d'accueil au format JSON :

gcloud projects get-iam-policy my-project --format json > ~/policy.json

REST

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, 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. Les ID de projet sont des chaînes alphanumériques, telles que my-project. Les ID de dossier et d'organisation sont numériques, tels que 123456789012.
  • 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 :

La réponse contient la stratégie IAM de la ressource. Exemple :

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

Enregistrez la réponse dans un fichier du type approprié (json ou yaml).

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class GetPolicy {

  // Gets a project's policy.
  public static Policy getPolicy(String projectId) {
    // projectId = "my-project-id"

    Policy policy = null;

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return policy;
    }

    try {
      GetIamPolicyRequest request = new GetIamPolicyRequest();
      policy = service.projects().getIamPolicy(projectId, request).execute();
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    } catch (IOException e) {
      System.out.println("Unable to get policy: \n" + e.toString());
      return policy;
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

def get_policy(project_id, version=1):
    """Gets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )
    policy = (
        service.projects()
        .getIamPolicy(
            resource=project_id,
            body={"options": {"requestedPolicyVersion": version}},
        )
        .execute()
    )
    print(policy)
    return policy

Modifier la stratégie

De façon automatisée ou à l'aide d'un éditeur de texte, modifiez la copie locale de la stratégie de votre ressource afin de refléter les rôles que vous souhaitez accorder ou révoquer aux utilisateurs donnés.

Pour vous assurer de ne pas écraser les autres modifications de la stratégie, ne modifiez pas et ne supprimez pas le champ etag de la stratégie. Le champ etag identifie l'état actuel de la stratégie. Lorsque vous définissez la stratégie modifiée, Cloud IAM compare la valeur etag de la requête avec la valeur etag existante et n'écrit la stratégie que si les valeurs correspondent.

Attribuer un rôle

Pour attribuer des rôles à vos comptes principaux, modifiez les liaisons de rôles dans la stratégie. Pour savoir quels rôles vous pouvez attribuer, consultez la section Comprendre les rôles ou Afficher les rôles pouvant être attribués sur la ressource. Si vous avez besoin d'identifier les rôles prédéfinis les plus appropriés, consultez la section Choisir des rôles prédéfinis.

Vous pouvez éventuellement utiliser des conditions pour n'accorder des rôles que lorsque certaines conditions sont remplies.

Pour accorder un rôle déjà inclus dans la stratégie, ajoutez le compte principal à une liaison de rôle existante :

gcloud

Modifiez la stratégie renvoyée en ajoutant le compte principal à une liaison de rôle existante. Notez que cette modification de stratégie ne prendra effet que lorsque vous aurez défini la stratégie mise à jour.

Par exemple, imaginons que la stratégie renvoyée contienne la liaison de rôle suivante, qui attribue le rôle Examinateur de sécurité (roles/iam.securityReviewer) à kai@example.com :

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

Pour accorder ce même rôle à raha@example.com, ajoutez raha@example.com à la liaison de rôle existante :

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

REST

Modifiez la stratégie renvoyée en ajoutant le compte principal à une liaison de rôle existante. Notez que cette modification de stratégie ne prendra effet que lorsque vous aurez défini la stratégie mise à jour.

Par exemple, imaginons que la stratégie renvoyée contienne la liaison de rôle suivante, qui attribue le rôle Examinateur de sécurité (roles/iam.securityReviewer) à kai@example.com :

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

Pour accorder ce même rôle à raha@example.com, ajoutez raha@example.com à la liaison de rôle existante :

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

C#

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.List;

public class AddMember {

  // Adds a member to a preexisting role.
  public static void addMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-add@example.com";

    List<Binding> bindings = policy.getBindings();

    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        b.getMembers().add(member);
        System.out.println("Member " + member + " added to role " + role);
        return;
      }
    }

    System.out.println("Role not found in policy; member not added");
  }
}

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.

def modify_policy_add_member(policy, role, member):
    """Adds a new member to a role binding."""

    binding = next(b for b in policy["bindings"] if b["role"] == role)
    binding["members"].append(member)
    print(binding)
    return policy

Pour accorder un rôle qui n'est pas encore inclus dans la stratégie, ajoutez une liaison de rôle :

gcloud

Modifiez la stratégie renvoyée en ajoutant une nouvelle liaison de rôle qui accorde le rôle au compte principal. Cette modification de stratégie ne prendra effet que lorsque vous aurez défini la stratégie mise à jour.

Par exemple, pour accorder le rôle Administrateur de Compute Storage (roles/compute.storageAdmin) à raha@example.com, ajoutez la liaison de rôle suivante au tableau bindings de la stratégie :

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

REST

Modifiez la stratégie renvoyée en ajoutant une nouvelle liaison de rôle qui accorde le rôle au compte principal. Cette modification de stratégie ne prendra effet que lorsque vous aurez défini la stratégie mise à jour.

Par exemple, pour accorder le rôle Administrateur de Compute Storage (roles/compute.storageAdmin) à raha@example.com, ajoutez la liaison de rôle suivante au tableau bindings de la stratégie :

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

C#

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.


using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.ArrayList;
import java.util.List;

public class AddBinding {

  // Adds a member to a role with no previous members.
  public static void addBinding(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/role-to-add";
    List<String> members = new ArrayList<String>();
    members.add("user:member-to-add@example.com");

    Binding binding = new Binding();
    binding.setRole(role);
    binding.setMembers(members);

    policy.getBindings().add(binding);
    System.out.println("Added binding: " + binding.toString());
  }
}

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.

def modify_policy_add_role(policy, role, member):
    """Adds a new role binding to a policy."""

    binding = {"role": role, "members": [member]}
    policy["bindings"].append(binding)
    print(policy)
    return policy

Vous pouvez uniquement attribuer des rôles liés à des services d'API activés. Si un service, tel que Compute Engine, n'est pas actif, vous ne pouvez pas attribuer des rôles exclusivement liés à Compute Engine. Pour en savoir plus, consultez l'article Activer et désactiver des API.

L'octroi d'autorisations sur des projets présente certaines contraintes, en particulier lors de l'attribution du rôle Propriétaire (roles/owner). Pour en savoir plus, consultez la documentation de référence de projects.setIamPolicy().

Révoquer un rôle

Pour révoquer un rôle, supprimez le compte principal de la liaison de rôle. Si la liaison de rôle ne comporte aucun autre compte principal, supprimez toute la liaison de rôle.

gcloud

Révoquez un rôle en modifiant la stratégie JSON ou YAML renvoyée par la commande get-iam-policy. Cette modification de stratégie ne prendra effet que lorsque vous aurez défini la stratégie mise à jour.

Pour révoquer un rôle d'un compte principal, supprimez les comptes principaux ou les liaisons concernés du tableau bindings de la stratégie.

REST

Révoquez un rôle en modifiant la stratégie JSON ou YAML renvoyée par la commande get-iam-policy. Cette modification de stratégie ne prendra effet que lorsque vous aurez défini la stratégie mise à jour.

Pour révoquer un rôle d'un compte principal, supprimez les comptes principaux ou les liaisons concernés du tableau bindings de la stratégie.

C#

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy RemoveMember(Policy policy, string role, string member)
    {
        try
        {
            var binding = policy.Bindings.First(x => x.Role == role);
            if (binding.Members.Count != 0 && binding.Members.Contains(member))
            {
                binding.Members.Remove(member);
            }
            if (binding.Members.Count == 0)
            {
                policy.Bindings.Remove(binding);
            }
            return policy;
        }
        catch (System.InvalidOperationException e)
        {
            System.Diagnostics.Debug.WriteLine("Role does not exist in policy: \n" + e.ToString());
            return policy;
        }
    }
}

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.List;

public class RemoveMember {

  // Removes member from a role; removes binding if binding contains 0 members.
  public static void removeMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-remove@example.com";

    List<Binding> bindings = policy.getBindings();
    Binding binding = null;
    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        binding = b;
      }
    }
    if (binding.getMembers().contains(member)) {
      binding.getMembers().remove(member);
      System.out.println("Member " + member + " removed from " + role);
      if (binding.getMembers().isEmpty()) {
        policy.getBindings().remove(binding);
      }
      return;
    }

    System.out.println("Role not found in policy; member not removed");
    return;
  }
}

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour Resource Manager, consultez la page Bibliothèques clientes Resource Manager.

def modify_policy_remove_member(policy, role, member):
    """Removes a  member from a role binding."""
    binding = next(b for b in policy["bindings"] if b["role"] == role)
    if "members" in binding and member in binding["members"]:
        binding["members"].remove(member)
    print(binding)
    return policy

Définir la stratégie

Après avoir modifié la stratégie pour accorder et révoquer les rôles souhaités, appelez setIamPolicy() pour effectuer les mises à jour.

gcloud

Pour définir la stratégie IAM de la ressource, exécutez la commande set-iam-policy :

gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

Indiquez les valeurs suivantes :

  • RESOURCE_TYPE : type de la ressource sur laquelle vous souhaitez définir la stratégie. Utilisez l'une des valeurs suivantes : projects, resource-manager folders ou organizations.
  • RESOURCE_ID : ID de votre projet, dossier ou organisation Google Cloud. Les ID de projets sont alphanumériques, par exemple my-project. Les ID de dossiers et d'organisations sont numériques, tels que 123456789012.
  • PATH : le chemin d'accès à un fichier contenant la nouvelle stratégie.

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

Par exemple, la commande suivante définit la stratégie stockée dans policy.json comme stratégie pour le projet my-project :

gcloud projects set-iam-policy my-project ~/policy.json

REST

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, 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. Les ID de projet sont des chaînes alphanumériques, telles que my-project. Les ID de dossier et d'organisation sont numériques, tels que 123456789012.
  • 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.

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.cloudresourcemanager.v3.model.SetIamPolicyRequest;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class SetPolicy {

  // Sets a project's policy.
  public static void setPolicy(Policy policy, String projectId) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();
    // projectId = "my-project-id"

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      SetIamPolicyRequest request = new SetIamPolicyRequest();
      request.setPolicy(policy);
      Policy response = service.projects().setIamPolicy(projectId, request).execute();
      System.out.println("Policy set: " + response.toString());
    } catch (IOException e) {
      System.out.println("Unable to set policy: \n" + e.toString());
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

def set_policy(project_id, policy):
    """Sets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )

    policy = (
        service.projects()
        .setIamPolicy(resource=project_id, body={"policy": policy})
        .execute()
    )
    print(policy)
    return policy

Étape suivante

Faites l'essai

Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.

Essai gratuit