Onde os logs de auditoria do Kubernetes estão depende de quem opera seu plano de controle. Em um cluster autogerido, eles são arquivos JSON-lines no nó do plano de controle, no caminho apontado por –audit-log-path. No EKS, eles vão para CloudWatch Logs, no AKS para um workspace do Log Analytics ou conta de armazenamento, e no GKE para Cloud Audit Logs. Algo é comum a todos: a auditoria deve estar ativada. Em clusters autogeridos e EKS, ela está desativada até que alguém a ative.
O log de auditoria registra cada solicitação para a API Kubernetes: quem executou kubectl exec em qual pod, quem leu qual segredo, quem se vinculou ao admin do cluster. O Prime Core possui 93 regras de detecção para dados de auditoria do Kubernetes, mapeadas para 220 técnicas do MITRE ATT&CK. Entre elas: exec em contêineres em execução (T1609), implantação de contêineres rogue (T1610) e leitura de credenciais através da API do contêiner (T1552.007).
Antes de começar
Está ativado?
| Plataforma | Onde verificar |
|---|---|
| Autogerido (kubeadm e similar) | –audit-policy-file e –audit-log-path no servidor API; com kubeadm, em /etc/kubernetes/manifests/kube-apiserver.yaml |
| EKS | Cluster → Obsevabilidade → registro de plano de controle, tipo de log “audit” |
| AKS | Configurações de diagnóstico no cluster, categorias kube-audit ou kube-audit-admin |
| GKE | Ativado por padrão para Atividade de Admin; o registro de Acesso a Dados para Kubernetes é opcional |
Se não estava ativado, não há nada para exportar do passado, e o resto deste guia é sobre a próxima vez.
Detalhe depende da política. No nível Metadata você vê quem fez o quê em qual objeto. Nos níveis Request ou RequestResponse você também vê os corpos, por exemplo, a especificação do pod que solicitou privilégio: verdadeiro. Saiba qual você tem antes de procurar.
Espere volume. Controladores e contas de serviço falam com a API constantemente. No AKS, kube-audit-admin omite chamadas get e list apenas para leitura, o que mantém o tamanho razoável mas também esconde leituras de segredos.
Exporte-o
Cluster autogerido, em um nó do plano de controle:
# confirme o caminho primeiro
sudo grep -- '--audit-log-path' /etc/kubernetes/manifests/kube-apiserver.yaml
sudo cat /var/log/kubernetes/audit/audit.log > k8s_audit.jsonl
Arquivos rotacionados (de –audit-log-maxbackup) ficam ao lado com um timestamp no nome. Inclua-os se a janela for abrangente.
EKS, do CloudWatch Logs:
aws logs filter-log-events --log-group-name /aws/eks/my-cluster/cluster
--log-stream-name-prefix kube-apiserver-audit
--start-time $(date -d '2026-10-19T00:00:00Z' +%s000) --end-time $(date -d '2026-10-20T00:00:00Z' +%s000)
--output json | jq -c '.events[].message | fromjson' > eks_audit_1019.jsonl
Cada evento do CloudWatch encapsula a entrada de auditoria como uma string; fromjson a desembrulha. A sintaxe date -d é GNU; no macOS, compute os timestamps em milissegundos de outra maneira.
AKS, do Log Analytics (tabelas específicas de recursos):
az monitor log-analytics query -w <workspace-id>
--analytics-query "AKSAuditAdmin | where TimeGenerated between (datetime(2026-10-19) .. datetime(2026-10-20))"
--output json > aks_audit_1019.json
GKE, do Cloud Audit Logs:
gcloud logging read 'resource.type="k8s_cluster" AND logName:"cloudaudit.googleapis.com" AND timestamp>="2026-10-19T00:00:00Z" AND timestamp<"2026-10-20T00:00:00Z"'
--project=my-project --format=json | jq -c '.[]' > gke_audit_1019.jsonl
O que procurar
| Solicitação | Por que importa |
|---|---|
| criar em pods/exec (objectRef.subresource: exec) | Alguém abriu um shell dentro de um contêiner em execução |
| criação de um ClusterRoleBinding para cluster-admin | Escalação de privilégio para controle total |
| get ou list em segredos por uma identidade incomum | Coleta de credenciais |
| Pods criados com privileged, hostPath ou hostNetwork | Um passo em direção à fuga para o nó |
| user.username: system:anonymous com uma resposta 2xx | Acesso anônimo que não deveria funcionar |
| Explosões de 403 de uma conta de serviço | Um token roubado testando suas permissões |
Carregar, sanitizar e revisar no LogTotal
- Carregar. Abrir logtotal.com e soltar o arquivo .jsonl.
- Sanitizar. [what gets masked: usernames, service account names, source IPs, namespaces, object names]. Look it over before you continue.
- Revisar.
Quando dá errado
| Sintoma | Causa provável | Fix |
|---|---|---|
| Nenhum arquivo de auditoria no plano de controle | Servidor API não possui política de auditoria configurada | Esperado; configure-o para o futuro |
| Grupo de logs EKS ou fluxos de auditoria ausentes | O tipo de log do plano de controle “audit” não está ativado | Ative-o para o futuro |
| Cada linha é uma longa string escapada | Encapsulamento do CloudWatch | Desembrulhe com fromjson, como acima |
| Você pode ver quem alterou um pod, mas não como | Política está no nível Metadata | Aumente o nível para recursos sensíveis |
| Nenhuma leitura de segredo nos dados do AKS | kube-audit-admin exclui get e list | Colete kube-audit se precisar deles |
FAQ
Os logs de contêiner não são suficientes?
Não. Logs de contêiner mostram o que uma aplicação imprimiu. O log de auditoria mostra o que pessoas e contas de serviço fizeram ao cluster. Questões diferentes, logs diferentes.
Posso ler o arquivo de auditoria em um cluster gerenciado?
Não. No EKS, AKS e GKE, você não tem acesso aos nós do plano de controle. O serviço de logging do provedor é a única rota.