← Voltar para o blog

william@devops:~$ cat ./cases/eks-workload-identity.md

Segurança de Workloads no EKS:
Uma Identidade por Aplicação.

Como aplicações Kubernetes deixaram de depender de access keys estáticas para acessar serviços AWS por meio de IAM Roles for Service Accounts e permissões específicas.

CONFIDENCIALIDADE

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 PROJETO

Cada 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.

01

Código

Clientes AWS precisavam aceitar a identidade fornecida pelo ambiente.

02

Kubernetes

ServiceAccounts deveriam ser exclusivos e corretamente associados às aplicações.

03

IAM

Policies precisavam refletir o recurso e as ações realmente utilizadas.

04

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.

01WorkloadPod no EKS
02IdentidadeServiceAccount
03TokenOIDC projetado
04ValidaçãoAWS STS
05PermissãoIAM Role

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.

01

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.

service-account.yamlNAMESPACE BROWN
apiVersion: v1
kind: ServiceAccount
metadata:
  name: lab-test
  namespace: brown
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/lab-test-irsa
deployment.yamlKUBERNETES
apiVersion: 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.
02

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.

aws-client.tsPADRÃO
const client = new S3Client({
  region: process.env.AWS_REGION
});

// Sem accessKeyId ou secretAccessKey no código.
03

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.

04

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.

  1. 01

    Mapeamento

    Identificação das aplicações, caminhos, operações AWS e credenciais estáticas utilizadas.

  2. 02

    Infraestrutura

    Criação das roles, trust policies e ServiceAccounts por ambiente.

  3. 03

    Aplicação

    Ajuste dos clientes AWS para utilizar a cadeia padrão de credenciais.

  4. 04

    Validação

    Teste de inicialização, leitura, gravação e tratamento de acesso negado conforme o escopo.

  5. 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."
COMPARTILHAR IDEIAS

Quer conversar sobre Cloud, DevOps ou Platform Engineering?

Entrar em contato ↗