Gerenciar o acesso a projetos, pastas e organizações

Nesta página, descrevemos como conceder, alterar e revogar acesso a projetos, pastas e organizações. Para saber como gerenciar o acesso a outros recursos, consulte estes seguintes guias:

No gerenciamento de identidade e acesso, o acesso é gerenciado usando as políticas de IAM. Uma política de IAM é anexada a um recurso do Google Cloud. Cada política contém uma coleção de vinculações de papéis que associam um ou mais principais, como usuários ou contas de serviço, a um papel do IAM. Essas vinculações de papéis concedem os papéis especificados aos principais no recurso ao qual a política está anexada e em todos os descendentes desse recurso. Para mais informações sobre políticas de IAM, consulte Noções básicas sobre políticas.

É possível gerenciar o acesso a projetos, pastas e organizações com o Console do Google Cloud, a ferramenta de linha de comando gcloud, a API REST ou as bibliotecas de cliente do Resource Manager.

Antes de começar

Ative a Cloud Resource Manager API.

Ative a API

Permissões necessárias

Para gerenciar o acesso a um projeto, pasta ou organização, você precisa de um papel que inclua as seguintes permissões, em que RESOURCE_TYPE é o tipo de recurso ao qual o principal gerenciará o acesso (projects, folders ou organizations):

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

Para ter essas permissões seguindo o princípio do privilégio mínimo, peça ao administrador para conceder a você um dos seguintes papéis:

  • Para gerenciar o acesso a projetos: administrador de IAM do projeto (roles/resourcemanager.projectIamAdmin)
  • Para gerenciar o acesso a projetos e pastas: administrador de pastas (roles/resourcemanager.folderAdmin)
  • Para gerenciar o acesso a projetos, pastas e organizações: administrador da organização (roles/resourcemanager.organizationAdmin)
  • Para gerenciar o acesso a quase todos os recursos do Google Cloud: administrador de segurança (roles/iam.securityAdmin)

Como alternativa, o administrador pode conceder a você um papel diferente que inclua as permissões necessárias, como um papel personalizado ou um papel predefinido mais permissivo.

Ver acesso atual

É possível ver quem tem acesso ao projeto, pasta ou organização usando o Console do Cloud, a ferramenta gcloud, a API REST ou as bibliotecas de cliente do Resource Manager.

Console

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

    Acesse IAM

  2. Selecione um projeto, pasta ou organização.

    O Console do Cloud lista todos os principais que receberam papéis no projeto, na pasta ou na organização. Essa lista inclui principais que herdaram papéis no recurso de recursos pai. Para mais informações sobre a herança de políticas, consulte Herança de política e hierarquia de recursos.

  3. Opcional: para visualizar concessões de papel para contas de serviço gerenciadas pelo Google, marque a caixa de seleção Incluir concessões de papel fornecidas pelo Google.

gcloud

Para ver quem tem acesso ao projeto, à pasta ou à organização, consiga a política de IAM para o recurso. Para saber como interpretar políticas do IAM, consulte Noções básicas sobre políticas.

Para conseguir a política de IAM do recurso, execute o comando get-iam-policy para o recurso:

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

Forneça os valores a seguir:

  • RESOURCE_TYPE: o tipo de recurso ao qual você quer ver o acesso. Use um destes valores: projects, resource-manager folders ou organizations.
  • RESOURCE_ID: o projeto, a pasta ou o ID da organização do Google Cloud. Os IDs de projeto são alfanuméricos, como my-project. Os IDs de pastas e organizações são numéricos, como 123456789012.
  • FORMAT: o formato desejado para a política. Use json ou yaml.
  • PATH: 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 e a salva no diretório inicial em formato JSON:

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

REST

Para ver quem tem acesso ao projeto, à pasta ou à organização, consiga a política de IAM para o recurso. Para saber como interpretar políticas do IAM, consulte Noções básicas sobre políticas.

