Definir limites para a concessão de papéis

Em organizações de grande porte, pode ser útil permitir que as equipes gerenciem de maneira independente as políticas de permissão dos recursos. No entanto, permitir que um principal conceda ou revogue todos os papéis do IAM pode aumentar muito seu risco de segurança.

É possível definir limites para os papéis que um principal pode conceder e revogar com as condições de gerenciamento de identidade e acesso (IAM) e o atributo de API iam.googleapis.com/modifiedGrantsByRole. Esses limites permitem criar administradores limitados do IAM que podem gerenciar as políticas de permissão da própria equipe, mas apenas dentro dos limites definidos.

Antes de começar

Permissões necessárias

Para conseguir as permissões necessárias para criar administradores limitados do IAM para um projeto, uma pasta ou uma organização, peça ao administrador que conceda a você os seguintes papéis do IAM no recurso para o qual quer criar um administrador limitado do IAM (projeto, pasta ou organização):

  • Para criar um administrador limitado do IAM para um projeto: Administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin)
  • Para criar um administrador limitado do IAM para uma pasta: Administrador de pastas (roles/resourcemanager.folderAdmin)
  • Para criar um administrador limitado do IAM para um projeto, uma pasta ou uma organização: Administrador da organização (roles/resourcemanager.organizationAdmin)

Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Esses papéis predefinidos têm as permissões necessárias para criar administradores limitados de IAM para um projeto, uma pasta ou uma organização. Para ver as permissões exatas necessárias, expanda a seção Permissões necessárias:

Permissões necessárias

As permissões a seguir são necessárias para criar administradores limitados do IAM para um projeto, uma pasta ou uma organização:

  • Para criar um administrador limitado do IAM para um projeto:
    • resourcemanager.projects.getIamPolicy
    • resourcemanager.projects.setIamPolicy
  • Para criar um administrador limitado do IAM para uma pasta:
    • resourcemanager.folders.getIamPolicy
    • resourcemanager.folders.setIamPolicy
  • Para criar um administrador limitado do IAM para uma organização:
    • resourcemanager.organizations.getIamPolicy
    • resourcemanager.organizations.setIamPolicy

Essas permissões também podem ser concedidas com funções personalizadas ou outros papéis predefinidos.

Casos de uso comuns

As seções a seguir descrevem como é possível usar a concessão de papéis limitados para ativar o gerenciamento de autoatendimento das políticas de permissão.

Criar administradores limitados do IAM

Considere um cenário em que você quer deixar um usuário, Finn (finn@example.com), atuar como um administrador limitado do IAM no seu projeto. Você quer que Finn possa conceder e revogar apenas os papéis de administrador do App Engine (roles/appengine.appAdmin) e o de leitor do App Engine (roles/appengine.appViewer) no seu projeto.

Para conceder essa capacidade limitada, conceda condicionalmente o papel de administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin). O papel de administrador do IAM do projeto permite que Finn conceda e revogue papéis do IAM, e a condição limita quais os papéis que podem ser fornecidos e revogados:

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "members": [
        "user:owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "finn@example.com"
      ],
      "role": "roles/resourcemanager.projectIamAdmin",
      "condition": {
        "title": "only_appengine_admin_viewer_roles",
        "description": "Only allows changes to role bindings with the App Engine Admin or Viewer roles",
        "expression":
          "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/appengine.appAdmin', 'roles/appengine.appViewer'])"
      }
    }
  ]
}

Essa vinculação de papel condicional permite que Finn faça as seguintes ações:

  • Conceda os papéis administrador e leitor do App Engine ao projeto.
  • Revogue os papéis de administrador e leitor do App Engine do projeto.
  • Adicione, remova ou modifique condições para vinculações de papéis no nível do projeto que concedam os papéis de administrador e de leitor do App Engine.
  • Realize outras ações permitidas pelo papel de administrador do IAM do projeto que não modifica a política de permissão do projeto. Por exemplo, Finn pode usar o método projects.getIamPolicy para conseguir a política de permissão do projeto.

