Jak eksportować dzienniki audytowe Kubernetes

Jak eksportować dzienniki audytowe Kubernetes

SOC Prime Team
SOC Prime Team linkedin icon Śledź

Gdzie znajdują się dzienniki audytów Kubernetes, zależy od tego, kto zarządza twoim panelem kontrolnym. Na klastrze zarządzanym lokalnie są one plikiem JSON-lines na węźle panelu kontrolnego, w ścieżce wskazywanej przez –audit-log-path. Na EKS trafiają do CloudWatch Logs, na AKS do przestrzeni roboczej Log Analytics lub konta magazynu, a na GKE do Cloud Audit Logs. Jedna rzecz wszędzie się zgadza: audytowanie musi być włączone. Na klastrach zarządzanych lokalnie i EKS jest wyłączone, dopóki ktoś tego nie włączy.

Dziennik audytu rejestruje każde żądanie do API Kubernetes: kto uruchomił kubectl exec do którego poda, kto przeczytał jaki sekret, kto przypisał się do cluster-admin. Prime Core ma 93 reguły detekcji dla danych audytowych Kubernetes, przypisane do 220 technik MITRE ATT&CK. Wśród nich: exec do działających kontenerów (T1609), wdrażanie nieautoryzowanych kontenerów (T1610) i czytanie poświadczeń przez API kontenery (T1552.007).

Rozpocznij bezpłatnie

Zanim zaczniesz

Czy jest włączony?

PlatformaGdzie sprawdzić
Zarządzany samodzielnie (kubeadm i podobne)–audit-policy-file i –audit-log-path na serwerze API; w kubeadm, w /etc/kubernetes/manifests/kube-apiserver.yaml
EKSKlastrowanie → Obserwowalność → logowanie panelu kontrolnego, typ logu “audit”
AKSUstawienia diagnostyczne w klastrze, kategorie kube-audit lub kube-audit-admin
GKEWłączone domyślnie dla działań Administratora; logowanie dostępu do danych dla Kubernetes na zasadzie opt-in

Jeśli nie było włączone, nie ma nic do wyeksportowania z przeszłości i reszta tego przewodnika dotyczy przyszłości.

Szczegóły zależą od polityki. Na poziomie Metadata widzisz, kto co zrobił w którym obiekcie. Na poziomach Request lub RequestResponse widzisz także treści, na przykład specyfikację poda, który zażądał privileged: true. Wiedz, który poziom masz, zanim zaczniesz szukać.

Oczekuj dużej ilości danych. Kontrolery i konta usługowe ciągle rozmawiają z API. Na AKS kube-audit-admin pomija tylko do-odczytu get i list, co sprawia, że rozmiar jest rozsądny, ale także ukrywa czytanie sekretów.

Eksportuj to

Klaster samodzielnie zarządzany, na węźle panelu kontrolnego:

# najpierw potwierdź ścieżkę

sudo grep -- '--audit-log-path' /etc/kubernetes/manifests/kube-apiserver.yaml


sudo cat /var/log/kubernetes/audit/audit.log > k8s_audit.jsonl

Obok niego znajdują się pliki rotowane (z –audit-log-maxbackup) z nazwą zawierającą znacznik czasu. Uwzględnij je, jeśli okno sięga wstecz.

EKS, z 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

Każde zdarzenie CloudWatch zawija wpis audytu jako łańcuch; fromjson go rozwija. Syntax date -d jest GNU; na macOS, oblicz znaczniki czasu w milisekundach w inny sposób.

AKS, z Log Analytics (tabele specyficzne dla zasobów):

az monitor log-analytics query -w  

--analytics-query "AKSAuditAdmin | where TimeGenerated between (datetime(2026-10-19) .. datetime(2026-10-20))"

--output json > aks_audit_1019.json

GKE, z 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

Czego szukać

ŻądanieDlaczego to ma znaczenie
twórz na pods/exec (objectRef.subresource: exec)Ktoś otworzył powłokę wewnątrz działającego kontenera
tworzenie ClusterRoleBinding do cluster-adminEskalacja przywilejów do pełnej kontroli
get lub list na sekretach przez nietypową tożsamośćZbieranie poświadczeń
Pody utworzone z privileged, hostPath lub hostNetworkKrok w kierunku ucieczki na węzeł
user.username: system:anonymous z odpowiedzią 2xxAnonimowy dostęp, który nie powinien działać
Wybuchy 403 z jednego konta usługowegoUkradzione żetony sprawdzają swoje uprawnienia

Prześlij, zdezynfekuj i przejrzyj w LogTotal

  1. Prześlij. Otwórz logtotal.com i wrzuć plik .jsonl.
  2. Zdezynfekuj. [what gets masked: usernames, service account names, source IPs, namespaces, object names]. Look it over before you continue.
  3. Przejrzyj.

Kiedy coś pójdzie źle

ObjawPrawdopodobna przyczynaFix
Brak pliku audytu na panelu kontrolnymSerwer API nie ma skonfigurowanej polityki audytuOczekiwane; skonfiguruj to na przyszłość
Brak grupy logów EKS lub strumieni audytuTyp dziennika panelu kontrolnego „audit” nie jest włączonyWłącz to na przyszłość
Każda linia jest jednym długim ciągiem escape’owanymOwijanie CloudWatchRozwiń za pomocą fromjson, jak powyżej
Widzisz, kto zmienił pod, ale nie jakPolityka jest na poziomie MetadataPodnieś poziom dla wrażliwych zasobów
Brak odczytów sekretów w danych AKSkube-audit-admin wyklucza get i listZbieraj kube-audit, jeśli ich potrzebujesz

FAQ

Czy logi kontenerów nie wystarczą?

Nie. Logi kontenerów pokazują, co aplikacja wydrukowała. Dziennik audytu pokazuje, co ludzie i konta usługowe zrobili w klastrze. Różne pytania, różne logi.

Czy mogę przeczytać plik audytu na zarządzanym klastrze?

Nie. Na EKS, AKS i GKE nie masz dostępu do węzłów panelu kontrolnego. Usługa logowania dostawcy to jedyna droga.

Dołącz do platformy Detection as Code firmy SOC Prime aby zwiększyć widoczność zagrożeń najbardziej istotnych dla Twojego biznesu. Aby pomóc Ci rozpocząć i natychmiast uzyskać wartość, umów się teraz na spotkanie z ekspertami SOC Prime.