Controle de acesso para recursos da organização com o IAM

OGoogle 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 de privilégio mínimo 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 permissão 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 recurso de organização e como criar e gerenciar políticas de permissão para recursos de organização usando a API Resource Manager. Para mais informações, consulte Gerenciar o acesso a projetos, pastas e organizações.

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 doGoogle Cloud . Por exemplo, a permissão resourcemanager.organizations.get permite que um usuário receba detalhes sobre o recurso da organização dele.

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.

Usar papéis predefinidos

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

Papel Permissões

(roles/resourcemanager.organizationAdmin)

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

Recursos de nível mais baixo em que você pode conceder esse papel:

  • Projeto

essentialcontacts.*

  • essentialcontacts.contacts.create
  • essentialcontacts.contacts.delete
  • essentialcontacts.contacts.get
  • essentialcontacts.contacts.list
  • essentialcontacts.contacts.send
  • essentialcontacts.contacts.update

iam.policybindings.*

  • iam.policybindings.get
  • iam.policybindings.list

orgpolicy.constraints.list

orgpolicy.policies.list

orgpolicy.policy.get

resourcemanager.capabilities.*

  • resourcemanager.capabilities.get
  • resourcemanager.capabilities.update

resourcemanager.folders.createPolicyBinding

resourcemanager.folders.deletePolicyBinding

resourcemanager.folders.get

resourcemanager.folders.getIamPolicy

resourcemanager.folders.list

resourcemanager.folders.searchPolicyBindings

resourcemanager.folders.setIamPolicy

resourcemanager.folders.updatePolicyBinding

resourcemanager.organizations.*

  • resourcemanager.organizations.createPolicyBinding
  • resourcemanager.organizations.deletePolicyBinding
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.searchPolicyBindings
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.organizations.updatePolicyBinding

resourcemanager.projects.createPolicyBinding

resourcemanager.projects.deletePolicyBinding

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

resourcemanager.projects.searchPolicyBindings

resourcemanager.projects.setIamPolicy

resourcemanager.projects.updatePolicyBinding

(roles/resourcemanager.organizationViewer)

Concede acesso para visualizar uma organização.

Recursos de nível mais baixo em que você pode conceder esse papel:

  • Organização

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.

Recursos de nível mais baixo em que você pode conceder esse papel:

  • Organização

cloudasset.assets.analyzeOrgPolicy

cloudasset.assets.exportResource

cloudasset.assets.listResource

cloudasset.assets.searchAllResources

orgpolicy.*

  • orgpolicy.constraints.list
  • orgpolicy.customConstraints.create
  • orgpolicy.customConstraints.delete
  • orgpolicy.customConstraints.get
  • orgpolicy.customConstraints.list
  • orgpolicy.customConstraints.update
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

policysimulator.orgPolicyViolations.list

policysimulator.orgPolicyViolationsPreviews.*

  • policysimulator.orgPolicyViolationsPreviews.create
  • policysimulator.orgPolicyViolationsPreviews.get
  • policysimulator.orgPolicyViolationsPreviews.list

recommender.orgPolicyInsights.*

  • recommender.orgPolicyInsights.get
  • recommender.orgPolicyInsights.list
  • recommender.orgPolicyInsights.update

recommender.orgPolicyRecommendations.*

  • recommender.orgPolicyRecommendations.get
  • recommender.orgPolicyRecommendations.list
  • recommender.orgPolicyRecommendations.update

(roles/browser)

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.

Recursos de nível mais baixo em que você pode conceder esse papel:

  • 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. Eles são conjuntos de permissões que você adapta de acordo com suas necessidades. Ao criar uma função personalizada 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 sua função personalizada inclui as permissões folders.list e folders.get, ela também deve incluir projects.list e projects.get;
  • Esteja ciente de que a permissão setIamPolicy para recursos de organização, pasta e projeto permite que o usuário conceda todas as outras permissões e, portanto, deve ser atribuída com cuidado.

Ver o acesso existente para um recurso da organização

Você pode ver quais papéis um usuário recebe para um recurso da organização ao receber a política de permissão desse recurso. É possível conferir a política de permissão de um recurso de organização usando o console Google Cloud , a Google Cloud CLI ou o método getIamPolicy().

Console

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

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

    Abrir a página "Gerenciar recursos"

  2. No menu suspenso Organização, selecione o recurso da sua organização.

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

  4. No Painel de informações, em Permissões, clique em Expandir um papel e mostre todos os membros que têm essa função.

gcloud

Consiga a política de permissão do recurso da organização usando o comando get-iam-policy:

gcloud alpha organizations get-iam-policy <var>ORGANIZATION_ID</var> --format json >
<var>FILENAME.JSON</var>

O comando emite a política de permissão, que é semelhante a esta:

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 de permissão para o recurso de 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 receber uma política de permissão 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)

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 eles possam acessar os recursos e as APIs de uma organização. É possível atribuir papéis a um e-mail da conta de usuário, um Grupo do Google, uma conta de serviço ou um domínio do G Suite. É possível usar o console do Google Cloud , a CLI gcloud ou o método setIamPolicy() para conceder papéis.

