Conceitos · Segurança

Audit Logging

Registro de todas as requisições à API Server. Quem fez o quê, quando e em qual recurso. Essencial para compliance (SOC2, PCI-DSS) e investigação pós-incidente.

O que um evento de audit contém

{
  "kind": "Event",
  "apiVersion": "audit.k8s.io/v1",
  "level": "Metadata",
  "timestamp": "2024-01-15T10:23:45Z",
  "user": {
    "username": "arn:aws:iam::123456:user/joao",  // quem fez
    "groups": ["system:authenticated"]
  },
  "verb": "delete",              // o que fez
  "objectRef": {
    "resource": "deployments",   // em qual recurso
    "namespace": "production",
    "name": "meu-app"
  },
  "responseStatus": { "code": 200 },
  "sourceIPs": ["10.0.1.55"],
  "userAgent": "kubectl/v1.28"
}

Níveis de Auditoria

NoneNão logar este evento.
MetadataLogar metadados da requisição: usuário, timestamp, recurso, verb. Sem body de request/response. O mais eficiente.
RequestLogar metadados + body da requisição. Sem body da resposta.
RequestResponseLogar tudo: metadados, body da requisição E da resposta. Muito verboso — use apenas para recursos críticos.

Stages de uma Requisição

RequestReceived

Requisição chegou na API Server, antes de ser processada.

ResponseStarted

Headers da resposta foram enviados, body ainda não. Só para long-running (watch).

ResponseComplete

Resposta foi completamente enviada. O stage mais comum para logar.

Panic

Panic interno na API Server. Sempre logado.

Audit Logging no EKS

No EKS, os logs de auditoria da API Server vão para o CloudWatch Logs automaticamente quando habilitados no Control Plane Logging. Você não gerencia a política de audit — a AWS usa uma política padrão.

HABILITAR NO EKS
aws eks update-cluster-config \
  --name meu-cluster \
  --logging '{"clusterLogging":[{
    "types": ["audit","api","authenticator"],
    "enabled": true
  }]}'
CONSULTAR LOGS COM CLOUDWATCH INSIGHTS
# Log group: /aws/eks/<cluster>/cluster
# Stream: kube-apiserver-audit-*

fields @timestamp, @message
| filter @logStream like /audit/
| filter verb = "delete"
| filter objectRef.namespace = "production"
| sort @timestamp desc
| limit 50
💡 Investigação de incidente: Use os audit logs para responder: "quem deletou o deployment de produção às 14h?" ou "qual pod estava criando secrets suspeitos?". É a única fonte de verdade para isso no cluster.

O que monitorar nos audit logs

🗑️Deleções em produção

verb=delete em namespaces de prod — quem deletou o quê

🔑Acesso a Secrets

verb=get/list em secrets — detectar acesso não autorizado

🛡️Mudanças em RBAC

Criação/modificação de Role, ClusterRole, Bindings

exec em pods

verb=create em pods/exec — quem entrou em qual container

👤Usuários anônimos

user.username=system:anonymous — requisições não autenticadas

🚨Erros 403/401

responseStatus.code=403 — tentativas de acesso negado