Essa vinculação de papel condicional não permite que Finn faça as seguintes ações:

  • Modificar políticas de permissão para recursos que não sejam do projeto.
  • Conceda outros papéis, além do de administrador ou de visualizador do App Engine.
  • Revogue outros papéis que não sejam o de Administrador ou o de Leitor do App Engine.
  • Adicione, remova ou modifique condições para vinculações de papéis que não concedam os papéis de administrador ou leitor do App Engine.

Permitir que os usuários gerenciem administradores limitados do IAM

Considere um cenário em que você queira tornar um usuário, Lila, uma administradora limitada do IAM na sua equipe. Você quer que Lila possa conceder e revogar apenas o papel de administrador do Compute (roles/compute.admin) no projeto dela. No entanto, você também quer permitir que Lila selecione outros usuários para que atuem como administradores limitados do IAM. Em outras palavras, você quer que Lila permita que outros usuários concedam e revoguem apenas o papel de administrador do Compute.

Talvez você ache que a solução é conceder à Lila o papel de administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin) e, em seguida, dar a ela a capacidade de conceder ou revogar esse papel para outros. No entanto, se você conceder o papel "Administrador do IAM do projeto" à Lila, ela poderá remover a condição do seu próprio papel e conceder a si mesma a capacidade de conceder ou revogar qualquer papel do IAM.

Para ajudar a evitar o escalonamento de privilégios, crie um Grupo do Google, iam-compute-admins@example.com, para os administradores limitados do IAM no projeto. Em seguida, adicione Lila ao grupo e torne-a uma gerente de grupo.

Depois de criar o grupo, você concede condicionalmente o papel de administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin). Esse papel permite que os membros do grupo concedam e revoguem papéis do IAM, e a condição limita quais os papéis que podem ser concedidos e revogados:

{
  "version": 3,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "members": [
        "user:owner@example.com"
      ],
      "role": "roles/owner"
    },
    {
      "members": [
        "iam-compute-admins@example.com"
      ],
      "role": "roles/resourcemanager.projectIamAdmin",
      "condition": {
        "title": "only_compute_admin_role",
        "description": "Only allows changes to role bindings for the Compute Admin role",
        "expression":
          "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/compute.admin'])"
      }
    }
  ]
}

Como membro do grupo iam-compute-admins@example.com, Lila pode fazer as seguintes ações:

  • Conceder o papel de administrador do Compute no projeto adicionando uma nova vinculação ou adicionando um participante a uma vinculação existente para o papel.
  • Revogar o papel de administrador do Compute removendo uma vinculação ou removendo um participante de uma vinculação para o papel.
  • Modificar as concessões do papel de administrador do Compute adicionando, removendo ou modificando condições anexadas a vinculações para o papel.
  • Realize outras ações permitidas pelo papel de administrador do IAM do projeto que não modifica a política de permissão do projeto. Por exemplo, ela pode usar o método projects.getIamPolicy para conseguir a política de permissão do projeto.

Como administrador do grupo iam-compute-admins@example.com, Lila pode permitir que outros usuários concedam ou revoguem o papel de administrador do Compute, adicionando-os ao grupo iam-compute-admins@example.com.

Lila não pode:

  • Dar a si mesma a capacidade de conceder ou revogar outros papéis.
  • Modificar políticas de permissão para recursos que não sejam do projeto.
  • Conceder papéis diferentes do papel de administrador do Compute.
  • Revogar papéis diferentes do papel de administrador do Compute.
  • Adicionar, remover ou modificar condições para vinculações de papel que não concedem o papel de administrador do Compute.

Limitar a concessão de papel

Veja nas seções a seguir como permitir que os participantes concedam ou revoguem apenas determinados papéis.

Escrever uma expressão de condição para limitar a concessão de papel

Para limitar a capacidade de um participante conceder papéis, escreva uma expressão de condição que especifique os papéis que um participante pode conceder ou revogar.

Use o seguinte formato para a expressão condicional:

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(roles)

