Audit Logging
3 Minuten Lesezeit
Audit Logging protokolliert alle Anfragen an den Kubernetes API Server. Die PSKE stellt seit Version 1.35 die Auditing Extension bereit, die über das Shoot-Manifest aktiviert und konfiguriert wird.
Konfiguration im Shoot-Manifest
Die Extension wird unter spec.extensions aktiviert. Gleichzeitig wird das Audit-Backend und die Audit Policy referenziert:
spec:
extensions:
- type: auditing
providerConfig:
apiVersion: auditing.extensions.gardener.cloud/v1alpha1
kind: AuditConfiguration
backends:
- http:
url: https://audit-backend.example.com/audit
tls:
secretReferenceName: audit-mtls-creds
deliveryMode: Guaranteed
resources:
- name: audit-mtls-creds
resourceRef:
apiVersion: v1
kind: Secret
name: mtls-credentials
kubernetes:
kubeAPIServer:
auditConfig:
auditPolicy:
configMapRef:
name: audit-policy
Backend-Konfiguration
Audit Events werden vom API Server an einen HTTP(S)-Endpunkt weitergeleitet. Als Backend-Typ wird http unterstützt, der Endpunkt muss HTTPS mit mTLS unterstützen.
| Feld | Typ | Beschreibung |
|---|---|---|
http.url | string | HTTPS-URL des Backends |
http.tls.secretReferenceName | string | Verweis auf einen Eintrag in spec.resources |
http.compression | string | Optional: gzip |
deliveryMode | string | Guaranteed oder BestEffort. Bei mehreren Backends muss genau eines Guaranteed sein. |
mTLS-Secret
Das referenzierte Secret muss folgende Felder enthalten:
apiVersion: v1
kind: Secret
metadata:
name: mtls-credentials
namespace: garden-<projektname>-<id>
data:
ca.crt: <base64> # Optional: Server-Zertifikat validieren
client.crt: <base64>
client.key: <base64>
Mehrere Backends
backends:
- http:
url: https://primary-backend.example.com/audit
deliveryMode: Guaranteed
- http:
url: https://secondary-backend.example.com/audit
deliveryMode: BestEffort
Audit Policy
Die Audit Policy definiert, welche API-Anfragen protokolliert werden und in welchem Detailgrad. Sie wird als ConfigMap angelegt und im Shoot-Manifest referenziert.
apiVersion: v1
kind: ConfigMap
metadata:
name: audit-policy
namespace: garden-<projektname>-<id>
data:
policy: |
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
# Lesende Anfragen auf unkritische Ressourcen nicht protokollieren
- level: None
verbs: ["get", "list", "watch"]
resources:
- group: ""
resources: ["endpoints", "services", "configmaps"]
# Alle anderen Anfragen auf Metadata-Ebene protokollieren
- level: Metadata
Audit Levels
| Level | Beschreibung |
|---|---|
None | Nicht protokollieren |
Metadata | HTTP-Methode, URL, Benutzer, Zeitstempel — kein Body |
Request | Zusätzlich der Request Body |
RequestResponse | Request und Response Body — erzeugt sehr große Datenmengen |
Vollständiges Beispiel
Die folgenden drei Ressourcen müssen im Gardener-Projektnamespace (garden-<projektname>-<id>) angelegt werden, bevor die Extension aktiv wird.
Schritt 1 — mTLS-Secret anlegen:
apiVersion: v1
kind: Secret
metadata:
name: mtls-credentials
namespace: garden-meinprojekt-abc12
data:
ca.crt: <base64 PEM CA-Bundle>
client.crt: <base64 PEM Client-Zertifikat>
client.key: <base64 PEM Client-Key>
Schritt 2 — Audit Policy als ConfigMap anlegen:
apiVersion: v1
kind: ConfigMap
metadata:
name: audit-policy
namespace: garden-meinprojekt-abc12
data:
policy: |
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: None
verbs: ["get", "list", "watch"]
resources:
- group: ""
resources: ["endpoints", "services", "configmaps"]
- level: Metadata
Schritt 3 — Shoot-Manifest anpassen:
apiVersion: core.gardener.cloud/v1beta1
kind: Shoot
metadata:
name: mein-cluster
namespace: garden-meinprojekt-abc12
spec:
extensions:
- type: auditing
providerConfig:
apiVersion: auditing.extensions.gardener.cloud/v1alpha1
kind: AuditConfiguration
backends:
- http:
url: https://audit-backend.example.com/audit
tls:
secretReferenceName: audit-mtls-creds
deliveryMode: Guaranteed
resources:
- name: audit-mtls-creds
resourceRef:
apiVersion: v1
kind: Secret
name: mtls-credentials
kubernetes:
kubeAPIServer:
auditConfig:
auditPolicy:
configMapRef:
name: audit-policy
Hinweise
- Die Audit Policy ConfigMap muss im Gardener-Projektnamespace (
garden-<projektname>-<id>) angelegt werden, nicht im Cluster selbst. - Der
auditlog-forwarderreichert jedes Event mit Gardener-Metadaten an (Shoot-Name, Seed-Name etc.) bevor es ans Backend weitergeleitet wird. - Zu ausführliche Policies (
RequestResponseauf breiter Basis) können den API Server verlangsamen.