O método getIamPolicy da API Resource Manager recebe a política de IAM de um projeto, uma pasta ou uma organização.

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

  • API_VERSION: a versão da API a ser usada. Para projetos e organizações, use v1. Para pastas, use v2.
  • RESOURCE_TYPE: o tipo de recurso com a política que você quer gerenciar. Use o valor projects, folders ou organizations.
  • RESOURCE_ID: seu projeto do Google Cloud, a organização ou o ID da pasta. Os IDs do projeto são strings alfanuméricas, como my-project. Os códigos de pastas e organizações são numéricos, como 123456789012.
  • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

Método HTTP e URL:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

Corpo JSON da solicitação:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

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

A resposta contém a política de IAM do projeto. Exemplo:

{
  "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

Conceder ou revogar um único papel

Use o Console do Cloud e a ferramenta gcloud para conceder ou revogar rapidamente um único papel a um único principal, sem editar a política de IAM do recurso diretamente. Os tipos comuns de principais incluem contas do Google, contas de serviço, grupos do Google e domínios. Para ver a lista de tipos de principais, consulte Conceitos relacionados à identidade.

Conceder um único papel

Para conceder um único papel a um principal, faça o seguinte:

Console

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

    Acesse IAM

  2. Selecione um projeto, pasta ou organização.

  3. Selecione um principal para conceder um papel:

    • Para conceder um papel a um principal que já tem outros papéis no recurso, encontre a linha que contém o endereço de e-mail dele, clique em Editar principal nessa linha e clique em Adicionar outro papel.

      Para conceder um papel a uma conta de serviço gerenciada pelo Google, marque a caixa de seleção Incluir concessões de papel fornecidas pelo Google para ver o endereço de e-mail dela.

    • Para conceder um papel a um principal que ainda não tem outros papéis no recurso, clique em Adicionar e digite o endereço de e-mail do principal.

  4. Na lista suspensa, selecione um papel a ser concedido. Como prática recomendada de segurança, escolha um papel que inclua apenas as permissões necessárias ao principal.

  5. Opcional: adicione uma condição ao papel.

  6. Clique em Save. O principal recebe o papel no recurso.

Para conceder um papel a um principal a mais de um projeto, pasta ou organização, faça o seguinte:

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

    Acesse "Gerenciar recursos"

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

  3. Se o painel de informações não estiver visível, clique em Mostrar painel de informações. Em seguida, clique em Permissões.

  4. Selecione um principal para conceder um papel:

    • Para conceder um papel a um principal que já tenha outros papéis, encontre uma linha com o endereço de e-mail do principal, clique em Editar principal e clique em Adicionar outro papel.

    • Para conceder um papel a um principal que ainda não tem outros papéis, clique em Adicionar principal e insira o endereço de e-mail dele.

  5. Na lista suspensa, selecione um papel a ser concedido.

  6. Opcional: adicione uma condição ao papel.

  7. Clique em Save. O principal recebe o papel selecionado em cada um dos recursos selecionados.

gcloud

Para conceder um papel a um principal de maneira rápida, execute o comando add-iam-policy-binding:

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

Forneça os valores a seguir:

  • RESOURCE_TYPE: o tipo de recurso ao qual você quer gerenciar o acesso. Use projects, resource-manager folders ou organizations.
  • RESOURCE_ID: o projeto, a pasta ou o ID da organização do Google Cloud. Os IDs de projeto são alfanuméricos, como my-project. Os códigos de pastas e organizações são numéricos, como 123456789012.
  • PRINCIPAL: um identificador para o principal ou membro, que geralmente tem o seguinte formato: PRINCIPAL_TYPE:ID. Por exemplo, user:my-user@example.com. Para ver uma lista completa dos valores que PRINCIPAL pode ter, consulte a referência de vinculação de políticas.

    Para o tipo de principal user, o nome de domínio no identificador precisa ser do Google Workspace ou do Cloud Identity. Para saber como configurar um domínio do Cloud Identity, consulte a Visão geral do Cloud Identity.

  • ROLE_ID: o nome do papel que você quer conceder. Por exemplo, roles/resourcemanager.projectCreator. Para ver uma lista de papéis, consulte Noções básicas sobre papéis.

  • CONDITION: opcional. A condição a ser adicionada à vinculação de papel. Para mais informações sobre as condições, consulte a visão geral das condições.

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

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

Revogar um único papel

Para revogar um único papel de um principal, faça o seguinte:

Console

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

    Acessar IAM

  2. Selecione um projeto, pasta ou organização.

  3. Encontre a linha com o endereço de e-mail do principal que tem o acesso que você quer revogar. Em seguida, clique em Editar principal nessa linha.

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

gcloud

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

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

Forneça os valores a seguir:

  • RESOURCE_TYPE: o tipo de recurso ao qual você quer gerenciar o acesso. Use projects, resource-manager folders ou organizations.
  • RESOURCE_ID: o projeto, a pasta ou o ID da organização do Google Cloud. Os IDs de projeto são alfanuméricos, como my-project. Os códigos de pastas e organizações são numéricos, como 123456789012.
  • PRINCIPAL: um identificador para o principal ou membro, que geralmente tem o seguinte formato: PRINCIPAL_TYPE:ID. Por exemplo, user:my-user@example.com. Para ver uma lista completa dos valores que PRINCIPAL pode ter, consulte a referência de vinculação de políticas.

    Para o tipo de principal user, o nome de domínio no identificador precisa ser do Google Workspace ou do Cloud Identity. Para saber como configurar um domínio do Cloud Identity, consulte a Visão geral do Cloud Identity.

  • ROLE_ID: o nome do papel que você quer revogar. Por exemplo, roles/resourcemanager.projectCreator. Para ver uma lista de papéis, consulte Noções básicas sobre papéis.

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

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

Conceder ou revogar vários papéis

Para fazer alterações de acesso em grande escala que envolvem a concessão e revogação de vários papéis, use o padrão read-modify-write para atualizar a política de IAM do recurso:

  1. leitura da política atual chamando getIamPolicy();
  2. edição da política retornada usando um editor de texto ou de forma programática, para adicionar ou remover qualquer principal ou vinculação de papel;
  3. gravação da política atualizada chamando setIamPolicy().

Use a ferramenta gcloud, a API REST ou as bibliotecas de cliente do Resource Manager para atualizar a política.

Conseguir a política atual

gcloud

Para conseguir a política de IAM do recurso, execute o comando get-iam-policy para o recurso:

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

Forneça os valores a seguir:

  • RESOURCE_TYPE: o tipo de recurso para o qual você quer conseguir a política. Use um dos seguintes valores: projects, resource-manager folders ou organizations.
  • RESOURCE_ID: o projeto, a pasta ou o ID da organização do Google Cloud. Os IDs de projeto são alfanuméricos, como my-project. Os IDs de pastas e organizações são numéricos, como 123456789012.
  • FORMAT: o formato desejado para a política. Use json ou yaml.
  • PATH: 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 e a salva no diretório inicial em formato JSON:

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

REST

O método getIamPolicy da API Resource Manager recebe a política de IAM de um projeto, uma pasta ou uma organização.

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

  • API_VERSION: a versão da API a ser usada. Para projetos e organizações, use v1. Para pastas, use v2.
  • RESOURCE_TYPE: o tipo de recurso com a política que você quer gerenciar. Use o valor projects, folders ou organizations.
  • RESOURCE_ID: seu projeto do Google Cloud, a organização ou o ID da pasta. Os IDs do projeto são strings alfanuméricas, como my-project. Os códigos de pastas e organizações são numéricos, como 123456789012.
  • POLICY_VERSION: a versão da política a ser retornada. As solicitações precisam especificar a versão mais recente da política, que é a versão 3 da política. Para saber mais detalhes, consulte Como especificar uma versão da política ao receber uma política.

Método HTTP e URL:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

Corpo JSON da solicitação:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

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

A resposta contém a política de IAM do projeto. Exemplo:

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

Salve a resposta em um arquivo do tipo apropriado (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

Modificar a política

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

Para garantir que você não substitua outras alterações de política, não edite ou remova o campo etag da política. O campo etag identifica o estado atual da política. Quando você define a política atualizada, o IAM compara o valor etag na solicitação com o etag atual e grava a política somente se os valores corresponderem.

Conceder um papel

Para conceder papéis aos principais, 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 ou Ver papéis atribuíveis para o recurso.

Para conceder um papel que já está incluído na política, adicione o principal a uma vinculação de papel:

gcloud

Edite a política retornada adicionando o principal a uma vinculação de papel existente. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

Por exemplo, imagine que a política retornada contenha a seguinte vinculação de papel, que concede o papel Avaliador de segurança (roles/iam.securityReviewer) a kai@example.com:

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

Para conceder esse mesmo papel a raha@example.com, adicione raha@example.com à vinculação de papel existente:

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

REST

Edite a política retornada adicionando o principal a uma vinculação de papel existente. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

Por exemplo, imagine que a política retornada contenha a seguinte vinculação de papel, que concede o papel Avaliador de segurança (roles/iam.securityReviewer) a kai@example.com:

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

Para conceder esse mesmo papel a raha@example.com, adicione raha@example.com à vinculação de papel existente:

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

C#

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

Para conceder um papel que ainda não está incluído na política, adicione uma nova vinculação de papel:

gcloud

Edite a política retornada adicionando uma nova vinculação de papel que conceda o papel ao principal. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

Por exemplo, para conceder o papel de Administrador do Compute Storage (roles/compute.storageAdmin) a raha@example.com, adicione a seguinte vinculação de papel à matriz bindings da política:

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

REST

Edite a política retornada adicionando uma nova vinculação de papel que conceda o papel ao principal. Essa alteração de política só entrará em vigor quando você definir a política atualizada.

Por exemplo, para conceder o papel de Administrador do Compute Storage (roles/compute.storageAdmin) a raha@example.com, adicione a seguinte vinculação de papel à matriz bindings da política:

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

C#

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

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 (roles/owner) Proprietário. Consulte a documentação de referência de projects.setIamPolicy() para mais informações.

Revogar um papel

Para revogar um papel, remova o principal da vinculação de papel. Se não houver outros principais na vinculação de papel, remova a vinculação inteira.

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 principal, exclua os principais ou as vinculações da matriz bindings da política.

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 principal, exclua os principais ou as vinculações da matriz bindings da política.

C#

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do 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

Definir a política

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

gcloud

Para definir a política de IAM para o recurso, execute o comando set-iam-policy para o recurso:

gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

Forneça os valores a seguir:

  • RESOURCE_TYPE: o tipo de recurso para o qual você quer definir a política. Use um dos seguintes valores: projects, resource-manager folders ou organizations.
  • RESOURCE_ID: o projeto, a pasta ou o ID da organização do Google Cloud. Os IDs de projeto são alfanuméricos, como my-project. Os IDs de pastas e organizações são numéricos, como 123456789012.
  • PATH: o caminho para um arquivo que contém a nova política.

A resposta contém a política atualizada.

Por exemplo, o comando a seguir define a política armazenada em policy.json como a política do projeto my-project:

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

REST

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

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

  • API_VERSION: a versão da API a ser usada. Para projetos e organizações, use v1. Para pastas, use v2.
  • RESOURCE_TYPE: o tipo de recurso com a política que você quer gerenciar. Use o valor projects, folders ou organizations.
  • RESOURCE_ID: seu projeto do Google Cloud, a organização ou o ID da pasta. Os IDs do projeto são strings alfanuméricas, como my-project. Os códigos de pastas e organizações são numéricos, como 123456789012.
  • 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.

    Por exemplo, para definir a política mostrada na etapa anterior, substitua POLICY pelo seguinte:

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

Método HTTP e URL:

POST https://iam.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_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

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

A seguir

Faça um teste

Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também ganham US$ 300 em créditos para executar, testar e implantar cargas de trabalho.

Comece gratuitamente