Essa expressão faz a seguinte ação:

  • Obtém o atributo da API iam.googleapis.com/modifiedGrantsByRole usando a função api.getAttribute().

    Para uma solicitação que define a política de permissão de um recurso, esse atributo contém os nomes de papéis das vinculações modificadas pela solicitação. Para outros tipos de solicitação, o atributo não é definido. Nesses casos, a função retorna o valor padrão ([]).

  • Usa a função hasOnly() Common Expression Language (CEL) para definir e aplicar os papéis que o participante tem permissão para conceder ou revogar.

    A entrada da função hasOnly() é uma lista dos papéis que o participante tem permissão para conceder ou revogar. Se os papéis no atributo iam.googleapis.com/modifiedGrantsByRole estiverem incluídos nessa lista, a função retornará true. Se eles não estiverem, a função retornará false.

    Se o atributo iam.googleapis.com/modifiedGrantsByRole contiver o valor padrão ([]), a função retornará true, porque [] não contém nenhum papel não incluído na lista.

Para personalizar essa expressão, substitua roles por uma lista dos papéis que o participante tem permissão para conceder ou revogar. Por exemplo, para permitir que o membro conceda ou revogue apenas os papéis de editor do Pub/Sub (roles/pubsub.editor) e publicador do Pub/Sub (roles/pubsub.publisher), use o valor ['roles/pubsub.editor', 'roles/pubsub.publisher'].

É possível incluir até 10 valores na lista de papéis permitidos. Todos esses valores precisam ser constantes de string.

Operadores lógicos para instruções hasOnly()

Não use os operadores && ou || para mesclar várias instruções hasOnly() em uma única condição. Se você fizer isso, as solicitações que concedem ou revogam vários papéis talvez falhem, mesmo que o principal possa conceder ou revogar esses papéis individualmente.

Por exemplo, considere a seguinte condição:

api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
    .hasOnly(['roles/pubsub.editor']) ||
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
    .hasOnly(['roles/pubsub.publisher'])

Essa condição será avaliada como true se uma solicitação conceder o papel roles/pubsub.editor ou roles/pubsub.publisher, mas será avaliada como false se uma solicitação conceder os dois papéis: roles/pubsub.editor e roles/pubsub.publisher.

Limitar a concessão de papéis com vinculações de papel condicionais