Console

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

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

    Abrir a página "Gerenciar recursos"

  2. No menu suspenso Organização, selecione o recurso da sua organização.

  3. Marque a caixa de seleção do recurso de organização. Se você não tiver um recurso de pasta, o recurso de organização não vai aparecer. 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 Mostrar 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 especificar um e-mail de conta de usuário, um Grupo do Google, uma conta de serviço ou um domínio do G Suite.

  7. No menu suspenso Selecionar um papel, escolha o papel que você quer conceder aos membros da equipe.

  8. Clique em Adicionar.

gcloud

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

  1. Receba a política de permissão para o recurso da organização usando o comando get-iam-policy e envie a política para um arquivo JSON:

    gcloud alpha organizations get-iam-policy <var>ORGANIZATION_ID</var>
    --format json > <var>FILENAME.JSON</var>
    
  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="
}
  1. Abra o arquivo JSON em um editor de texto. Em seguida, adicione uma nova entrada à matriz bindings para definir um administrador da organização. Por exemplo, para tornar anotheradmin@gcp-test.com um administrador da organização, mude o exemplo anterior 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="
}
  1. Atualize a política de permissão do recurso da organização executando o seguinte comando:
gcloud alpha organizations set-iam-policy <var>ORGANIZATION_ID</var> 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="
}

O método setIamPolicy() permite que você conceda papéis aos usuários anexando uma política de permissão ao recurso da organização. A política de permissão é um conjunto de vinculações que definem .

Leitura-Modificação-Gravação: um padrão comum para atualizar os metadados de um recurso, como a política de permissão, envolve ler o estado atual, atualizar os dados localmente e enviar os dados modificados para gravação. Esse padrão pode resultar em um conflito se dois ou mais processos independentes tentarem executar a sequência simultaneamente. Por exemplo, se dois proprietários de um projeto tentarem fazer mudanças conflitantes na política de permissão simultaneamente, as mudanças de um deles poderão falhar. O IAM resolve esse problema usando uma propriedade etag nas políticas de permissão. Essa propriedade verifica se a política de permissão foi alterada desde a última solicitação. Quando você faz uma solicitação com um valor etag, o sistema compara o valor etag na solicitação com o valor etag atual associado à política. A política de permissão só é gravada se os valores de etag forem correspondentes.

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

Python

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

Confira um exemplo de código para definir uma política de permissão para um recurso de 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)

Restringir a visibilidade do projeto para usuários

Os usuários podem ver todos os projetos a que têm acesso no console do Google Cloud e nas consultas de pesquisa, independentemente de estarem ou não no recurso de organização selecionado. É possível usar o serviço de políticas da organização para restringir o conjunto de projetos retornados em consultas e no console Google Cloud . Isso permite restringir os usuários para que eles vejam 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 da organização que tornam os recursos visíveis para os usuários em uma consulta ou no console Google Cloud .

Os projetos aparecem 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 um projeto que não faz parte do recurso da sua organização pareça não estar associado a nenhum recurso de organização. Se você usar a restrição resourcemanager.accessBoundaries para proibir um recurso de organização, os projetos que pertencem a ele não vão aparecer nas consultas ou no console Google Cloud . Os projetos que ainda não foram migrados para um recurso de organização não ficam visíveis se você aplicar essa restrição.

Recomendamos migrar os projetos que estão abaixo de No organization para o recurso da sua organização antes de aplicar essa restrição. Para informações sobre como mover 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.

Conceder acesso condicional

Alguns papéis do IAM, como Administrador de políticas da organização (roles/orgpolicy.policyAdmin), só podem ser concedidos em um recurso da organização. Devido à herança de políticas, todos os recursos da organização normalmente herdam esse papel.

Para ter mais controle sobre os recursos em que o papel é concedido, use as condições do IAM. Usar tags com condições permite conceder acesso a recursos somente se eles tiverem a tag especificada. Por exemplo, a política de permissão a seguir concede a função de administrador da política da organização apenas em recursos que têm a tag environment: dev, e não em nenhum outro recurso:

{
  "bindings": [
    {
      "members": [
        "{dynamic print variables.examples.principal_group_api}"
      ],
      "role": "roles/orgpolicy.policyAdmin",
      "condition": {
          "title": "Dev_environment_only",
          "description": "Only granted in the development environment",
          "expression":
            "resource.matchTag('123456789012/env', 'dev')"
      }
    }
  ],
  "etag": "BwWKmjvelug=",
  "version": 3
}

Como testar 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 o URL do recurso e o conjunto de permissões a serem testadas. Ele retorna o subconjunto dessas permissões a que o usuário pode acessar.

Normalmente, você não invoca testIamPermissions() se estiver usando o consoleGoogle Cloud diretamente para gerenciar permissões. A testIamPermissions() se destina à integração com o software reservado, como uma interface gráfica personalizada do usuário. Por exemplo, o console Google Cloud usa testIamPermissions() internamente para determinar qual UI está 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.

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

Request:

POST https://cloudresourcemanager.googleapis.com/v3/organizations/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)