Este estudo apresenta uma experiência profissional real de forma anonimizada. Nomes de empresas, contas, domínios, repositórios e detalhes sensíveis foram omitidos.
01 / CONTEXTO
A aplicação estava no Kubernetes, mas sua identidade ainda era uma access key.
Microsserviços executados no Amazon EKS precisavam acessar recursos como buckets S3 e secrets. O modelo inicial entregava AWS_ACCESS_KEY_IDe AWS_SECRET_ACCESS_KEY por variáveis de ambiente. Além de manter credenciais persistentes, isso vinculava a segurança do workload ao armazenamento correto de um secret.
A evolução adotou IRSA para associar uma IAM Role ao ServiceAccount de cada aplicação. Dessa forma, o pod passou a receber uma identidade temporária e controlada, sem guardar chaves da AWS no Kubernetes ou no código.
PRINCÍPIO DO PROJETOCada workload deve possuir identidade própria e acesso limitado à sua responsabilidade.
02 / DESAFIO
A infraestrutura estava pronta para o IRSA. A aplicação também precisava estar.
Remover as chaves do secret antes de ajustar o código faria a aplicação falhar. Alguns clientes AWS eram inicializados com credenciais explícitas e não utilizavam a cadeia padrão de credenciais do SDK. A migração precisou coordenar infraestrutura, manifests e aplicação.
Código
Clientes AWS precisavam aceitar a identidade fornecida pelo ambiente.
Kubernetes
ServiceAccounts deveriam ser exclusivos e corretamente associados às aplicações.
IAM
Policies precisavam refletir o recurso e as ações realmente utilizadas.
Transição
A remoção das chaves deveria ocorrer sem interromper os workloads.
03 / ARQUITETURA
Do ServiceAccount à sessão temporária da AWS.
O pod recebe um token projetado do Kubernetes vinculado ao seu ServiceAccount. O SDK da AWS utiliza esse token para solicitar ao STS uma sessão da IAM Role associada. A trust policy valida o provedor OIDC do cluster, o namespace e o nome do ServiceAccount antes de liberar o acesso.
KUBERNETESO ServiceAccount identifica o workload dentro do cluster.
IAMA role contém somente as ações autorizadas para a aplicação.
SDKA cadeia padrão obtém e renova as credenciais temporárias.
04 / IMPLEMENTAÇÃO
Infraestrutura e código precisavam falar o mesmo idioma.
ServiceAccount dedicado por aplicação
Cada aplicação recebeu um ServiceAccount específico. A anotação referencia a role correspondente, evitando que diferentes workloads compartilhem a mesma identidade sem necessidade.
apiVersion: v1
kind: ServiceAccount
metadata:
name: lab-test
namespace: brown
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/lab-test-irsaapiVersion: apps/v1
kind: Deployment
metadata:
name: lab-test
namespace: brown
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/name: lab-test
template:
metadata:
labels:
app.kubernetes.io/name: lab-test
spec:
serviceAccountName: lab-test
containers:
- name: lab-test
image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/lab-test:1.4.2-8f3a1c2
env:
- name: AWS_REGION
value: us-east-1
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
# Nenhuma access key é injetada no pod.SDK utilizando a cadeia padrão de credenciais
O bloco que exigia access key e secret key foi removido. O cliente passou a informar somente as configurações funcionais, permitindo que o SDK identificasse automaticamente a credencial temporária disponibilizada ao pod.
const client = new S3Client({
region: process.env.AWS_REGION
});
// Sem accessKeyId ou secretAccessKey no código.Permissão mínima no recurso correto
As policies foram construídas por prefixo e por operação. Uma aplicação que grava objetos não recebe automaticamente permissão para listar o bucket inteiro, excluir outros caminhos ou administrar a configuração do serviço.
Preservação das fronteiras existentes
O IRSA foi aplicado sem ampliar permissões de bucket ou alterar o modelo privado de distribuição. Identidade do workload e política de acesso da origem continuaram como controles complementares.
05 / MIGRAÇÃO
A retirada das chaves aconteceu somente depois da validação ponta a ponta.
- 01
Mapeamento
Identificação das aplicações, caminhos, operações AWS e credenciais estáticas utilizadas.
- 02
Infraestrutura
Criação das roles, trust policies e ServiceAccounts por ambiente.
- 03
Aplicação
Ajuste dos clientes AWS para utilizar a cadeia padrão de credenciais.
- 04
Validação
Teste de inicialização, leitura, gravação e tratamento de acesso negado conforme o escopo.
- 05
Remoção
Exclusão das variáveis e secrets de access key após a confirmação do novo fluxo.
06 / RESULTADOS
Segurança aplicada no nível do workload.
Os benefícios abaixo são qualitativos e refletem a evolução do modelo de identidade, sem atribuir métricas não comprovadas.
Fim das access keys na aplicação com credenciais temporárias entregues pelo ambiente.
Isolamento por workload utilizando ServiceAccounts e roles específicas.
Menor privilégio aplicado por ação, recurso e prefixo necessário.
Rotação automática das sessões sem intervenção das squads ou armazenamento manual.
Melhor diagnóstico porque falhas de código, identidade e autorização ficam separadas.
07 / APRENDIZADOS
IRSA não é apenas uma configuração do cluster.
Uma migração segura exige alinhamento entre três camadas: a role criada na AWS, o ServiceAccount usado pelo deployment e o cliente AWS inicializado pela aplicação. Se uma delas continuar esperando credenciais estáticas, o modelo não se completa.
O melhor resultado surgiu ao tratar identidade como parte da arquitetura da aplicação. Isso permitiu remover secrets sensíveis sem perder clareza sobre qual serviço pode acessar cada recurso.
william@devops:~$ echo $LESSON_LEARNED
"No Kubernetes, segurança ganha escala quando cada aplicação recebe uma identidade própria — e nada além dela."