Para permitir que um participante conceda ou revogue apenas determinados papéis, use a expressão condicional da seção anterior para criar uma vinculação de papel condicional. Em seguida, adicione a vinculação de papel condicional à política de permissão de um recurso.

  1. Selecione um recurso que representa o escopo para o qual você quer que um participante conceda e revogue papéis:

    • Se você quiser permitir que um participante conceda e revogue determinados papéis para todos os recursos em uma organização, selecione uma organização.
    • Se você quiser permitir que um participante conceda e revogue determinados papéis para todos os recursos em uma pasta, selecione uma pasta.
    • Se você quiser permitir que um participante conceda e revogue determinados papéis para todos os recursos em um projeto, selecione um projeto.
  2. Selecione um papel que permita que um principal defina a política de permissão para o tipo de recurso selecionado (projeto, pasta ou organização). Para seguir o princípio de privilégio mínimo, escolha um dos seguintes papéis predefinidos:

    • Projetos: administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin)
    • Pastas: administrador do IAM da pasta (roles/resourcemanager.folderIamAdmin)
    • Organizações: administrador da organização (roles/resourcemanager.organizationAdmin).

    Outra alternativa é escolher um papel personalizado que inclua as permissões resourcemanager.resource-type.setIamPolicy e resourcemanager.resource-type.getIamPolicy, em que resource-type é project, folder ou organization.

  3. Conceda condicionalmente ao participante o papel escolhido no projeto, na pasta ou na organização selecionada.

    A nova política de permissão será aplicada, e o principal poderá modificar vinculações somente para os papéis que você permitiu.

    Console

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

      Acessar a página do IAM

    2. Certifique-se de que o nome do projeto, da pasta ou da organização apareça no seletor de recursos na parte superior da página. O seletor de recursos informa em qual projeto, pasta ou organização você está trabalhando.

      Se você não encontrar o nome do recurso, clique no seletor e selecione seu recurso.

    3. Na lista de participantes, localize o participante que concederá e revogará papéis e clique no botão .

    4. No painel Editar permissões, selecione o papel que você escolheu anteriormente. Em seguida, em Condição do IAM (opcional), clique em Adicionar condição do IAM.

    5. No painel Editar condição, insira um título e uma descrição opcional para a condição.

    6. Clique na guia Editor de condições e digite a expressão que você escreveu em Como escrever uma expressão de condição para limitar a concessão de papel. Essa expressão limita os papéis que o participante pode conceder ou revogar.

      Por exemplo, a expressão de condição a seguir limita o participante para conceder e revogar os papéis de editor do Pub/Sub (roles/pubsub.editor) e publicador do Pub/Sub (roles/pubsub.publisher):

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])

      Aviso: não inclua os seguintes tipos de papéis na lista de papéis permitidos:

      • Papéis com permissões para conceder e revogar papéis do IAM (ou seja, papéis com nomes de permissão que terminam em setIamPolicy).
      • Papéis personalizados que o administrador limitado do IAM pode modificar. Por exemplo, se o administrador limitado do IAM também tiver o papel de administrador de papéis (roles/iam.roleAdmin) em um projeto, não permita que ele conceda ou revogue papéis personalizados no nível do projeto.

      Os administradores limitados do IAM que podem conceder e revogar esses tipos de papéis podem conceder a si mesmos permissão para conceder e revogar todos os papéis do IAM. Para mais informações, consulte Como escrever uma expressão de condição para limitar a concessão de papel.

    7. Clique em Salvar para aplicar a condição.

    8. Depois que o painel Editar condição for fechado, clique em Salvar no painel Editar permissões para atualizar a política de permissão.

    gcloud

    As políticas de permissão são definidas usando o padrão read-modify-write.

    Primeiro, leia a política de permissão para o recurso:

    Execute o comando get-iam-policy. Este comando consegue a política atual de permissão para o recurso.

    Comando:

    gcloud resource-type get-iam-policy resource-id --format=json > path

    Substitua os seguintes valores:

    • resource-type: o tipo de recurso em que você quer permitir que um participante conceda ou revogue papéis. Use uma das seguintes opções: projects, resource-manager folders ou organizations.
    • resource-id: o projeto, a pasta ou o ID da organização do Google Cloud.
    • path: o caminho do arquivo para fazer o download da política de permissão.

    A política de permissão é salva no formato JSON. Por exemplo:

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

    Em seguida, modifique a política de permissão.

    Para permitir que um participante só modifique vinculações para determinados papéis, adicione a vinculação de papel condicional destacada:

    {
      "bindings": [
        {
          "members": [
            "user:owner@example.com"
          ],
          "role": "roles/owner"
        },
        {
          "members": [
            "principal"
          ],
          "role": "role",
          "condition": {
            "title": "title",
            "description": "description",
            "expression":
              "expression"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }

    Substitua os seguintes valores:

    • principal: o participante que concederá ou revogará determinados papéis. Por exemplo, user:my-user@example.com. Para ver os formatos de cada tipo de participante, consulte a referência Binding.
    • role: o papel que você escolheu nas etapas anteriores. Esse papel precisa incluir a permissão setIamPolicy para o tipo de recurso que você escolheu.
    • title: uma string que descreve brevemente a condição. Por exemplo, only_pubsub_roles.
    • description: opcional. Uma descrição adicional da condição. Por exemplo, Only allows granting/revoking the Pub/Sub editor and publisher roles.
    • expression: a expressão que você escreveu em Como escrever uma expressão de condição para limitar a concessão de papel. Essa expressão limita os papéis que o participante pode conceder ou revogar.

      Por exemplo, a expressão de condição a seguir limita o participante para conceder e revogar os papéis de editor do Pub/Sub (roles/pubsub.editor) e publicador do Pub/Sub (roles/pubsub.publisher):

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])

      Aviso: não inclua os seguintes tipos de papéis na lista de papéis permitidos:

      • Papéis com permissões para conceder e revogar papéis do IAM (ou seja, papéis com nomes de permissão que terminam em setIamPolicy).
      • Papéis personalizados que o administrador limitado do IAM pode modificar. Por exemplo, se o administrador limitado do IAM também tiver o papel de administrador de papéis (roles/iam.roleAdmin) em um projeto, não permita que ele conceda ou revogue papéis personalizados no nível do projeto.

      Os administradores limitados do IAM que podem conceder e revogar esses tipos de papéis podem conceder a si mesmos permissão para conceder e revogar todos os papéis do IAM. Para mais informações, consulte Como escrever uma expressão de condição para limitar a concessão de papel.

    Por fim, escreva a política de permissão atualizada:

    Defina a nova política de permissão executando o comando set-iam-policy para o recurso:

    gcloud resource-type set-iam-policy resource-id path

    Substitua os seguintes valores:

    • resource-type: o tipo de recurso em que você quer permitir que um participante conceda ou revogue papéis. Use uma das seguintes opções: projects, resource-manager folders ou organizations.
    • resource-id: o projeto, a pasta ou o ID da organização do Google Cloud.
    • path: um caminho para o arquivo que contém a política de permissão atualizada.

    A nova política de permissão será aplicada e o principal poderá modificar as vinculações somente aos papéis permitidos.

    REST

    As políticas de permissão são definidas usando o padrão read-modify-write.

    Primeiro, leia a política de permissão para o recurso:

    O método getIamPolicy da API Resource Manager recebe a política de permissão de um projeto, pasta ou 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 permissão do projeto. Exemplo:

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

    Em seguida, modifique a política de permissão.

    Adicione uma vinculação de papel condicional para permitir que um participante conceda e revogue apenas determinados papéis. Altere o campo version para o valor 3:

    {
      "version": 3,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "members": [
            "user:owner@example.com"
          ],
          "role": "roles/owner"
        },
        {
          "members": [
            "PRINCIPAL"
          ],
          "role": "ROLE",
          "condition": {
            "title": "TITLE",
            "description": "DESCRIPTION",
            "expression":
              "EXPRESSION"
          }
        }
      ]
    }
    • PRINCIPAL: o participante que concederá ou revogará determinados papéis. Por exemplo, user:my-user@example.com. Para ver os formatos de cada tipo de participante, consulte a referência Binding.
    • ROLE: o papel que você escolheu nas etapas anteriores. Esse papel precisa incluir a permissão setIamPolicy para o tipo de recurso que você escolheu.
    • TITLE: uma string que descreve brevemente a condição. Por exemplo, only_pubsub_roles.
    • DESCRIPTION: opcional. Uma descrição adicional da condição. Por exemplo, Only allows granting/revoking the Pub/Sub editor and publisher roles.
    • EXPRESSION: a expressão que você escreveu em Como escrever uma expressão de condição para limitar a concessão de papel. Essa expressão limita os papéis que o participante pode conceder ou revogar.

      Por exemplo, a expressão de condição a seguir limita o participante para conceder e revogar os papéis de editor do Pub/Sub (roles/pubsub.editor) e publicador do Pub/Sub (roles/pubsub.publisher):

      api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])

      Aviso: não inclua os seguintes tipos de papéis na lista de papéis permitidos:

      • Papéis com permissões para conceder e revogar papéis do IAM (ou seja, papéis com nomes de permissão que terminam em setIamPolicy).
      • Papéis personalizados que o administrador limitado do IAM pode modificar. Por exemplo, se o administrador limitado do IAM também tiver o papel de administrador de papéis (roles/iam.roleAdmin) em um projeto, não permita que ele conceda ou revogue papéis personalizados no nível do projeto.

      Os administradores limitados do IAM que podem conceder e revogar esses tipos de papéis podem conceder a si mesmos permissão para conceder e revogar todos os papéis do IAM. Para mais informações, consulte Como escrever uma expressão de condição para limitar a concessão de papel.

    Por fim, escreva a política de permissão atualizada:

    O método setIamPolicy da API Resource Manager define a política de permissão na solicitação como a nova política de permissão para o projeto, pasta ou 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": 3,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "members": [
              "user:owner@example.com"
            ],
            "role": "roles/owner"
          },
          {
            "members": [
              "principal"
            ],
            "role": "role",
            "condition": {
              "title": "title",
              "description": "description",
              "expression":
                "expression"
            }
          }
        ]
      }

    Método HTTP e URL:

    POST https://cloudresourcemanager.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 de permissão atualizada.

A seguir