Como diminuir o escopo usando limites de acesso a credenciais

Nesta página, explicamos como usar os limites de acesso a credenciais para diminuir o escopo ou restringir as permissões de gerenciamento de identidade e acesso (IAM) que uma credencial de curta duração pode usar.

Para diminuir o escopo das permissões, defina um limite de acesso a credenciais que especifique quais recursos a credencial de curta duração poderá acessar, assim como um limite superior nas permissões disponíveis em cada recurso. Crie uma credencial de curta duração e, então, troque-a por uma nova credencial que respeite o limite de acesso a credenciais.

O exemplo a seguir mostra um limite de acesso a credenciais simples. Ele se aplica ao bucket example-bucket do Cloud Storage e define o limite superior para as permissões incluídas no papel Leitor de objetos do Storage (roles/storage.objectViewer):

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

Se você precisar dar aos membros um conjunto distinto de permissões para cada sessão, é possível que o uso de limites de acesso a credenciais seja mais eficiente do que a criação de várias contas de serviço diferentes e do que a concessão de um conjunto de papéis diferentes a cada conta de serviço. Por exemplo, se um de seus clientes precisar acessar dados do Cloud Storage que você controla, crie uma conta de serviço que acesse todos os buckets do Google Cloud Storage e, então, aplique um limite de acesso a credenciais que permita acesso apenas ao bucket com os dados do cliente.

Antes de começar

Antes de usar limites de acesso a credenciais, certifique-se de que você atende aos seguintes requisitos:

  • Você precisa diminuir o escopo de permissões apenas para o Cloud Storage, não para outros serviços do Google Cloud.

    Se você precisar diminuir o escopo de permissões para outros serviços do Google Cloud, crie várias contas de serviço e conceda um conjunto diferente de funções a cada conta de serviço.

  • Você precisa diminuir o escopo das permissões no nível do bucket, não no do objeto.

  • Você usa o acesso uniforme no nível do bucket para gerenciar o acesso aos recursos do Cloud Storage.

  • Você tem a capacidade de usar tokens de acesso do OAuth 2.0 para autenticação. Outros tipos de credenciais de curta duração não são compatíveis com os limites de acesso a credenciais.

Como criar uma credencial de curta duração com escopo diminuído

Para criar um token de acesso do OAuth 2.0 com permissões escopo diminuído, siga estas etapas:

  1. Conceda os papéis apropriados do IAM a um usuário ou conta de serviço.
  2. Defina um limite de acesso a credenciais que configure um limite superior para as permissões disponíveis para o usuário ou conta de serviço.
  3. Crie um token de acesso do OAuth 2.0 para o usuário ou conta de serviço.
  4. Troque o token de acesso do OAuth 2.0 por um novo token que respeite o limite de acesso a credenciais.

Em seguida, será possível usar o novo token de acesso do OAuth 2.0 com escopo diminuído para autenticar as solicitações para o Cloud Storage.

Como conceder papéis do IAM

Um limite de acesso a credenciais configura um limite superior para as permissões disponíveis para um recurso. Ele tem a capacidade de subtrair permissões de um membro, mas não de adicionar permissões que o membro ainda não tenha.

Dessa maneira, também é necessário conceder ao membro papéis que garantam as permissões de que ele precisa, seja em um bucket do Cloud Storage, seja em um recurso de nível superior, como o projeto.

Por exemplo, suponha que você precise criar uma credencial de curta duração com escopo diminuído que permita que uma conta de serviço crie objetos em um bucket:

  • No mínimo, é necessário conceder um papel à conta de serviço que inclua a permissão storage.objects.create, como o papel Criador de objetos do Storage (roles/storage.objectCreator). Também é necessário que o limite de acesso a credenciais inclua essa permissão.
  • Também é possível conceder um papel que inclua mais permissões, como o de Administrador de objetos do Storage (roles/storage.objectAdmin). A conta de serviço poderá usar apenas as permissões que aparecem na concessão do papel e no limite de acesso a credenciais.

Como definir um limite de acesso a credenciais

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

  • O recurso a que a regra se aplica
  • O limite superior das permissões disponíveis nesse recurso

Se você aplicar um limite de acesso a credenciais a uma credencial de curta duração, ela só poderá acessar os recursos dentro do limite de acesso a credenciais. Nenhuma permissão está disponível em outros recursos.

