Controle de acesso para organizações que usam o IAM

O Google Cloud oferece o Gerenciamento de acesso e identidade do Cloud (IAM, Cloud Identity and Access Management, em inglês), que permite que você conceda acesso mais granular a recursos específicos do Google Cloud e impede o acesso indesejado a outros recursos. Com o IAM, você pode 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, é possível atribuir papéis aos usuários para que eles acessem recursos específicos. As políticas de IAM concedem papéis específicos a um usuário, dando a ele certas permissões.

Esta página explica os papéis do Cloud Identity and Access Management (IAM) disponíveis no nível da organização e como criar e gerenciar políticas do IAM para organizações que usam a API do Resource Manager. Para obter uma descrição detalhada do Cloud Identity and Access Management, leia a documentação do IAM. Consulte, especificamente, Como conceder, alterar e revogar acesso.

Permissões e papéis

Com o Cloud Identity and Access Management, todo método do Google Cloud exige que a conta que faz a solicitação de API tenha as permissões adequadas para acessar o recurso. Com elas, os usuários podem realizar ações específicas nos recursos do Google Cloud. Por exemplo, a permissão resourcemanager.organizations.list permite que um usuário liste as organizações que possui, enquanto resourcemanager.organizations.update permite que um usuário atualize os metadados de uma organização.

A tabela a seguir lista as permissões que o solicitante precisa ter para chamar um método da organização:

Método Permissões exigidas
cloudresourcemanager.organizations.get() resourcemanager.organizations.get.
cloudresourcemanager.organizations.search() Retorna todas as organizações para as quais o usuário tem a permissão resourcemanager.organizations.get.
cloudresourcemanager.organizations.getIamPolicy() resourcemanager.organizations.getIamPolicy
cloudresourcemanager.organizations.setIamPolicy() resourcemanager.organizations.setIamPolicy
cloudresourcemanager.organizations.testIamPermissions() Não requer permissões.

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 você pode conceder para acessar as propriedades de uma organização, a descrição do que o papel faz e as permissões incluídas nele.

Papel Descrição Permissões
roles/
resourcemanager.organizationAdmin
Acesso para administrar todos os recursos que pertencem à organização. Por padrão, esse papel não inclui privilégios de faturamento ou administração de papéis da organização.
  • orgpolicy.policy.get
  • resourcemanager.folders.get
  • resourcemanager.folders.getIamPolicy
  • resourcemanager.folders.list
  • resourcemanager.folders.setIamPolicy
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.organizations.update
  • resourcemanager.projectInvites.get
  • resourcemanager.projects.get
  • resourcemanager.projects.getIamPolicy
  • resourcemanager.projects.list
  • resourcemanager.projects.setIamPolicy
roles/
resourcemanager.organizationViewer
Acesso para visualizar o nome de exibição da organização. Se essa função for concedida a um usuário, ele poderá ver a organização no Console do Cloud Platform sem ter acesso para visualizar todos os recursos dela.
  • resourcemanager.organizations.get
roles/
orgpolicy.policyAdmin
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
Acesso para procurar recursos em uma organização
  • resourcemanager.folders.get
  • resourcemanager.folders.list
  • resourcemanager.organizations.get
  • resourcemanager.projectInvites.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. Eles são conjuntos de permissões que você adapta de acordo com 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, ela também deve incluir projects.list e projects.get;
  • atribua com cuidado a permissão setIamPolicy para organizações, pastas e projetos. Com ela, o usuário pode conceder todas as outras permissões.

Como visualizar o acesso existente de uma organização

Você pode ver quais papéis um usuário recebe para uma organização ao receber a política do IAM no nível da organização. É possível visualizar uma política de uma organização usando o Console do Cloud Platform, a ferramenta de linha de comando gcloud ou o método getIamPolicy().

Console

Para ver os papéis concedidos no nível da organização usando o Console do Google Cloud:

  1. Acesse a página Gerenciar recursos no Console do Cloud:

    Abrir a página "Gerenciar recursos"

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

  3. Marque a caixa de seleção referente ao 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

Obtenha a política do IAM para a 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 Organização https://cloudresourcemanager.googleapis.com/v1/organizations/12345.

Solicitação:

POST
https://cloudresourcemanager.googleapis.com/v1/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', 'v1', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

...

Concessão de acesso a uma organização

Os administradores da organização podem conceder papéis do IAM aos membros da equipe para que eles possam acessar os recursos e as APIs de uma organização. Você pode atribuir papéis a um e-mail da Conta do Google, um Grupo do Google, uma conta de serviço ou um domínio do G Suite. Você pode usar o Console do Google Cloud, a ferramenta gcloud ou o método setIamPolicy() para atribuir papéis.

Console

Para definir o controle de acesso no nível da organização usando o Console do Google Cloud:

  1. Acesse a página Gerenciar recursos no Console do Cloud:

    Abrir a página "Gerenciar recursos"

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

  3. Marque a caixa de seleção referente ao recurso "Organização". Se você não tiver um recurso Pasta, o recurso Organização não estará visível. Para continuar, veja as instruções para conceder papéis na página do Cloud 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 Adicionar.

gcloud

Para definir a política de IAM de uma organização usando o comando gcloud:

  1. Receba a política de IAM para a organização usando o comando get-iam-policy e envie a política para 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 define o Administrador da Organização. Por exemplo, para tornar anotheradmin@gcp-test.com um Administrador da organização, você alteraria 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 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/v1/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="
}

O método setIamPolicy() permite que você conceda papéis aos usuários anexando uma política do Cloud IAM à 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. O Cloud Identity and Access Management resolve esse problema usando uma propriedade etag nas políticas dele. Essa propriedade é usada para verificar se a política foi alterada desde a última solicitação. Quando você faz uma solicitação ao Cloud IAM com um valor etag, o Cloud 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().

Aqui está um exemplo de código para definir a política de uma organização:

...

crm = discovery.build(
    'cloudresourcemanager', 'v1', 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 Admin 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)

...

Teste de permissões

Você pode testar as permissões do Cloud IAM em um usuário para uma 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 do Cloud Platform diretamente para gerenciar permissões. testIamPermissions() se destina à integração com o software reservado, como uma interface gráfica personalizada do usuário. Por exemplo, o Console do Cloud Platform usa testIamPermissions() internamente para determinar qual IU deve 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.

Estes são alguns códigos de exemplo para testar as permissões de uma organização:

Request:

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

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

Response:

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

Python

...

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

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

print json.dumps(response, indent=2)

...