Controle de acesso para organizações com o IAM

O Google Cloud oferece o gerenciamento de identidade e acesso (IAM), que permite a concessão de acesso mais granular a recursos específicos do Google Cloud e impede o acesso indesejado a outros recursos. Com o IAM, é possível adotar o princípio de segurança do menor privilégio para conceder apenas o acesso necessário aos recursos.

Por meio da definição de políticas do IAM, você pode controlar quem (usuários) tem qual acesso (funções) a quais recursos. As políticas de IAM concedem papéis específicos a um usuário, que recebe determinadas permissões.

Nesta página, explicamos os papéis do IAM disponíveis no nível da organização e como criar e gerenciar políticas do IAM para recursos da organização usando a API Resource Manager. Para uma descrição detalhada do IAM, leia a documentação do IAM. Consulte, especificamente, Como conceder, alterar e revogar acesso.

Permissões e papéis

Para controlar o acesso aos recursos, o Google Cloud exige que as contas que fazem solicitações de API tenham papéis do IAM apropriados. Os papéis do IAM incluem permissões que permitem que os usuários realizem ações específicas nos recursos do Google Cloud. Por exemplo, a permissão resourcemanager.organizations.get permite que um usuário receba detalhes sobre o recurso da organização.

Não é possível conceder permissões diretamente aos usuários. É preciso conceder papéis aos usuários, que têm uma ou mais permissões integradas a eles.

É possível conceder um ou mais papéis no mesmo recurso.

Como usar papéis predefinidos

A tabela a seguir lista os papéis que podem ser concedidos para acessar as propriedades de um recurso da organização, a descrição do que o papel faz e as permissões incluídas nele.

Papel Nome da função Descrição Permissões
roles/resourcemanager.organizationAdmin Administrador da organização

Acesso para gerenciar as políticas do IAM e ver as políticas da organização, pastas e projetos.

  • orgpolicy.constraints.list
  • orgpolicy.policies.list
  • orgpolicy.policy.get
  • resourcemanager.folders.get
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.list
  • resourcemanager.folders.setIamPolicy
  • resourcemanager.organizations.*
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list
  • resourcemanager.projects.setIamPolicy
roles/resourcemanager.organizationViewer Leitor da organização

Concede acesso para visualizar uma organização.

  • resourcemanager.organizations.get
roles/orgpolicy.policyAdmin Administrador da política da organização

Concede acesso para definir quais restrições uma organização quer aplicar à configuração de recursos do Cloud com a definição de políticas da organização.

  • orgpolicy.*
roles/browser Navegador

Acesso de leitura para navegar na hierarquia de um projeto, incluindo a pasta, a organização e a política de permissão. Este papel não inclui permissão para ver recursos no projeto.

  • resourcemanager.folders.get
  • resourcemanager.folders.list
  • resourcemanager.organizations.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list

Como criar papéis personalizados

Além dos papéis predefinidos descritos neste tópico, é possível criar papéis personalizados, que são coleções de permissões adaptadas às suas necessidades. Ao criar um papel personalizado para usar com o Resource Manager, lembre-se dos seguintes pontos:
  • as permissões list e get, como resourcemanager.projects.get/list, devem sempre ser concedidas como um par;
  • Quando seu papel personalizado inclui as permissões folders.list e folders.get, ele também precisa incluir projects.list e projects.get.
  • Saiba que a permissão setIamPolicy para recursos de organização, pasta e projeto permite que o usuário conceda todas as outras permissões. Portanto, ela precisa ser atribuída com cuidado.

Como ver o acesso atual de um recurso da organização

É possível ver quais papéis um usuário recebe para um recurso da organização ao receber a política do IAM no nível da organização. É possível ver uma política de um recurso da organização usando o Console do Google Cloud, a CLI do Google Cloud ou o método getIamPolicy().

Console

Para ver os papéis concedidos no nível da organização usando o console:

  1. Acesse a página Gerenciar recursos no console:

    Abrir a página "Gerenciar recursos"

  2. Na lista suspensa Organização, selecione o recurso da sua organização.

  3. Marque a caixa de seleção do recurso Organização.

  4. No Painel de informações ao lado direito, em Permissões, clique para expandir um papel e exiba todos os membros que têm esse papel.

gcloud

Encontre a política do IAM para o recurso da organização usando o comando get-iam-policy:

gcloud alpha organizations get-iam-policy [ORGANIZATION_ID] --format json >
[FILENAME.JSON]

