Auf dieser Seite wird die Audit-Logging-Richtlinie für Google Kubernetes Engine (GKE) erläutert. Eine Anleitung zum Aktivieren und Aufrufen der verschiedenen Arten von Audit-Logs sowie der erforderlichen IAM-Berechtigungen finden Sie unter Informationen zum GKE-Audit-Logging.
Vorbereitung
Machen Sie sich vor dem Lesen dieser Seite mit den folgenden Themen vertraut:
Übersicht
In einem GKE-Cluster schreibt der Kubernetes API-Server Audit-Logeinträge in ein von GKE verwaltetes Backend. Wenn GKE Logeinträge vom Kubernetes API-Server erhält, werden diese in das Administratoraktivitätslog und das Datenzugriffslog Ihres Projekts geschrieben.
Der Inhalt des Audit-Logs Ihres Projekts hängt von zwei Richtlinien ab:
In der Audit-Richtlinie in Kubernetes ist definiert, welche Ereignisse als Logeinträge erfasst werden. Darin ist auch festgelegt, welche Daten die Logeinträge enthalten sollen.
In der GKE-Audit-Richtlinie ist angegeben, welche Einträge jeweils in das Administratoraktivitätslog und das Datenzugriffslog geschrieben werden.
Welche Audit-Logs in Ihr Datenzugriffslog geschrieben werden, hängt von der Konfiguration des Audit-Logs ab. Für Datenzugriffslogs gelten die Preise für Google Cloud Observability. Administratoraktivitäts-Logs sind kostenlos. GKE unterstützt die folgenden Arten von Datenzugriffslogs.
ADMIN_READ
: Vorgänge, die Metadaten zu Kubernetes-Ressourcen lesen, z. B. das Auflisten von Pods.DATA_READ
: Vorgänge, bei denen Daten in Kubernetes-Ressourcen gelesen werden, z. B. das Lesen der Logs für einen Pod.DATA_WRITE
: Vorgänge, die Daten in Kubernetes-Ressourcen schreiben, z. B. das Aktualisieren des Pod-Status.
Weitere Informationen finden Sie unter Audit-Logs zum Datenzugriff konfigurieren.
Audit-Richtlinie in Kubernetes
Der Kubernetes API-Server unterliegt einer Richtlinie, die im Flag --audit-policy-file
des Befehls kube-apiserver angegeben ist.
Wenn GKE den Kubernetes API-Server startet, wird eine Audit-Richtliniendatei durch Festlegung eines Werts für das Flag --audit-policy-file
bereitgestellt. Im Open-Source-Repository von Kubernetes finden Sie das Skript configure-helper.sh für die Generierung der Audit-Richtliniendatei. Den Großteil der Audit-Richtliniendatei sehen Sie direkt im Skript.
Ereignisse und Phasen
Wenn ein Nutzer oder eine Komponente eine Anfrage an den Kubernetes API-Server sendet, durchläuft die Anfrage eine oder mehrere Phasen:
Phase | Beschreibung |
---|---|
RequestReceived | Der Audit-Handler hat die Anfrage erhalten. |
ResponseStarted | Die Antwortheader wurden ohne den Antworttext gesendet. |
ResponseComplete | Der Antworttext wurde fertiggestellt und es werden keine weiteren Byte gesendet. |
Panic | Die Anfrage wurde aufgrund eines internen Serverfehlers nicht abgeschlossen. |
In jeder Phase einer Anfrage wird ein Ereignis generiert und gemäß einer Richtlinie verarbeitet. Die Richtlinie gibt an, ob und mit welchen Daten das Ereignis als Logeintrag erfasst werden soll.
Audit-Ebenen
Die Audit-Richtliniendatei in Kubernetes enthält eine Liste mit Regeln. Die Audit-Ebene des Ereignisses wird durch die erste Regel in der Richtliniendatei festgelegt, die mit einem Ereignis übereinstimmt.
Folgende Audit-Ebenen können durch Regeln festgelegt werden:
Ebene | Beschreibung |
---|---|
– | Für das Ereignis wird kein Logeintrag erstellt. |
Metadaten | Ein Logeintrag wird erstellt. Metadaten werden einbezogen, während der Anfrage- und Antworttext ausgeschlossen sind. |
Anfrage | Ein Logeintrag wird erstellt. Metadaten und der Anfragetext werden einbezogen, während der Antworttext ausgeschlossen ist. |
RequestResponse | Ein Logeintrag wird erstellt. Metadaten sowie der Anfrage- und Antworttext werden einbezogen. |
Hier ein Beispiel für eine Regel. Wenn ein Ereignis mit der Regel übereinstimmt, erstellt der Kubernetes API-Server einen Logeintrag auf der Ebene Request
.
- level: Request userGroups: ["system:nodes"] verbs: ["update","patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived"
Ein Ereignis stimmt mit der Regel überein, wenn alle folgenden Bedingungen erfüllt sind:
- Das Ereignis stimmt nicht mit einer vorherigen Regel in der Richtliniendatei überein.
- Die Identität, die den Aufruf tätigt, befindet sich in der Nutzergruppe
system:nodes
. - Der Aufruf ist eine Anfrage vom Typ
update
oderpatch
. - Die Anfrage erfolgt an eine Ressource vom Typ
nodes/status
oderpods/status
. - Das Ereignis bezieht sich nicht auf die Aufrufphase
RequestReceived
.
Zusammenfassung der Audit-Richtlinie von Kubernetes für GKE-Cluster
Generell werden Schreibanfragen wie
create
,update
unddelete
auf der EbeneRequestResponse
geloggt.Generell werden Schreibanfragen wie
get
,list
undwatch
auf der EbeneMetadata
geloggt.Manche Ereignisse werden als Sonderfälle behandelt. Eine aktuelle Liste der als Sonderfälle geltenden Anfragen finden Sie im Richtlinienskript. Zum Zeitpunkt der Veröffentlichung dieser Informationen gibt es folgende Sonderfälle:
Update- und Patch-Anfragen von
kubelet
,system:node-problem-detector
odersystem:serviceaccount:kube-system:node-problem-detector
an eine Ressource vom Typnodes/status
oderpods/status
werden auf Anfrageebene geloggt.Update- und Patch-Anfragen von einer Identität in der Gruppe
system:nodes
an eine Ressource vom Typnodes/status
oderpods/status
werden auf der Anfrageebene geloggt.Anfragen vom Typ
deletecollection
vonsystem:serviceaccount:kube-system:namespace-controller
werden auf der Anfrageebene geloggt.Anfragen an eine Ressource vom Typ
secrets
Ressource,configmaps
odertokenreviews
werden auf der Metadatenebene geloggt.
Bestimmte Anfragen werden gar nicht geloggt. Eine aktuelle Liste der nicht geloggten Anfragen finden Sie bei den Regeln
level: None
im Richtlinienskript. Zum Zeitpunkt der Veröffentlichung dieser Informationen werden folgende Anfragen nicht geloggt:Anfragen von
system:kube-proxy
zum Beobachten einer Ressource vom Typendpoints
,services
oderservices/status
.GET-Anfragen von
system:unsecured
an eine Ressource vom Typconfigmaps
im Namespacekube-system
.GET-Anfragen von
kubelet
an eine Ressource vom Typnodes
odernodes/status
.GET-Anfragen von einer Identität in der Gruppe
system:nodes
an eine Ressource vom Typnodes
odernodes/status
.GET- und Update-Anfragen von
system:kube-controller-manager
,system:kube-scheduler
odersystem:serviceaccount:endpoint-controller
an eine Ressource vom Typendpoints
im Namespacekube-system
.GET-Anfragen von
system:apiserver
an eine Ressource vom Typnamespaces
,namespaces/status
odernamespaces/finalize
.GET- und Auflistungsanfragen von
system:kube-controller-manager
an eine Ressource in der Gruppemetrics.k8s.io
.Anfragen an URLs, die mit
/healthz*
,/version
oder/swagger*
übereinstimmen.
GKE-Audit-Richtlinie
Wenn GKE Logeinträge vom Kubernetes API-Server erhält, wird anhand der eigenen Richtlinie ermittelt, welche Einträge in das Administratoraktivitätslog bzw. in das Datenzugriffslog Ihres Projekts geschrieben werden.
In den meisten Fällen werden in GKE die folgenden Regeln auf Logeinträge vom Kubernetes API-Server angewendet:
Einträge, die Anfragen vom Typ
create
,delete
oderupdate
darstellen, werden in das Administratoraktivitätslog geschrieben.Einträge, die Anfragen vom Typ
get
,list
oderupdateStatus
darstellen, werden in das Datenzugriffslog geschrieben.
Informationen zur Preisgestaltung und zu den Arten von Logs, die standardmäßig aktiviert sind, finden Sie unter Logging-Details.
Erläuterungen zur Kubernetes-Audit-Richtliniendatei
In den ersten Regeln der Kubernetes-Audit-Richtliniendatei für GKE-Cluster ist angegeben, welche Ereignisse nicht geloggt werden sollen. Die folgende Regel besagt beispielsweise, dass Anfragen vom Typ get
von kubelet
an eine Ressource vom Typ nodes
oder nodes/status
nicht geloggt werden sollen. Wie bereits erwähnt, werden übereinstimmende Ereignisse auf der Ebene None
nicht geloggt.
- level: None users: ["kubelet"] # legacy kubelet identity verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"]
Der Liste der level: None
-Regeln folgt in der Richtliniendatei eine Liste mit Regeln, bei denen es sich um Sonderfälle handelt. Dies ist zum Beispiel eine Sonderfallregel, mit der bestimmte Anfragen auf der Ebene Metadata
geloggt werden:
- level: Metadata resources: - group: "" # core resources: ["secrets", "configmaps"] - group: authentication.k8s.io resources: ["tokenreviews"] omitStages: - "RequestReceived"
Ein Ereignis stimmt mit der Regel überein, wenn alle folgenden Bedingungen erfüllt sind:
- Das Ereignis stimmt nicht mit einer vorherigen Regel in der Richtliniendatei überein.
- Die Anfrage bezieht sich auf eine Ressource vom Typ
secrets
,configmaps
odertokenreviews
. - Das Ereignis bezieht sich nicht auf die Aufrufphase
RequestReceived
.
Der Liste mit den Sonderfallregeln in der Richtliniendatei folgen einige allgemeine Regeln.
Ersetzen Sie den Wert known_apis
durch ${known_apis}
, damit die allgemeinen Regeln im Skript angezeigt werden. Sie erhalten daraufhin eine ähnliche wie die folgende Regel:
- level: Request verbs: ["get", "list", "watch"] resources: - group: "" # core - group: "admissionregistration.k8s.io" - group: "apiextensions.k8s.io" - group: "apiregistration.k8s.io" - group: "apps" - group: "authentication.k8s.io" - group: "authorization.k8s.io" - group: "autoscaling" - group: "batch" - group: "certificates.k8s.io" - group: "extensions" - group: "metrics.k8s.io" - group: "networking.k8s.io" - group: "policy" - group: "rbac.authorization.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived"
Die Regel gilt für Ereignisse, die mit keiner vorangegangenen Regel in der Richtliniendatei übereinstimmen und sich nicht in der Phase RequestReceived
befinden. Die Regel besagt, dass Anfragen vom Typ get
, list
und watch
an eine Ressource in einer der aufgeführten Gruppen auf der Ebene Request
geloggt werden sollen.
Die nächste Regel in der Richtliniendatei sieht in etwa so aus:
- level: RequestResponse resources: - group: "" # core - group: "admissionregistration.k8s.io" - group: "apiextensions.k8s.io" - group: "apiregistration.k8s.io" - group: "apps" - group: "authentication.k8s.io" - group: "authorization.k8s.io" - group: "autoscaling" - group: "batch" - group: "certificates.k8s.io" - group: "extensions" - group: "metrics.k8s.io" - group: "networking.k8s.io" - group: "policy" - group: "rbac.authorization.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived"
Die Regel gilt für Ereignisse, die mit keiner vorangegangenen Regel in der Richtliniendatei übereinstimmen und sich nicht in der Phase RequestReceived
befinden. Die Regel gilt nicht für die Leseanfragen get
, list
und watch
. Stattdessen wird die Regel auf Schreibanfragen wie create
, update
und delete
angewendet. Die Regel besagt, dass Schreibanfragen auf der Ebene RequestResponse
geloggt werden sollen.