Como conceder, alterar e revogar acesso a recursos

Nesta página, descreveremos como conceder, alterar e revogar acesso a um recurso. É possível conceder diferentes níveis de acesso a recursos que você possui para diferentes usuários usando papéis de IAM refinados.

Os exemplos nesta página mostram como modificar o acesso a um projeto. No entanto, é possível adaptar essas etapas para modificar o acesso a qualquer recurso do Google Cloud compatível com a política do IAM. Para detalhes sobre como modificar o acesso a um recurso específico, consulte a documentação de referência do recurso.

Gerencie papéis de usuários com o Console do Cloud, a ferramenta de linha de comando gcloud, a API REST ou as bibliotecas de cliente. Usar o Console do Cloud é o método mais fácil e é o abordado na primeira metade deste artigo, assim como a execução de atualizações rápidas usando a ferramenta de linha de comando gcloud. A utilização de métodos programáticos para cenários mais complexos é abordada na segunda metade.

Se você quiser usar o IAM com o Identity-Aware Proxy (IAP) para proteger o acesso aos seus aplicativos, consulte a documentação do IAP.

Antes de começar

Como usar o Console do Cloud

Usar o Console do Cloud é uma maneira rápida e fácil de gerenciar papéis de usuário.

Conceder acesso

Para adicionar um membro da equipe a um projeto e conceder a ele um papel do IAM:

  1. No Console do Cloud, acesse a página IAM.

    Acessar a página do IAM

  2. Clique em Adicionar.

  3. Insira um endereço de e-mail. Adicione pessoas, contas de serviço ou Grupos do Google, mas cada projeto precisa ter pelo menos um indivíduo como membro.

  4. Selecione um papel. Os papéis dão aos membros o nível apropriado de permissão. Como prática recomendada de segurança, conceda ao membro o mínimo de privilégio necessário. Os membros com permissões no nível Proprietário também são proprietários do projeto e podem gerenciar todos os aspectos dele, inclusive desativá-lo.

  5. Clique em Salvar.

Para atribuir um papel a um membro a mais de um projeto:

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Abrir a página "Gerenciar recursos"

  2. Selecione todos os projetos para os quais você quer conceder permissões.

  3. Clique em Mostrar painel de informações, seguido da guia Permissões.

  4. Digite um endereço de e-mail no campo Novos membros e selecione a função desejada no menu suspenso.

  5. Clique em Salvar. O membro recebe o papel escolhido em cada um dos projetos selecionados.

Como revogar o acesso

  1. No Console do Cloud, acesse a página IAM.

    Acessar a página do IAM

  2. Localize o membro para quem você quer revogar o acesso e clique no botão Editar à direita.

  3. Clique no botão Excluir de cada papel a ser revogado e, em seguida, clique em Salvar.

Como modificar o acesso

Não há procedimento especial para modificar o acesso. Basta seguir as etapas para concedê-lo e revogá-lo até que o usuário tenha os papéis que você quer.

Como usar a gcloud para atualizações rápidas

É possível adicionar ou revogar um único papel usando os comandos add-iam-policy-binding e remove-iam-policy-binding da ferramenta de linha de comando gcloud.

Conceder acesso

Para conceder um papel a um membro rapidamente, execute o comando add-iam-policy-binding da ferramenta gcloud:

gcloud group add-iam-policy-binding resource \
    --member=member --role=role-id

Forneça os valores a seguir:

  • group: o grupo de ferramentas gcloud do recurso que você quer atualizar. Por exemplo, é possível usar projects ou organizations.
  • resource: o nome do recurso.
  • member: um identificador para o membro, que geralmente tem o formato member-type:id. Por exemplo, user:my-user@example.com. Para ver uma lista completa dos valores que member pode ter, consulte a referência de vinculação de políticas.

  • role-id: o nome do papel.

Por exemplo, para conceder o papel Leitor ao usuário my-user@example.com do projeto my-project:

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

Como revogar o acesso

Para revogar rapidamente o papel de um usuário, execute o comando remove-iam-policy-binding da ferramenta gcloud:

gcloud group remove-iam-policy-binding resource \
    --member=member --role=role-id

Forneça os valores a seguir:

  • group: o grupo de ferramentas gcloud do recurso que você quer atualizar. Por exemplo, é possível usar projects ou organizations.
  • resource: o nome do recurso.
  • member: um identificador para o membro, que geralmente tem o formato member-type:id. Por exemplo, user:my-user@example.com. Para ver uma lista completa dos valores que member pode ter, consulte a referência de vinculação de políticas.

  • role-id: o nome do papel.

