Identidade da aplicação
Para acessar recursos da sua nuvem (um Key Vault no Azure, um bucket S3, um tópico no GCP), uma aplicação normalmente precisa de uma chave de acesso guardada como segredo. A identidade da aplicação substitui essa chave: a plataforma emite para cada aplicação um token OIDC de curta duração, e o seu provedor de nuvem confia nesse token por federação de identidade.
Como funciona
- Cada região da plataforma tem um emissor OIDC próprio, no formato
https://oidc.<domínio>/<região>. O documento de descoberta (/.well-known/openid-configuration) e as chaves públicas (/jwks.json) ficam públicos nesse endereço. - Cada aplicação tem um subject fixo:
org:<id>:project:<id>:env:<id>:app:<nome>. Ele identifica a aplicação naquele ambiente, e nenhuma outra aplicação consegue obter um token com esse subject. - O pod recebe um token da própria conta de serviço em
/var/run/secrets/atlas.cloud/workload-identity/token, e o endereço da troca na variávelATLAS_WORKLOAD_IDENTITY_ENDPOINT. - A aplicação troca esse token por um JWT da plataforma (válido por até 15 minutos) e o apresenta ao provedor de nuvem.
- As chaves de assinatura ficam no cofre da plataforma e são rotacionadas periodicamente. O endereço de chaves publica a chave atual e a anterior, então um token emitido antes da rotação continua válido até expirar.
Configurar a aplicação
- No portal, abra a aplicação e a aba Identidade. Ela mostra o emissor, o subject exato e o endpoint da troca.
- Em Audiências permitidas, cadastre a audiência que o provedor espera (uma por linha, até 10). A troca recusa qualquer audiência fora dessa lista.
- Faça um novo deploy. O token da conta de serviço só é montado no pod quando a aplicação tem pelo menos uma audiência.
Ler a aba exige qualquer papel no projeto. Alterar as audiências exige o papel Developer ou acima, e a alteração fica registrada na auditoria.
Trocar o token
A troca segue o RFC 8693:
curl -s "$ATLAS_WORKLOAD_IDENTITY_ENDPOINT" \
-d grant_type=urn:ietf:params:oauth:grant-type:token-exchange \
-d subject_token_type=urn:ietf:params:oauth:token-type:jwt \
--data-urlencode subject_token@"$ATLAS_WORKLOAD_IDENTITY_TOKEN_FILE" \
-d audience=api://AzureADTokenExchange
A resposta traz access_token (o JWT), token_type (Bearer) e expires_in (em segundos). Erros voltam com status 400 e o campo error:
error | Causa |
|---|---|
unsupported_grant_type | grant_type diferente da troca de token. |
invalid_request | Faltou o token, o tipo do token está errado ou foi pedido o subject de outra aplicação. |
invalid_grant | O token da conta de serviço é inválido, expirou ou não é de uma aplicação. |
invalid_target | Audiência ausente ou não cadastrada para a aplicação. |
Peça um token novo antes de o anterior expirar; o token da conta de serviço no pod é renovado automaticamente.
Microsoft Entra ID
- No registro de aplicativo (ou na identidade gerenciada atribuída pelo usuário), abra Certificados e segredos › Credenciais federadas e adicione uma credencial do cenário Outro emissor.
- Informe o emissor e o identificador do subject mostrados na aba Identidade.
- Mantenha a audiência
api://AzureADTokenExchangee cadastre-a na aplicação. - Na aplicação, use o JWT como client assertion (por exemplo,
ClientAssertionCredentialdo Azure SDK).
AWS IAM
- Em IAM › Provedores de identidade, adicione um provedor OpenID Connect com a URL do emissor e a audiência
sts.amazonaws.com(ou outra de sua escolha, cadastrada na aplicação). - Crie uma role com política de confiança para esse provedor e a condição
<emissor sem https://>:subigual ao subject da aplicação. - Na aplicação, chame
AssumeRoleWithWebIdentitycom o JWT (ou aponteAWS_WEB_IDENTITY_TOKEN_FILEpara um arquivo com ele).
GCP Workload Identity Federation
- Crie um pool de identidades de carga de trabalho e um provedor OIDC com a URL do emissor e a audiência permitida cadastrada na aplicação.
- Mapeie
google.subject = assertion.sube conceda acesso ao principalprincipal://iam.googleapis.com/projects/<número>/locations/global/workloadIdentityPools/<pool>/subject/<subject>. - Na aplicação, troque o JWT no STS do Google ou use um arquivo de configuração de credenciais externas.
Limites
- O JWT vale no máximo 15 minutos.
- Até 10 audiências por aplicação.
- O emissor do cluster nunca é exposto: os provedores de nuvem só confiam no emissor da plataforma.