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).
Zanim zaczniesz
Czy jest włączony?
| Platforma | Gdzie 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 |
| EKS | Klastrowanie → Obserwowalność → logowanie panelu kontrolnego, typ logu “audit” |
| AKS | Ustawienia diagnostyczne w klastrze, kategorie kube-audit lub kube-audit-admin |
| GKE | Włą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ć
| Żądanie | Dlaczego 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-admin | Eskalacja przywilejów do pełnej kontroli |
| get lub list na sekretach przez nietypową tożsamość | Zbieranie poświadczeń |
| Pody utworzone z privileged, hostPath lub hostNetwork | Krok w kierunku ucieczki na węzeł |
| user.username: system:anonymous z odpowiedzią 2xx | Anonimowy dostęp, który nie powinien działać |
| Wybuchy 403 z jednego konta usługowego | Ukradzione żetony sprawdzają swoje uprawnienia |
Prześlij, zdezynfekuj i przejrzyj w LogTotal
- Prześlij. Otwórz logtotal.com i wrzuć plik .jsonl.
- Zdezynfekuj. [what gets masked: usernames, service account names, source IPs, namespaces, object names]. Look it over before you continue.
- Przejrzyj.
Kiedy coś pójdzie źle
| Objaw | Prawdopodobna przyczyna | Fix |
|---|---|---|
| Brak pliku audytu na panelu kontrolnym | Serwer API nie ma skonfigurowanej polityki audytu | Oczekiwane; skonfiguruj to na przyszłość |
| Brak grupy logów EKS lub strumieni audytu | Typ dziennika panelu kontrolnego „audit” nie jest włączony | Włącz to na przyszłość |
| Każda linia jest jednym długim ciągiem escape’owanym | Owijanie CloudWatch | Rozwiń za pomocą fromjson, jak powyżej |
| Widzisz, kto zmienił pod, ale nie jak | Polityka jest na poziomie Metadata | Podnieś poziom dla wrażliwych zasobów |
| Brak odczytów sekretów w danych AKS | kube-audit-admin wyklucza get i list | Zbieraj 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.