Por exemplo, para revogar o papel Leitor do usuário my-user@example.com do projeto my-project:

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

Como controlar o acesso de maneira programática

Em alguns casos de uso, é mais fácil gerenciar o controle de acesso de maneira programática. Use a ferramenta de linha de comando gcloud, a API REST ou as bibliotecas de cliente para controlar o acesso de maneira programática. Os métodos programáticos são úteis para fazer atualizações automáticas ou em grande escala, que podem ter execução demorada no Console do Cloud, ou para executar comandos gcloud para cada membro.

Visão geral da política do IAM

O acesso a um recurso é gerenciado por meio de uma política do IAM. Uma política é um conjunto de vinculações que associam um membro, como uma conta de usuário ou conta de serviço, a um papel. As políticas são representadas com JSON ou YAML.

O exemplo a seguir mostra uma política em que fatima@example.com recebeu o papel de Proprietário e wei@example.com e service-account-13@appspot.gserviceaccount.com receberam o papel de Editor:

{
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:fatima@example.com"
      ]
    },
    {
      "role": "roles/editor",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:wei@example.com"
      ]
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

Você atualiza uma política para um recurso usando o padrão read-modify-write. Isso significa que não há métodos distintos para criar, modificar ou revogar o acesso do usuário. Em vez disso, todas as modificações são feitas por meio da:

  1. leitura da política atual chamando getIamPolicy();
  2. edição da política retornada, com um editor de texto ou de maneira programática, para adicionar ou remover qualquer membro e as concessões de papel dele;
  3. gravação da política atualizada chamando setIamPolicy().

É comum conceder permissões para um projeto ou organização inteira. No entanto, também é possível definir políticas em um nível mais granular em uma ampla gama de recursos do Google Cloud, como instâncias do Compute Engine ou buckets do Cloud Storage. Para ver o nível de recurso mais baixo em que seja possível conceder cada papel e uma lista completa desses papéis, consulte Noções básicas sobre papéis.

As seções a seguir mostram como receber, modificar e definir políticas para projetos. No entanto, é possível adaptar essas instruções para receber, modificar e definir a política de qualquer recurso que possa ter sua própria política do IAM. Para modificar a política de um recurso diferente de um projeto, localize os comandos gcloud get-iam-policy e set-iam-policy ou os métodos getIamPolicy() e setIamPolicy() da API REST do recurso. Em seguida, use esses comandos ou métodos nas seções Como conseguir a política atual e Como definir uma política desta página.

Como conseguir a política atual

Comando gcloud

Execute o comando get-iam-policy para o recurso. O exemplo a seguir mostra o comando get-iam-policy para projetos:

gcloud projects get-iam-policy project-id --format=format > filepath

Forneça os valores a seguir:

  • project-id: o projeto que você está atualizando (por exemplo, my-project).
  • format: o valor json ou yaml.
  • filepath: o caminho para um novo arquivo de saída para a política.

Por exemplo, o comando a seguir recebe a política do projeto my-project no formato JSON e a salva no diretório inicial do usuário:

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

API REST

O método projects.getIamPolicy da API Resource Manager recebe a política do IAM de um projeto.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

Método HTTP e URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:getIamPolicy

Corpo JSON da solicitação:

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

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

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

C#

Antes de testar este exemplo, siga as instruções de configuração do C# no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para 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

Antes de testar este exemplo, siga as instruções de configuração do Java no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Java.

Ver no GitHub (em inglês) Feedback
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.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

Antes de testar este exemplo, siga as instruções de configuração do Python no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Python.

Ver no GitHub (em inglês) Feedback
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

Como modificar uma política

Modifique a cópia local da política do projeto de maneira programática ou com um editor de texto a fim de refletir os papéis que você quer conceder ou revogar em relação a determinados usuários.

Como conceder um papel

Para conceder papéis aos membros, modifique as vinculações de papéis na política. Para saber quais papéis é possível conceder, consulte Noções básicas sobre papéis.

Para conceder um papel que já está incluído na política:

Comando gcloud

Conceda um papel editando a política JSON ou YAML retornada pelo comando get-iam-policy. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

O exemplo a seguir concede o papel Revisor de segurança (roles/iam.securityReviewer) a wei@example.com. Para conceder esse papel, anexe o usuário à matriz members da vinculação:

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

API REST

Conceda um papel editando a política JSON ou YAML retornada pelo comando get-iam-policy. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

O exemplo a seguir concede o papel Revisor de segurança (roles/iam.securityReviewer) a wei@example.com. Para conceder esse papel, anexe o usuário à matriz members da vinculação:

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