O comando emite a política, que será semelhante à seguinte:

bindings:
- members:
- user:testuser1@gcp-test.com
role: roles/editor
- members:
- user:admin@gcp-test.com
role:roles/resourcemanager.organizationAdmin
- members:
- user:testuser2@gcp-test.com
role: roles/resourcemanager.projectCreator
etag": "BwU1aRxWk30="

API

O snippet de código a seguir retorna a política para o recurso da organização https://cloudresourcemanager.googleapis.com/v3/organizations/12345.

Solicitação:

POST
https://cloudresourcemanager.googleapis.com/v3/organizations/12345:getIamPolicy

Resposta:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
        "user:email1@gmail.com"
    ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
}

Python

O método getIamPolicy() permite que você receba uma política que foi definida anteriormente.

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

Como conceder acesso a um recurso da organização

Os administradores da organização podem conceder papéis do IAM aos membros da equipe para que possam acessar os recursos e as APIs de uma organização. É possível conceder papéis a um e-mail de uma Conta do Google, um grupo do Google, uma conta de serviço ou um domínio do G Suite. Use o console, a CLI do gcloud ou o método setIamPolicy() para conceder papéis.

Console

Para definir o controle de acesso no nível da organização usando o console, faça o seguinte:

  1. Acesse a página Gerenciar recursos no console:

    Abrir a página "Gerenciar recursos"

  2. Na lista suspensa Organização, selecione o recurso da sua organização.

  3. Marque a caixa de seleção do recurso Organização. Se você não tiver um recurso "Pasta", o recurso da organização não estará visível. Para continuar, veja as instruções para conceder papéis na página do IAM.

  4. Se o Painel de informações à direita estiver oculto, clique em Exibir painel de informações, no canto superior direito.

  5. No Painel de informações, localizado na guia Permissões, clique em Adicionar membro.

  6. No campo Novos membros, digite os membros da equipe que você quer adicionar. Você pode designar um e-mail da Conta do Google, um Grupo do Google, uma conta de serviço ou um domínio do G Suite.

  7. Na lista suspensa Selecionar um papel, selecione o papel que você quer conceder aos membros da equipe.

  8. Clique em Add (Adicionar).

gcloud

Para definir a política do IAM de um recurso da organização usando o comando gcloud:

  1. Consiga a política do IAM para o recurso da organização usando o comando get-iam-policy e gere a política em um arquivo JSON:

    gcloud alpha organizations get-iam-policy [ORGANIZATION_ID]
    --format json > [FILENAME.JSON]
    
  2. O conteúdo do arquivo JSON será semelhante ao seguinte:

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser2@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  3. Usando um editor de texto, abra o arquivo JSON e adicione uma nova entrada à matriz de vinculações que defina o administrador da organização. Por exemplo, para tornar anotheradmin@gcp-test.com um administrador da organização, altere o exemplo mostrado acima da seguinte maneira:

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
                "user:anotheradmin@gcp-test.com"
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser20@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  4. Atualize a política do recurso da organização executando o seguinte comando:

    gcloud alpha organizations set-iam-policy [ORGANIZATION_ID] policy.json
    

API

Solicitação:

POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:setIamPolicy
{
    "policy": {
    "version": "0",
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
        "user:email2@gmail.com",
        "user:email3@gmail.com",
        "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
    }
}

Resposta:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKJUiQ="
}

Com o método setIamPolicy(), é possível conceder papéis aos usuários anexando uma política do IAM ao recurso da organização. Essa política é um conjunto de instruções que define o acesso de cada um.

Leitura-Modificação-Gravação: um padrão comum para atualizar os metadados de um recurso, como a Política, é ler o estado atual, modificar os dados localmente e depois enviá-los para gravação. Esse padrão pode gerar conflito se dois ou mais processos independentes tentarem fazer a sequência simultaneamente. Por exemplo, vamos supor que haja dois proprietários de um projeto, e ambos estejam tentando fazer alterações conflitantes na política ao mesmo tempo. As alterações feitas por um dos proprietários do projeto podem falhar em alguns casos. Esse problema é resolvido pelo IAM com a propriedade ETag das políticas de IAM. Essa propriedade é usada para verificar se a política foi alterada desde a última solicitação. Quando você faz uma solicitação ao IAM com um valor ETag, o IAM compara o valor ETag na solicitação com o valor ETag existente associado à política. A política é gravada somente se esses valores de etag forem correspondentes.

