Vista geral dos limites de acesso às credenciais

Esta página descreve os limites de acesso às credenciais, que pode usar para downscope ou restringir as autorizações da gestão de identidade e de acesso (IAM) que uma credencial de curta duração pode usar.

Pode usar limites de acesso de credenciais para gerar chaves de acesso OAuth 2.0 que representam uma conta de serviço, mas têm menos autorizações do que a conta de serviço. Por exemplo, se um dos seus clientes precisar de aceder a dados do Cloud Storage que controla, pode fazer o seguinte:

  1. Crie uma conta de serviço que possa aceder a todos os contentores do Cloud Storage que lhe pertencem.
  2. Gere uma chave de acesso OAuth 2.0 para a conta de serviço.
  3. Aplique um limite de acesso às credenciais que só permita o acesso ao contentor que contém os dados do seu cliente.

Como funcionam os limites de acesso às credenciais

Para restringir as autorizações, define um limite de acesso às credenciais que especifica a que recursos a credencial de curta duração pode aceder, bem como um limite superior nas autorizações disponíveis em cada recurso. Em seguida, pode criar uma credencial de curta duração e trocá-la por uma nova credencial que respeite o limite de acesso às credenciais.

Se precisar de conceder aos principais um conjunto distinto de autorizações para cada sessão, a utilização de limites de acesso às credenciais pode ser mais eficiente do que criar muitas contas de serviço diferentes e conceder a cada conta de serviço um conjunto diferente de funções.

Componentes de um limite de acesso a credenciais

Um limite de acesso de credenciais é um objeto que contém uma lista de regras de limites de acesso. Cada regra contém as seguintes informações:

  • O recurso ao qual a regra se aplica.
  • O limite superior das autorizações disponíveis nesse recurso.
  • Opcional: uma condição que restringe ainda mais as autorizações. Uma condição inclui o seguinte:
    • Uma expressão de condição que é avaliada como true ou false. Se a condição for avaliada como true, o acesso é permitido; caso contrário, o acesso é negado.
    • Opcional: um título que identifica a condição.
    • Opcional: uma descrição com mais informações sobre a condição.

Se aplicar um limite de acesso de credenciais a uma credencial de curta duração, a credencial só pode aceder aos recursos no limite de acesso de credenciais. Não estão disponíveis autorizações noutros recursos.

Um limite de acesso de credenciais pode conter até 10 regras de limite de acesso. Só pode aplicar um limite de acesso às credenciais a cada credencial de curta duração.

Quando representada como um objeto JSON, uma Credential Access Boundary contém os seguintes campos:

Campos
accessBoundary

object

Um wrapper para o limite de acesso às credenciais.

accessBoundary.accessBoundaryRules[]

object

Uma lista de regras de limite de acesso a aplicar a uma credencial de curta duração.

accessBoundary.accessBoundaryRules[].availablePermissions[]

string

Uma lista que define o limite superior das autorizações disponíveis para o recurso.

Cada valor é o identificador de uma função predefinida ou de uma função personalizada do IAM, com o prefixo inRole:. Por exemplo: inRole:roles/storage.objectViewer. Apenas as autorizações nestes papéis vão estar disponíveis.

accessBoundary.accessBoundaryRules[].availableResource

string

O nome completo do recurso do contentor do Cloud Storage ao qual a regra se aplica. Use o formato //storage.googleapis.com/projects/_/buckets/bucket-name.

accessBoundary.accessBoundaryRules[].availabilityCondition

object

Opcional. Uma condição que restringe a disponibilidade de autorizações a objetos específicos do Cloud Storage.

Use este campo se quiser disponibilizar autorizações para objetos específicos, em vez de todos os objetos num contentor do Cloud Storage.

accessBoundary.accessBoundaryRules[].availabilityCondition.expression

string

Uma expressão de condição que especifica os objetos do Cloud Storage onde as autorizações estão disponíveis.

Para saber como referir-se a objetos específicos numa expressão de condição, consulte o resource.name atributo e o api.getAttribute("storage.googleapis.com/objectListPrefix")atributo.

accessBoundary.accessBoundaryRules[].availabilityCondition.title

string

