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

Google Cloud oferece a gestão de identidade e de acesso (IAM), que lhe permite conceder acesso mais detalhado a recursos Google Cloud específicos e evitar o acesso indesejado a outros recursos. O IAM permite-lhe adotar o princípio de segurança do menor privilégio, pelo que concede apenas o acesso necessário aos seus recursos.

O IAM permite-lhe controlar quem (utilizadores) tem que acesso (funções) a que recursos definindo políticas de autorização. As políticas de permissão concedem funções específicas a um utilizador, o que lhe dá determinadas autorizações.

Esta página explica as funções do IAM disponíveis no recurso de organização e como criar e gerir políticas de autorização para recursos de organização através da API Cloud Resource Manager. Para mais informações, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Autorizações e funções

Para controlar o acesso aos recursos, Google Cloud é necessário que as contas que fazem pedidos de API tenham funções de IAM adequadas. As funções do IAM incluem autorizações que permitem aos utilizadores realizar ações específicas emGoogle Cloud recursos. Por exemplo, a autorização resourcemanager.organizations.get permite que um utilizador obtenha detalhes sobre o recurso da respetiva organização.

Não concede autorizações diretamente aos utilizadores. Em vez disso, concede-lhes funções, que têm uma ou mais autorizações incluídas.

Pode conceder uma ou mais funções no mesmo recurso.

Usar funções predefinidas

A tabela seguinte lista as funções que pode conceder para aceder às propriedades de um recurso de organização, a descrição do que a função faz e as autorizações incluídas nessa função.

Função Autorizações

(roles/resourcemanager.organizationAdmin)

Acesso para gerir políticas IAM e ver políticas de organização para organizações, pastas e projetos.

Recursos de nível mais baixo onde pode conceder esta função:

  • 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)

Fornece acesso para ver uma organização.

Recursos de nível mais baixo onde pode conceder esta função:

  • Organização

resourcemanager.organizations.get

(roles/orgpolicy.policyAdmin)

Fornece acesso para definir as restrições que uma organização quer aplicar à configuração de recursos da nuvem através da definição de políticas organizacionais.

Recursos de nível mais baixo onde pode conceder esta função:

  • 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 procurar a hierarquia de um projeto, incluindo a pasta, a organização e a política de permissão. Esta função não inclui autorização para ver recursos no projeto.

Recursos de nível mais baixo onde pode conceder esta função:

  • Projeto

resourcemanager.folders.get

resourcemanager.folders.list

resourcemanager.organizations.get

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

Criar funções personalizadas

Além das funções predefinidas descritas neste tópico, também pode criar funções personalizadas que são conjuntos de permissões que personaliza de acordo com as suas necessidades. Ao criar uma função personalizada para utilização com o Resource Manager, tenha em atenção os seguintes pontos:
  • As autorizações de listagem e obtenção, como resourcemanager.projects.get/list, devem ser sempre concedidas em conjunto.
  • Quando a sua função personalizada inclui as autorizações folders.list e folders.get, também deve incluir projects.list e projects.get.
  • Tenha em atenção que a autorização setIamPolicy para recursos de organização, pasta e projeto permite ao utilizador conceder todas as outras autorizações e, por isso, deve ser atribuída com cuidado.

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

Pode ver as funções concedidas a um utilizador para um recurso de organização obtendo a política de autorização desse recurso. Pode ver a política de autorização de um recurso de organização através da Google Cloud consola, da Google Cloud CLI ou do método getIamPolicy().

Consola

Para ver as funções concedidas ao nível do recurso da organização através da Google Cloud consola:

  1. Aceda à página Gerir recursos na Google Cloud consola:

    Abra a página Gerir recursos

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

  3. Selecione a caixa de verificação do recurso da organização.

  4. No painel de informações do lado direito, em Autorizações, clique para expandir uma função e apresentar todos os membros que têm essa função.

gcloud

Obtenha a política de permissão para o recurso da organização através do comando get-iam-policy:

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

O comando produz a política de permissão, que é 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 seguinte fragmento do código devolve a política de permissão para o recurso organization https://cloudresourcemanager.googleapis.com/v3/organizations/12345.

Pedido:

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-lhe obter uma política de autorização 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 funções da IAM aos membros da equipa para que possam aceder aos recursos e às APIs de uma organização. Pode conceder funções a um email de conta de utilizador, a um grupo Google, a uma conta de serviço ou a um domínio do G Suite. Pode usar a Google Cloud consola, a CLI gcloud ou o método setIamPolicy() para conceder funções.

Consola

Para definir o controlo de acesso ao nível do recurso da organização através da Google Cloud consola:

  1. Aceda à página Gerir recursos na Google Cloud consola:

    Abra a página Gerir recursos

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

  3. Selecione a caixa de verificação do recurso da organização. Se não tiver um recurso de pasta, o recurso de organização não fica visível. Para continuar, consulte as instruções para conceder funções através da página IAM.

  4. Se o painel Painel de informações do lado direito estiver oculto, clique em Mostrar painel de informações no canto superior direito.

  5. No painel Painel de informações, no separador Autorizações, clique em Adicionar membro.

  6. No campo Novos membros, introduza os membros da equipa que quer adicionar. Pode designar um email de conta de utilizador, um grupo Google, uma conta de serviço ou um domínio do G Suite.

  7. Na lista pendente Selecionar uma função, selecione a função que quer conceder aos membros da equipa.

  8. Clique em Adicionar.

gcloud