Ao atualizar uma política, primeiro consiga a política usando getIamPolicy(), atualize a política e, em seguida, grave a política atualizada usando setIamPolicy(). Use o valor etag ao definir a política somente se a política correspondente em GetPolicyResponse contiver um valor de etag.

Python

O método setIamPolicy() permite que você anexe uma política a um recurso. O método setIamPolicy usa um SetIamPolicyRequest, que contém uma política a ser definida e o recurso ao qual a política está anexada. Ele retorna a política resultante. É recomendável seguir o padrão ler-modificar-gravar ao atualizar uma política usando setIamPolicy().

Veja um exemplo de código para definir uma política para um recurso da organização:

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()

admin_binding = next(
    (binding
        for binding in policy['bindings']
        if binding['role'] == 'roles/resourcemanager.organizationAdmin'),
        None)

# Add an empty Organization Administrator binding if not present.
if not admin_binding:
    admin_binding = {
        'role': 'roles/resourcemanager.organizationAdmin',
        'members': []
    }
policy['bindings'].append(admin_binding)

# Add the new Admin (if necessary).
new_admin = 'user:' + flags.adminEmail
if new_admin not in admin_binding['members']:
    admin_binding['members'].append(new_admin)
policy = crm.organizations().setIamPolicy(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'policy': policy
    }).execute()

print json.dumps(policy, indent=2)

Como restringir a visibilidade do projeto para usuários

Os usuários podem ver todos os projetos a que têm acesso no console e nas consultas de pesquisa, independentemente de estarem ou não no recurso da organização selecionado no momento. É possível usá-lo para restringir o conjunto de projetos retornados em consultas e no console. Isso pode ser usado para restringir os usuários que veem apenas projetos no seu domínio.

A restrição constraints/resourcemanager.accessBoundaries da política da organização é uma restrição de lista aplicada ao recurso da organização. A restrição aceita uma lista de IDs de recursos da organização, que definem o conjunto de recursos que tornam os recursos visíveis para os usuários em uma consulta ou no console.

Os projetos aparecerão em No organization se o usuário não tiver a permissão resourcemanager.organizations.get no recurso da organização pai do projeto. Isso pode fazer com que pareça que um projeto que não faz parte do recurso da sua organização não está associado a nenhum recurso. Se você usar a restrição resourcemanager.accessBoundaries para proibir um recurso da organização, os projetos que pertencem a ele não aparecerão nas consultas ou no console. Os projetos que ainda não foram migrados para um recurso da organização não ficarão visíveis se essa restrição for aplicada.

Recomendamos a migração de projetos com menos de No organization para o recurso da organização antes de aplicar essa restrição. Para informações sobre como migrar projetos para um recurso da organização, consulte Como mover um projeto.

Para informações sobre como definir uma política da organização, consulte Como usar restrições.

Teste de permissões

É possível testar as permissões do IAM em um usuário para um recurso da organização com o método testIamPermissions(). Esse método usa como parâmetros de entrada o URL do recurso e o conjunto de permissões que você quer testar e retorna o subconjunto das permissões para as quais o usuário tem acesso.

Normalmente, você não invoca testIamPermission() se estiver usando o console diretamente para gerenciar as permissões. O método testIamPermissions() se destina à integração com seu software reservado, como uma interface gráfica do usuário personalizada. Por exemplo, o console usa testIamPermissions() internamente para determinar qual IU precisa estar disponível para o usuário conectado.

API

Você pode usar o método testIamPermissions() para verificar qual das permissões ao autor tem para o recurso fornecido. Esse método usa um nome de recurso e um conjunto de permissões como parâmetros. Em seguida, retorna o conjunto de permissões concedidas para o solicitante.

Veja um exemplo de código para testar as permissões de um recurso da organização:

Request:

POST https://cloudresourcemanager.googleapis.com/v3/organization/12345:testIamPermissions

{
    "permissions":  [
        "resourcemanager.organizations.get",
        "resourcemanager.organizations.setIamPolicy"
    ]
}

Response:

{
    "permissions": [
        "resourcemanager.organizations.get"
    ]
}

Python

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))

response = crm.organizations().testIamPermissions(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'permissions': [
            'resourcemanager.organizations.setIamPolicy',
            'resourcemanager.projects.patch'
        ]
    }).execute()

print json.dumps(response, indent=2)