Dois novos recursos que simplificam o gerenciamento de segredos na AWS
A AWS publicou um guia detalhado sobre dois novos recursos do AWS Workload Credentials Provider: o encadeamento de funções IAM para acesso a segredos entre contas diferentes, e o pré-carregamento de segredos para reduzir a latência de inicialização das aplicações. Este post é uma releitura educativa desse conteúdo para o público brasileiro.
O que é o AWS Workload Credentials Provider?
O AWS Secrets Manager é o serviço responsável por armazenar e rotacionar credenciais, chaves de API e outros segredos. Já o AWS Workload Credentials Provider é um serviço HTTP do lado do cliente que recupera e armazena em cache esses segredos localmente. Essa abordagem reduz a latência, melhora a disponibilidade em caso de falhas transitórias e diminui os custos operacionais.
Entre as características do provider, destacam-se: suporte a TLS pós-quântico por padrão, ausência de dependência de SDKs específicos por linguagem e compatibilidade com Amazon Elastic Compute Cloud (Amazon EC2), Amazon Elastic Container Service (Amazon ECS), Amazon Elastic Kubernetes Service (Amazon EKS) e AWS Lambda. Mais detalhes estão disponíveis na documentação oficial e no repositório no GitHub.
Considerações de segurança
O provider utiliza um token SSRF (Falsificação de Requisição do Lado do Servidor — SSRF) para impedir que processos não autorizados acessem seu endpoint HTTP. Apenas aplicações que consigam ler o arquivo do token podem recuperar segredos pelo provider.
Qualquer identidade que tenha acesso ao endpoint do provider e ao token SSRF pode recuperar segredos via encadeamento de funções. Isso significa que usuários com acesso ao ambiente de computação podem recuperar segredos de outras contas quando a assunção de função estiver configurada. Por isso, a AWS recomenda seguir o princípio do menor privilégio, limitando as permissões da função-alvo apenas aos segredos necessários.
No caso do pré-carregamento, os segredos são carregados no cache em memória do provider na inicialização. Qualquer processo que consiga alcançar o endpoint localhost e fornecer um token SSRF válido poderá recuperar esses segredos do cache.
Acesso a segredos entre contas com encadeamento de funções
Organizações frequentemente armazenam segredos em uma conta AWS dedicada ou precisam compartilhar um mesmo segredo entre aplicações em contas diferentes. Até recentemente, o acesso entre contas pelo provider exigia a criação de políticas baseadas em recursos diretamente em cada segredo. Alguns times preferem trabalhar com assunção de funções IAM — e era necessário implantar múltiplas instâncias do provider ou construir lógica customizada de troca de credenciais.
Agora, o provider suporta as duas abordagens: políticas baseadas em recursos e assunção de funções via AWS Security Token Service (AWS STS). Quando o parâmetro roleArn é incluído na requisição, o provider usa o AssumeRole do AWS STS para obter credenciais temporárias e recuperar o segredo com essas credenciais. O provider cria e armazena em cache um cliente separado para cada ARN de função, reutilizando-o nas requisições subsequentes — e cada cliente de função mantém seu próprio cache independente.
Importante: a conta de origem executa o Workload Credentials Provider e a aplicação; a conta de destino contém o segredo a ser recuperado. Uma única instância do provider na conta de origem pode assumir funções em uma ou mais contas de destino.
Pré-requisitos
- O Workload Credentials Provider compilado e instalado no ambiente
- Credenciais AWS configuradas no ambiente de computação com permissão para chamar
sts:AssumeRoleno ARN da função-alvo - Se também recuperar segredos da conta de origem pelo provider, as credenciais precisam ter as permissões
secretsmanager:GetSecretValueesecretsmanager:DescribeSecretpara esses segredos - Um segredo em uma conta AWS de destino
- Uma função IAM na conta de destino com política de confiança que permita à identidade do provider assumi-la
Como compilar o Workload Credentials Provider
O provider é escrito em Rust e compila para um único executável. Os passos a seguir são para sistemas baseados em RPM, como o Amazon Linux 2023:
Instale as dependências de compilação:
sudo yum -y groupinstall "Development Tools"
Instale o Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
Clone o repositório e compile o provider (use a tag mais recente disponível):
git clone --branch <git tag> https://github.com/aws/aws-workload-credentials-provider.git
cd aws-workload-credentials-provider
cargo build --release
O binário compilado estará em target/release/aws-workload-credentials-provider.
Como instalar o Workload Credentials Provider no Amazon EC2
Após compilar o provider, instale-o como serviço de sistema na instância EC2 e configure o acesso ao token SSRF. Após configurar o arquivo config.toml, execute o script de instalação para implantar o provider como serviço systemd e gerar o token SSRF:
cd aws_workload_credentials_provider_common/configuration
sudo ./install --config config.toml
Adicione o usuário da aplicação ao grupo aws-wcp-token para conceder permissão de leitura do arquivo do token SSRF:
sudo usermod -aG aws-wcp-token <APP_USER>
Para instalação no Amazon ECS, Amazon EKS ou Lambda, consulte as instruções de instalação no repositório do GitHub.
Verificando a instalação
Verifique se o provider está em execução:
curl -v -H \
"X-Aws-Parameters-Secrets-Token: $(
Você receberá uma resposta JSON com o valor do segredo. Se aparecer erro de conexão recusada, verifique se o processo do provider está em execução. Se aparecer erro 401 ou 403, verifique se o arquivo do token SSRF é legível e se as credenciais IAM do provider possuem as permissões secretsmanager:GetSecretValue e secretsmanager:DescribeSecret.
Permissões necessárias e configuração das funções IAM
A identidade IAM base do provider precisa de: sts:AssumeRole no ARN da função-alvo. A função-alvo precisa de: secretsmanager:GetSecretValue e secretsmanager:DescribeSecret.
Configurando a função IAM na conta de destino
Crie uma função IAM na conta de destino com uma política de confiança que permita à identidade do provider na conta de origem assumi-la:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/WCProviderRole"
},
"Action": "sts:AssumeRole"
}
]
}
Em seguida, anexe uma política a essa função que conceda acesso ao segredo:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
"Resource": "arn:aws:secretsmanager:us-east-1:222222222222:secret:MyDatabaseSecret"
}
]
}
Configurando a função IAM na conta de origem
Antes que o provider possa assumir a função criada na conta de destino, é necessário conceder permissão para chamar sts:AssumeRole. Anexe a seguinte política à função IAM do provider na conta de origem:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::222222222222:role/CrossAccountSecretAccessRole"
}
]
}
Como recuperar o segredo entre contas
Chame o endpoint do provider com o parâmetro roleArn. O exemplo com curl abaixo mostra como recuperar um segredo usando uma função IAM diferente:
curl -v -H "X-Aws-Parameters-Secrets-Token: $(
O mesmo pode ser feito com Python:
import requests
def get_secret_cross_account():
role_arn = "arn:aws:iam::222222222222:role/CrossAccountSecretAccessRole"
url = f"http://localhost:2773/secretsmanager/get?secretId=MyDatabaseSecret&roleArn={role_arn}"
with open('/var/run/awssmatoken') as fp:
token = fp.read()
headers = {
"X-Aws-Parameters-Secrets-Token": token.strip()
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
else:
raise Exception(f"Status code {response.status_code} - {response.text}")
O número máximo de funções assumidas simultaneamente pode ser configurado com a opção max_roles no arquivo de configuração TOML do provider. O padrão é 20, com intervalo de 1 a 20.
Pré-carregamento de segredos na inicialização
Por padrão, o Workload Credentials Provider popula seu cache de forma preguiçosa (lazy) — a primeira requisição por um segredo dispara uma chamada de rede ao Secrets Manager. O pré-carregamento (prefetching) reduz essa latência de cold-start ao carregar os segredos durante a inicialização do provider.
Como o pré-carregamento funciona
O pré-carregamento é configurado adicionando uma seção [capabilities.secrets_manager.prefetch] ao arquivo de configuração TOML do provider. Há duas formas de especificar os segredos a serem pré-carregados:
- Segredos explícitos — liste IDs ou ARNs específicos usando entradas
[[capabilities.secrets_manager.prefetch.secrets]]. - Descoberta por tag — descubra segredos por chave de tag usando entradas
[[capabilities.secrets_manager.prefetch.filter_tags]]. O provider chamaBatchGetSecretValuecom filtros de chave de tag para encontrar e armazenar em cache todos os segredos correspondentes.
Os dois métodos podem ser usados em conjunto. Cada entrada aceita opcionalmente um campo role_arn para pré-carregamento entre contas via encadeamento de funções.
Permissões necessárias para o pré-carregamento
secretsmanager:BatchGetSecretValue— necessário na função da conta de origem para segredos locais, ou na função-alvo para segredos entre contassecretsmanager:ListSecrets— necessário ao usar descoberta por tag (filter_tags), na função que realiza a descoberta
Opções de configuração do pré-carregamento
As seguintes opções estão disponíveis na seção [capabilities.secrets_manager.prefetch] do arquivo de configuração TOML:
cache_buffer_ratio— fração máxima do cache a ser preenchida por cliente de cache durante o pré-carregamento, no intervalo de 0,1 a 1,0. O padrão é 0,8. Por exemplo, se o cache suporta 100 segredos, uma razão de 0,8 pré-carrega até 80, deixando espaço para 20 segredos sob demanda.max_jitter_seconds— atraso aleatório máximo em segundos antes de iniciar a tarefa de pré-carregamento, no intervalo de 0 a 10. O padrão é 0 (sem jitter). Use esse parâmetro para evitar chamadas de API sincronizadas em toda a frota ao implantar em muitas instâncias.
Exemplo: pré-carregamento com segredos explícitos
A configuração abaixo pré-carrega dois segredos na inicialização — um da conta de origem e outro de uma conta diferente via encadeamento de funções:
[capabilities.secrets_manager.prefetch]
secrets = [
{ secret_id = "arn:aws:secretsmanager:us-east-1:111111111111:secret:MySecret-AbCdEf" },
{ secret_id = "cross-account-secret", role_arn = "arn:aws:iam::222222222222:role/CrossAccountSecretAccessRole" }
]
Exemplo: pré-carregamento com descoberta por tag
A configuração abaixo descobre e armazena em cache todos os segredos com a chave de tag Environment, e todos os segredos com a chave Team em uma conta diferente:
[capabilities.secrets_manager.prefetch]
filter_tags = [
{ key = "Environment" },
{ key = "Team", role_arn = "arn:aws:iam::222222222222:role/CrossAccountSecretAccessRole" },
]
Exemplo: configuração completa
O exemplo abaixo mostra uma configuração completa do provider combinando os dois recursos:
[logging]
log_level = "info"
[capabilities.secrets_manager]
http_port = 2773
region = "us-east-1"
[capabilities.secrets_manager.cache]
ttl_seconds = 300
[capabilities.secrets_manager.prefetch]
cache_buffer_ratio = 0.6
max_jitter_seconds = 5
secrets = [
{ secret_id = "arn:aws:secretsmanager:us-east-1:111111111111:secret:MySecret-AbCdEf" },
{ secret_id = "arn:aws:secretsmanager:us-east-1:222222222222:secret:CrossAccount-AbCdEf", role_arn = "arn:aws:iam::222222222222:role/CrossAccountSecretAccessRole" },
]
filter_tags = [
{ key = "Environment" },
{ key = "Team", role_arn = "arn:aws:iam::222222222222:role/CrossAccountSecretAccessRole" },
]
Para iniciar o provider com o arquivo de configuração:
./aws-workload-credentials-provider sm start --config config.toml
Conclusão
O encadeamento de funções simplifica arquiteturas multi-conta: uma única instância do provider consegue recuperar segredos entre contas usando assunção de funções IAM, sem necessidade de múltiplas instâncias ou lógica customizada de troca de credenciais. Já o pré-carregamento elimina a latência de cold-start ao popular o cache antes da primeira requisição da aplicação. Combinados, esses dois recursos tornam o Workload Credentials Provider uma solução mais robusta para ambientes distribuídos que exigem acesso rápido e seguro a segredos em múltiplas contas AWS.
Para saber mais, acesse a documentação do AWS Workload Credentials Provider, o guia sobre acesso a segredos do AWS Secrets Manager a partir de outra conta, o repositório no GitHub com o código-fonte e o README, e a documentação do AWS Secrets Manager.
Fonte
How to use the AWS Workload Credentials Provider for cross-account secret retrieval and prefetching secrets (https://aws.amazon.com/blogs/security/how-to-use-the-aws-workload-credentials-provider-for-cross-account-secret-retrieval-and-prefetching-secrets/)
Leave a Reply