Esta página explica como usar limites de acesso de credenciais para criar um token de acesso OAuth 2.0 com autorizações do Cloud Storage com âmbito reduzido.
O processo de criação de um token com autorizações restritas inclui os seguintes passos:
- Conceda as funções de IAM adequadas a um utilizador ou a uma conta de serviço.
- Defina um limite de acesso às credenciais que estabelece um limite superior para as autorizações disponíveis para o utilizador ou a conta de serviço.
- Crie uma chave de acesso OAuth 2.0 para o utilizador ou a conta de serviço.
- Troque a chave de acesso OAuth 2.0 por uma nova chave que respeite o limite de acesso às credenciais.
Em seguida, pode usar o novo token de acesso OAuth 2.0 com âmbito reduzido para autenticar pedidos ao Cloud Storage.
Antes de começar
Antes de usar os limites de acesso às credenciais, certifique-se de que cumpre os seguintes requisitos:
Tem de restringir as autorizações apenas para o Cloud Storage e não para outros serviçosGoogle Cloud .
Se precisar de reduzir o âmbito das autorizações para serviços Google Cloud adicionais, pode criar várias contas de serviço e conceder um conjunto diferente de funções a cada conta de serviço.
Pode usar chaves de acesso OAuth 2.0 para autenticação. Outros tipos de credenciais de curta duração não suportam limites de acesso às credenciais.
Além disso, tem de ativar as APIs necessárias:
-
Enable the IAM and Security Token Service APIs.
Conceda funções de IAM
Um limite de acesso às credenciais define um limite superior para as autorizações disponíveis para um recurso. Pode subtrair autorizações de um principal, mas não pode adicionar autorizações que o principal ainda não tenha.
Como resultado, também tem de conceder funções ao principal que forneçam as autorizações de que necessita, num contentor do Cloud Storage ou num recurso de nível superior, como o projeto.
Por exemplo, suponhamos que precisa de criar uma credencial de curta duração com âmbito reduzido que permita a uma conta de serviço criar objetos num contentor:
- No mínimo, tem de conceder uma função à conta de serviço que inclua a autorização
storage.objects.create
, como a função Storage Object Creator (roles/storage.objectCreator
). O limite de acesso às credenciais também tem de incluir esta autorização. - Também pode conceder uma função que inclua mais autorizações, como a função de administrador de objetos de armazenamento (
roles/storage.objectAdmin
). A conta de serviço só pode usar as autorizações que aparecem na concessão de funções e no limite de acesso às credenciais.
Para saber mais sobre as funções predefinidas do Cloud Storage, consulte o artigo Funções do Cloud Storage.
Defina o limite de acesso às credenciais
Um limite de acesso de credenciais é um objeto que contém uma lista de regras de limites de acesso. As regras são compostas por parâmetros que especificam o limite superior das autorizações disponíveis para o utilizador ou a conta de serviço. Para definir um limite de acesso de credenciais, crie um objeto JSON que liste as regras do limite de acesso e os respetivos parâmetros.
Segue-se um exemplo de um limite de acesso às credenciais:
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:ROLE_ID"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/BUCKET_NAME"
"availabilityCondition": {
"expression" : "CONDITION"
}
]
}
}
Substitua o seguinte:
ROLE_ID
: O ID de uma função predefinida ou personalizada que define o limite superior das autorizações disponíveis para o recurso. Por exemplo,roles/storage.objectViewer
. Para especificar várias funções, adicione uma nova linha com o prefixoinRole:
seguido do ID da função. Apenas as autorizações nas funções especificadas vão estar disponíveis.BUCKET_NAME
: o nome do contentor do Cloud Storage ao qual a regra se aplica.CONDITION
: opcional. Uma expressão de condição que especifica os objetos do Cloud Storage onde as autorizações estão disponíveis. Por exemplo, a seguinte condição disponibiliza autorizações para objetos cujo nome começa porcustomer-a
:resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a')
Para saber como criar e personalizar limites de acesso a credenciais, consulte o artigo Componentes de um limite de acesso a credenciais.
Para ver exemplos de potenciais exemplos de utilização de limites de acesso a credenciais, consulte o artigo Exemplos de limites de acesso a credenciais.
Crie uma chave de acesso OAuth 2.0
Antes de criar uma credencial de curta duração com âmbito reduzido, tem de criar uma chave de acesso OAuth 2.0 normal. Em seguida, pode trocar a credencial normal por uma credencial com âmbito reduzido. Quando criar a chave de acesso, use o âmbito do OAuth 2.0
https://www.googleapis.com/auth/cloud-platform
.
Para criar um token de acesso para uma conta de serviço, pode concluir o fluxo OAuth 2.0 de servidor a servidor ou pode usar a API Service Account Credentials para gerar um token de acesso OAuth 2.0.
Para criar uma chave de acesso para um utilizador, consulte o artigo Obter chaves de acesso OAuth 2.0. Também pode usar o OAuth 2.0 Playground para criar um token de acesso para a sua própria Conta Google.
Troque a chave de acesso OAuth 2.0
Depois de criar uma chave de acesso OAuth 2.0, pode trocar a chave de acesso por uma chave com âmbito reduzido que respeite o limite de acesso das credenciais. Normalmente, este processo envolve um agente de tokens e um consumidor de tokens:
O agente de tokens é responsável por definir o limite de acesso de credenciais e trocar um token de acesso por um token com âmbito reduzido.
O agente de tokens pode usar uma biblioteca de autenticação suportada para trocar automaticamente tokens de acesso ou pode chamar o serviço de tokens de segurança para trocar tokens manualmente.
O consumidor de tokens pede um token de acesso com âmbito reduzido ao agente de tokens e, em seguida, usa o token de acesso com âmbito reduzido para realizar outra ação.
O consumidor do token pode usar uma biblioteca de autenticação suportada para atualizar automaticamente os tokens de acesso antes de expirarem. Em alternativa, pode atualizar os tokens manualmente ou permitir que os tokens expirem sem os atualizar.
Existem duas formas de trocar o token de acesso por um token com âmbito reduzido:
Troca de tokens do lado do cliente (recomendada): os clientes obtêm materiais criptográficos do servidor da API Security Token Service. Os materiais criptográficos permitem que os clientes gerem tokens com âmbito reduzido com regras de limite de acesso de credenciais variáveis de forma independente do lado do cliente durante um período definido (por exemplo, 1 hora). Esta abordagem reduz a latência e melhora a eficiência, especialmente para clientes que requerem atualizações frequentes das regras do limite de acesso às credenciais. Também é mais eficiente para aplicações que precisam de gerar muitos tokens com âmbito reduzido únicos. Esta é a abordagem recomendada porque oferece um melhor desempenho, escalabilidade e compatibilidade com funcionalidades futuras.
Troca de tokens do lado do servidor: os clientes pedem um novo token com âmbito reduzido ao servidor da API Security Token Service sempre que uma regra de limite de acesso às credenciais é alterada. Esta abordagem é simples, mas requer um processo de ida e volta ao servidor da API do serviço de tokens de segurança para cada pedido de token com âmbito reduzido. Esta abordagem só é recomendada para clientes que precisam de uma biblioteca de cliente que não suporte a troca de tokens do lado do cliente, devido ao ciclo completo para a API Security Token Service para cada pedido de token com âmbito reduzido.
Troca de tokens do lado do cliente
Se criar o agente de tokens e o consumidor de tokens com a seguinte linguagem, pode usar a biblioteca de autenticação da Google para trocar e atualizar tokens automaticamente através da abordagem do lado do cliente.
Java
Para Java, pode trocar e atualizar tokens automaticamente com a versão 1.32.1 ou posterior do artefacto com.google.auth:google-auth-library-cab-token-generator
.
Para verificar a versão do artefacto, execute o seguinte comando Maven no diretório da aplicação:
mvn dependency:list -DincludeArtifactIds=google-auth-library-cab-token-generator
O exemplo seguinte mostra como um agente de tokens pode gerar tokens com âmbito reduzido:
O exemplo seguinte mostra como um consumidor de tokens pode usar um controlador de atualização para obter e atualizar automaticamente tokens com âmbito reduzido:
Troca de tokens do lado do servidor
Esta secção descreve os seguintes métodos que pode usar para trocar tokens através da abordagem do lado do serviço:
Troque e atualize automaticamente a chave de acesso através da abordagem do lado do servidor
Se criar o agente de tokens e o consumidor de tokens com um dos seguintes idiomas, pode usar a biblioteca de autenticação da Google para trocar e atualizar tokens automaticamente através da abordagem de geração de tokens do lado do servidor:
Go
Para o Go, pode trocar e atualizar tokens automaticamente com a versão
v0.0.0-20210819190943-2bc19b11175f ou posterior do pacote
golang.org/x/oauth2
.
Para verificar a versão do pacote, execute o seguinte comando no diretório da aplicação:
go list -m golang.org/x/oauth2
O exemplo seguinte mostra como um agente de tokens pode gerar tokens com âmbito reduzido:
O exemplo seguinte mostra como um consumidor de tokens pode usar um controlador de atualização para obter e atualizar automaticamente tokens com âmbito reduzido:
Java
Para Java, pode trocar e atualizar tokens automaticamente com a versão 1.1.0 ou posterior do artefacto com.google.auth:google-auth-library-oauth2-http
.
Para verificar a versão do artefacto, execute o seguinte comando Maven no diretório da aplicação:
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
O exemplo seguinte mostra como um agente de tokens pode gerar tokens com âmbito reduzido:
O exemplo seguinte mostra como um consumidor de tokens pode usar um controlador de atualização para obter e atualizar automaticamente tokens com âmbito reduzido:
Node.js
Para o Node.js, pode trocar e atualizar tokens automaticamente com a versão 7.9.0 ou posterior do pacote google-auth-library
.
Para verificar a versão do pacote, execute o seguinte comando no diretório da aplicação:
npm list google-auth-library
O exemplo seguinte mostra como um agente de tokens pode gerar tokens com âmbito reduzido:
O exemplo seguinte mostra como um consumidor de tokens pode fornecer um controlador de atualização que obtém e atualiza automaticamente tokens com âmbito reduzido:
Python
Para Python, pode trocar e atualizar tokens automaticamente com a versão 2.0.0 ou posterior do pacote google-auth
.
Para verificar a versão do pacote, execute o seguinte comando no ambiente onde o pacote está instalado:
pip show google-auth
O exemplo seguinte mostra como um agente de tokens pode gerar tokens com âmbito reduzido:
O exemplo seguinte mostra como um consumidor de tokens pode fornecer um controlador de atualização que obtém e atualiza automaticamente tokens com âmbito reduzido:
Troque e atualize a chave de acesso manualmente
Um agente de tokens pode usar a API Security Token Service para trocar um token de acesso por um token de acesso com âmbito reduzido. Em seguida, pode fornecer o token com âmbito reduzido a um consumidor de tokens.
Para trocar o token de acesso, use o seguinte método HTTP e URL:
POST https://sts.googleapis.com/v1/token
Defina o cabeçalho Content-Type
no pedido para
application/x-www-form-urlencoded
. Inclua os seguintes campos no corpo do pedido:
Campos | |
---|---|
grant_type |
Use o valor
|
options |
Um limite de acesso às credenciais formatado em JSON, codificado com codificação percentual. |
requested_token_type |
Use o valor
|
subject_token |
A chave de acesso OAuth 2.0 que quer trocar. |
subject_token_type |
Use o valor
|
A resposta é um objeto JSON que contém os seguintes campos:
Campos | |
---|---|
access_token |
Uma chave de acesso OAuth 2.0 com âmbito reduzido que respeita o limite de acesso das credenciais. |
expires_in |
O período de tempo até o token com âmbito reduzido expirar, em segundos. Este campo só é incluído se o token de acesso original representar uma conta de serviço. Quando este campo não está incluído, a chave com âmbito reduzido tem o mesmo tempo de expiração que a chave de acesso original. |
issued_token_type |
Contém o valor
|
token_type |
Contém o valor |
Por exemplo, se um limite de acesso de credenciais formatado em JSON estiver armazenado no ficheiro ./access-boundary.json
, pode usar o seguinte comando curl
para trocar o token de acesso. Substitua
original-token
pela chave de acesso original:
curl -H "Content-Type:application/x-www-form-urlencoded" \ -X POST \ https://sts.googleapis.com/v1/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 "options=$(cat ./access-boundary.json)"
A resposta é 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
}
Quando um consumidor de tokens pede um token com âmbito reduzido, o agente de tokens responde com o token com âmbito reduzido e o número de segundos até expirar. Se o token tiver expirado, o servidor rejeita o pedido. Para atualizar o token com âmbito reduzido, o consumidor pode pedir um token com âmbito reduzido ao agente antes de o token existente expirar.
O que se segue?
- Saiba mais sobre o controlo de acesso ao Cloud Storage.
- Crie uma credencial de conta de serviço de curta duração.
- Crie uma chave de acesso OAuth 2.0 para uma conta de serviço com um dos seguintes métodos:
- Crie uma chave de acesso OAuth 2.0 para um utilizador.
- Veja as autorizações em cada função predefinida.
- Saiba mais sobre as funções personalizadas.