Opcional. Uma string curta que identifica a finalidade da condição.

accessBoundary.accessBoundaryRules[].availabilityCondition.description

string

Opcional. Detalhes sobre a finalidade da condição.

Para ver exemplos no formato JSON, consulte a secção Exemplos de limites de acesso às credenciais nesta página.

Exemplos de limites de acesso às credenciais

As secções seguintes mostram exemplos de limites de acesso às credenciais para exemplos de utilização comuns. Usa o limite de acesso às credenciais quando troca uma chave de acesso OAuth 2.0 por um token com âmbito reduzido.

Limite as autorizações para um contentor

O exemplo seguinte mostra um limite de acesso de credenciais simples. Aplica-se ao contentor do Cloud Storage example-bucket e define o limite superior para as autorizações incluídas na função Leitor de objetos do Storage (roles/storage.objectViewer):

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket"
      }
    ]
  }
}

Limite as autorizações para vários contentores

O exemplo seguinte mostra um limite de acesso às credenciais que inclui regras para vários contentores:

  • O contentor do Cloud Storage example-bucket-1: para este contentor, apenas as autorizações na função Visualizador de objetos de armazenamento (roles/storage.objectViewer) estão disponíveis.
  • O contentor do Cloud Storage example-bucket-2: para este contentor, só estão disponíveis as autorizações na função de criador de objetos de armazenamento (roles/storage.objectCreator).
{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-1"
      },
      {
        "availablePermissions": [
          "inRole:roles/storage.objectCreator"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-2"
      }
    ]
  }
}

Limite as autorizações para objetos específicos

Também pode usar condições do IAM para especificar a que objetos do Cloud Storage um principal pode aceder. Por exemplo, pode adicionar uma condição que disponibilize autorizações para objetos cujo nome comece com customer-a:

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket",
        "availabilityCondition": {
          "expression" : "resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a')"
        }
      }
    ]
  }
}

Limite as autorizações ao listar objetos

Quando lista os objetos num contentor do Cloud Storage, está a chamar um método num recurso de contentor e não num recurso de objeto. Como resultado, se uma condição for avaliada para um pedido de lista e a condição se referir ao nome do recurso, o nome do recurso identifica o contentor, e não um objeto no contentor. Por exemplo, quando lista objetos em example-bucket, o nome do recurso é projects/_/buckets/example-bucket.

Esta convenção de nomenclatura pode levar a um comportamento inesperado quando lista objetos. Por exemplo, suponhamos que quer um limite de acesso às credenciais que permita o acesso de visualização a objetos em example-bucket com o prefixo customer-a/invoices/. Pode tentar usar a seguinte condição no limite de acesso às credenciais:

Incomplete: condição que verifica apenas o nome do recurso

resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/')

Esta condição funciona para ler objetos, mas não para listar objetos:

  • Quando um principal tenta ler um objeto em example-bucket com o prefixo customer-a/invoices/, a condição é avaliada como true.
  • Quando um principal tenta listar objetos com esse prefixo, a condição é avaliada como false. O valor de resource.name é projects/_/buckets/example-bucket, que não começa com projects/_/buckets/example-bucket/objects/customer-a/invoices/.

Para evitar este problema, além de usar resource.name.startsWith(), a sua condição pode verificar um atributo da API denominado storage.googleapis.com/objectListPrefix. Este atributo contém o valor do parâmetro prefix que foi usado para filtrar a lista de objetos. Como resultado, pode escrever uma condição que faça referência ao valor do parâmetro prefix.

O exemplo seguinte mostra como usar o atributo API numa condição. Permite ler e listar objetos em example-bucket com o prefixo customer-a/invoices/:

Complete: condição que verifica o nome do recurso e o prefixo

resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/')  ||
    api.getAttribute('storage.googleapis.com/objectListPrefix', '')
                     .startsWith('customer-a/invoices/')

Já pode usar esta condição num limite de acesso a credenciais:

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket",
        "availabilityCondition": {
          "expression":
            "resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/') || api.getAttribute('storage.googleapis.com/objectListPrefix', '').startsWith('customer-a/invoices/')"
        }
      }
    ]
  }
}

O que se segue?