Como Exportar Logs de Auditoria do Kubernetes

Como Exportar Logs de Auditoria do Kubernetes

SOC Prime Team
SOC Prime Team linkedin icon Seguir

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

Comece Gratuitamente

Antes de começar

Está ativado?

PlataformaOnde verificar
Autogerido (kubeadm e similar)–audit-policy-file e –audit-log-path no servidor API; com kubeadm, em /etc/kubernetes/manifests/kube-apiserver.yaml
EKSCluster → Obsevabilidade → registro de plano de controle, tipo de log “audit”
AKSConfigurações de diagnóstico no cluster, categorias kube-audit ou kube-audit-admin
GKEAtivado 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çãoPor 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-adminEscalação de privilégio para controle total
get ou list em segredos por uma identidade incomumColeta de credenciais
Pods criados com privileged, hostPath ou hostNetworkUm passo em direção à fuga para o nó
user.username: system:anonymous com uma resposta 2xxAcesso anônimo que não deveria funcionar
Explosões de 403 de uma conta de serviçoUm token roubado testando suas permissões

Carregar, sanitizar e revisar no LogTotal

  1. Carregar. Abrir logtotal.com e soltar o arquivo .jsonl.
  2. Sanitizar. [what gets masked: usernames, service account names, source IPs, namespaces, object names]. Look it over before you continue.
  3. Revisar.

Quando dá errado

SintomaCausa provávelFix
Nenhum arquivo de auditoria no plano de controleServidor API não possui política de auditoria configuradaEsperado; configure-o para o futuro
Grupo de logs EKS ou fluxos de auditoria ausentesO tipo de log do plano de controle “audit” não está ativadoAtive-o para o futuro
Cada linha é uma longa string escapadaEncapsulamento do CloudWatchDesembrulhe com fromjson, como acima
Você pode ver quem alterou um pod, mas não comoPolítica está no nível MetadataAumente o nível para recursos sensíveis
Nenhuma leitura de segredo nos dados do AKSkube-audit-admin exclui get e listColete 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.

Junte-se à plataforma Detection as Code da SOC Prime para melhorar a visibilidade das ameaças mais relevantes para o seu negócio. Para ajudá-lo a começar e gerar valor imediato, agende uma reunião agora com os especialistas da SOC Prime.