Um limite de acesso a credenciais contém até 10 regras de limite de acesso. É possível aplicar apenas um limite de acesso a credenciais a cada credencial de curta duração.

Um limite de acesso a credenciais contém os seguintes campos:

Campos
accessBoundaryRules[]

object

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

accessBoundaryRules[].availablePermissions[]

string

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

Cada valor é o identificador de um papel predefinido ou papel personalizado do IAM com o prefixo inRole:. Por exemplo: inRole:roles/storage.objectViewer. Somente as permissões nesses papéis estarão disponíveis.

accessBoundaryRules[].availableResource

string

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

O exemplo a seguir mostra um limite de acesso a credenciais que inclui regras para vários recursos:

  • O bucket example-bucket-1 do Cloud Storage. Para esse bucket, apenas as permissões no papel Leitor de objetos do Storage (roles/storage.objectViewer) estão disponíveis.
  • O bucket example-bucket-2 do Cloud Storage. Para esse bucket, apenas as permissões no papel Criador de objetos do Storage (roles/storage.objectCreator) estão disponíveis.
{
  "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"
    }
  ]
}

Crie um arquivo JSON que defina um limite de acesso a credenciais. Você usará esse arquivo em uma etapa posterior.

Como criar um token de acesso do OAuth 2.0

Antes de criar uma credencial de curta duração com escopo diminuído, é necessário criar um token de acesso normal do OAuth 2.0. Em seguida, será possível trocar a credencial normal por uma credencial com escopo diminuído. Ao criar o token de acesso, use o escopo https://www.googleapis.com/auth/cloud-platform do OAuth 2.0.

Para criar um token de acesso para uma conta de serviço, conclua o fluxo do OAuth 2.0 de servidor para servidor ou use a API Service Account Credentials para gerar um token de acesso do OAuth 2.0.

Para criar um token de acesso para um usuário, consulte Como obter tokens de acesso do OAuth 2.0. Também é possível usar o OAuth 2.0 Playground para criar um token de acesso para sua própria Conta do Google.

Como trocar o token de acesso do OAuth 2.0

Depois de criar um token de acesso do OAuth 2.0, é possível trocá-lo por um novo que respeite o limite de acesso a credenciais. A troca é feita por meio do serviço de token de segurança, que faz parte da Plataforma Identity.

Para trocar o token de acesso, use o método HTTP e URL a seguir:

POST https://securetoken.googleapis.com/v2beta1/token

Configure o cabeçalho Content-Type na solicitação para application/x-www-form-urlencoded. Inclua os seguintes campos no corpo da solicitação:

Campos
access_boundary

string

O limite de acesso a credenciais codificado por porcentagem.

grant_type

string

Use o valor urn:ietf:params:oauth:grant-type:token-exchange.

requested_token_type

string

Use o valor urn:ietf:params:oauth:token-type:access_token.

subject_token

string

O token de acesso do OAuth 2.0 que você quer trocar.

subject_token_type

string

Use o valor urn:ietf:params:oauth:token-type:access_token.

A resposta é um objeto JSON que contém os seguintes campos:

Campos
access_token

string

Um novo token de acesso do OAuth 2.0 que respeita o limite de acesso a credenciais.

expires_in

number

O tempo restante, em segundo, do prazo de validade do novo token de acesso.

Esse campo só estará presente se o token de acesso original representar uma conta de serviço. Se esse campo não estiver presente, o novo token de acesso terá o mesmo tempo de validade do token de acesso original.

issued_token_type

string

Contém o valor urn:ietf:params:oauth:token-type:access_token.

token_type

string

Contém o valor Bearer.

Por exemplo, se o limite de acesso a credenciais estiver armazenado no arquivo ./access-boundary.json, use o comando curl a seguir para trocar o token de acesso. Substitua original-token pelo token de acesso original:

curl -H "Content-Type:application/x-www-form-urlencoded" \
    -X POST \
    https://securetoken.googleapis.com/v2beta1/token \
    -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange&subject_token_type=urn:ietf:params:oauth:token-type:access_token&requested_token_type=urn:ietf:params:oauth:token-type:access_token&subject_token=original-token" \
    --data-urlencode "access_boundary=$(cat ./access-boundary.json)"

A resposta será semelhante ao seguinte exemplo:

{
  "access_token": "ya29.dr.AbCDeFg-123456...",
  "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
  "token_type": "Bearer",
  "expires_in": 3600
}

A seguir