Para definir uma política de permissão de um recurso da organização através do comando gcloud:

  1. Obtenha a política de permissão para o recurso da organização através do comando get-iam-policy e envie a política para um ficheiro JSON:

    gcloud alpha organizations get-iam-policy [ORGANIZATION_ID]
    --format json > [FILENAME.JSON]
    
  2. O conteúdo do ficheiro JSON é 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. Com um editor de texto, abra o ficheiro JSON e adicione uma nova entrada à matriz de associações que define o administrador da organização. Por exemplo, para tornar anotheradmin@gcp-test.com um administrador da organização, alteraria o exemplo anterior da seguinte forma:
{
    "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 [ORGANIZATION_ID] policy.json

API

Pedido:

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-lhe conceder funções aos utilizadores anexando uma política de autorização ao recurso da organização. A política de permissão é uma coleção de associações que definem .

Leitura-modificação-escrita: um padrão comum para atualizar os metadados de um recurso, como a política de autorização, consiste em ler o respetivo estado atual, atualizar os dados localmente e, em seguida, enviar os dados modificados para escrita. Este padrão pode resultar num conflito se dois ou mais processos independentes tentarem a sequência em simultâneo. Por exemplo, suponhamos que existem dois proprietários para um projeto e que ambos estão a tentar fazer alterações conflituosas à política de permissão ao mesmo tempo. As alterações feitas por um dos proprietários do projeto podem falhar em alguns casos. O IAM resolve este problema através de uma propriedade etag nas políticas de autorização. Esta propriedade é usada para verificar se a política de permissão foi alterada desde o último pedido. Quando faz um pedido com um valor etag, o valor etag no pedido é comparado com o valor etag existente associado à política. Escreve a política de permissão apenas se os valores etag corresponderem.

Quando atualiza uma política de autorização, primeiro, obtém a política de autorização através de getIamPolicy(), atualiza-a e, em seguida, escreve a política de autorização atualizada através de setIamPolicy(). Use o valor etag ao definir a política de permissão apenas se a política de permissão correspondente em GetPolicyResponse contiver um valor etag.

Python

O método setIamPolicy() permite-lhe anexar uma política de autorização a um recurso. O método setIamPolicy usa um SetIamPolicyRequest, que contém uma política de autorização a ser definida e o recurso ao qual a política de autorização está anexada. Devolve a política de autorização resultante. Recomendamos que siga o padrão read-modify-write quando atualizar uma política de permissão através da API setIamPolicy().

Segue-se 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 os utilizadores

Os utilizadores podem ver todos os projetos aos quais têm acesso na Google Cloud consola e nas consultas de pesquisa, independentemente de estarem ou não no recurso de organização selecionado pelo utilizador. Pode usar o serviço de políticas de organização para restringir o conjunto de projetos devolvidos em consultas e na Google Cloud consola. Isto pode ser usado para restringir os utilizadores a verem apenas projetos no seu próprio domínio.

A restrição da política da organização constraints/resourcemanager.accessBoundaries é uma restrição de lista que é aplicada ao recurso da sua 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 respetivos recursos visíveis para os utilizadores numa consulta ou na Google Cloud consola.

Os projetos aparecem em No organization se o utilizador não tiver a autorização resourcemanager.organizations.get no recurso da organização principal do projeto. Isto pode dar a impressão de que um projeto que não faz parte do recurso da sua organização não está associado a nenhum recurso da organização. Se usar a restrição resourcemanager.accessBoundaries para não permitir um recurso de organização, os projetos pertencentes a esse recurso de organização não aparecem nas consultas nem na Google Cloud consola. Qualquer projeto que ainda não tenha sido migrado para um recurso de organização não é visível se esta restrição for aplicada.

Recomendamos que migre os projetos que estão em No organization para o recurso da sua organização antes de aplicar esta restrição. Para ver informações sobre a migração de projetos para um recurso de organização, consulte o artigo Mover um projeto.

Para ver informações sobre a definição de uma política de organização, consulte o artigo Usar restrições.

Conceder acesso condicional

Determinadas funções de IAM, como administrador da política da organização (roles/orgpolicy.policyAdmin), só podem ser concedidas num recurso de organização. Devido à herança de políticas, esta função é normalmente herdada por todos os recursos na organização.

Para ter mais controlo sobre os recursos nos quais a função é concedida, pode usar as condições do IAM. A utilização de etiquetas com condições permite-lhe conceder acesso a recursos apenas se estes tiverem a etiqueta especificada. Por exemplo, a seguinte política de autorização concede a função de administrador da política da organização apenas em recursos que tenham a etiqueta environment: dev e não a concede em nenhum outro recurso:

{
  "bindings": [
    {
      "members": [
        "group:my-group@example.com"
      ],
      "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
}

A testar autorizações

Pode testar as autorizações de IAM num utilizador para um recurso de organização com o método testIamPermissions(). Este método usa o URL do recurso e o conjunto de autorizações que quer testar como parâmetros de entrada e devolve o subconjunto destas autorizações às quais o utilizador tem acesso.

Normalmente, não invoca testIamPermission() se estiver a usar a Google Cloud consola diretamente para gerir autorizações. testIamPermissions() destina-se à integração com o seu software proprietário, como uma interface do utilizador gráfica personalizada. Por exemplo, a Google Cloud consola usa testIamPermissions() internamente para determinar que IU deve estar disponível para o utilizador com sessão iniciada.

API

Pode usar o método testIamPermissions() para verificar que das autorizações fornecidas o autor da chamada tem para o recurso indicado. Este método usa um nome de recurso e um conjunto de autorizações como parâmetros e devolve o subconjunto de autorizações que o autor da chamada tem.

Segue-se um exemplo de código para testar as autorizaçõ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)