C#

Antes de testar este exemplo, siga as instruções de configuração do C# no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para C#.


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

Antes de testar este exemplo, siga as instruções de configuração do Java no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Java.

Ver no GitHub (em inglês) Feedback
import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.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

Antes de testar este exemplo, siga as instruções de configuração do Python no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Python.

Ver no GitHub (em inglês) Feedback
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

Para conceder um papel que ainda não está incluído na política, adicione uma nova binding.

Comando gcloud

Adicione uma nova vinculação editando a política JSON ou YAML retornada pelo comando get-iam-policy. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

O exemplo a seguir concede o papel Leitor a fatima@example.com. Para conceder esse papel, adicione uma nova vinculação à matriz bindings da política:

{
  "role": "roles/reader",
  "members": [
    "user:fatima@example.com"
  ]
}

API REST

Adicione uma nova vinculação editando a política JSON ou YAML retornada pelo comando get-iam-policy. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

O exemplo a seguir concede o papel Leitor a fatima@example.com. Para conceder esse papel, adicione uma nova vinculação à matriz bindings da política:

{
  "role": "roles/reader",
  "members": [
    "user:fatima@example.com"
  ]
}

C#

Antes de testar este exemplo, siga as instruções de configuração do C# no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para C#.


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

Antes de testar este exemplo, siga as instruções de configuração do Java no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Java.

Ver no GitHub (em inglês) Feedback
import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.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

Antes de testar este exemplo, siga as instruções de configuração do Python no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Python.

Ver no GitHub (em inglês) Feedback
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

Você só pode conceder papéis relacionados a serviços de API ativados. Se um serviço, como o Compute Engine, não estiver ativo, você não poderá atribuir papéis exclusivamente relacionados ao Compute Engine. Para mais informações, consulte Ativar e desativar APIs.

Há algumas restrições exclusivas ao conceder permissões em projetos, especialmente o papel Proprietário. Consulte a documentação de referência de projects.setIamPolicy() para mais informações.

Como revogar um papel

Para revogar um papel:

Comando gcloud

Revogue um papel editando a política JSON ou YAML retornada pelo comando get-iam-policy. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

Para revogar um papel de um membro, exclua os membros ou as vinculações da matriz bindings da política.

API REST

Revogue um papel editando a política JSON ou YAML retornada pelo comando get-iam-policy. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

Para revogar um papel de um membro, exclua os membros ou as vinculações da matriz bindings da política.

C#

Antes de testar este exemplo, siga as instruções de configuração do C# no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para C#.


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

Antes de testar este exemplo, siga as instruções de configuração do Java no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Java.

Ver no GitHub (em inglês) Feedback
import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.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

Antes de testar este exemplo, siga as instruções de configuração do Python no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Python.

Ver no GitHub (em inglês) Feedback
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

Como definir uma política

Depois de modificar a política para conceder os papéis desejados, chame setIamPolicy() para fazer as atualizações.

Comando gcloud

Use o comando set-iam-policy e forneça um caminho para o arquivo JSON que contém a política atualizada: O exemplo a seguir mostra o comando set-iam-policy para projetos:

gcloud projects set-iam-policy project-id filepath

Forneça os valores a seguir:

  • project-id: o projeto que você está atualizando (por exemplo, my-project).
  • filepath: o caminho para um arquivo que contém a nova política.

A resposta contém a política atualizada.

API REST

O método projects.setIamPolicy da API Resource Manager define a política na solicitação como a nova política do IAM do projeto.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • project-id: o ID do projeto do Google Cloud.
  • policy: uma representação JSON da política que você quer definir. Para mais informações sobre o formato de uma política, consulte a referência da política.

Método HTTP e URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:setIamPolicy

Corpo JSON da solicitação:

{
  "policy": {
    policy
  }
}

Para enviar a solicitação, expanda uma destas opções:

A resposta contém a política atualizada.


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

Antes de testar este exemplo, siga as instruções de configuração do Java no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Java.

Ver no GitHub (em inglês) Feedback
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.Policy;
import com.google.api.services.cloudresourcemanager.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

Antes de testar este exemplo, siga as instruções de configuração do Python no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Python.

Ver no GitHub (em inglês) Feedback
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

Para evitar conflitos se várias fontes tentarem atualizar a política simultaneamente, a política conterá um valor etag. Quando você chama setIamPolicy(), o IAM compara o valor etag na solicitação com o etag atual e grava a política somente se os valores corresponderem.

A seguir