|
Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar. |
Aktivierung des API-Auditprotokolls zur Aufzeichnung von Systemereignissen
Sie können das API-Auditprotokoll aktivieren, um die Reihenfolge der von einzelnen Benutzern initiierten Systemereignisse aufzuzeichnen. Sie können nachvollziehen, was passiert ist, wann es passiert ist, wer es initiiert hat und welchen Cluster es betroffen hat. Wenn Sie diese Funktion aktivieren, werden alle Anfragen an die Rancher-API und alle Antworten darauf in ein Protokoll geschrieben.
Sie können API-Auditing während der Rancher-Installation oder eines Upgrades aktivieren.
Aktivierung des API-Auditprotokolls
Das Auditprotokoll ist aktiviert und wird konfiguriert, indem Umgebungsvariablen an den Rancher-Server-Container übergeben werden. Siehe Folgendes, um es in Ihrer Installation zu aktivieren.
Optionen für das API-Auditprotokoll
Die folgende Nutzung definiert Regeln darüber, was das Auditprotokoll aufzeichnen und welche Daten es enthalten soll:
| Parameter | Beschreibung |
|---|---|
|
|
|
|
|
Protokollpfad für die Rancher Server API. Der Standardpfad lautet |
|
Definiert die maximale Anzahl von Tagen, um alte Protokolldateien aufzubewahren. Der Standardwert beträgt 10 Tage. |
|
Definiert die maximale Anzahl von Protokolldateien, die aufbewahrt werden sollen. Der Standardwert ist 10. |
|
Definiert die maximale Größe in Megabyte der Protokolldatei, bevor sie rotiert wird. Die Standardgröße beträgt 100M. |
Prüfprotokollstufen
Die folgende Tabelle zeigt, welche Teile der API-Transaktionen für jede AUDIT_LEVEL Einstellung protokolliert werden.
AUDIT_LEVEL Einstellung |
Metadata (Metadaten) | Anforderungsheader | Antwortheader | Anforderungskörper | Antwortkörper |
|---|---|---|---|---|---|
|
✓ |
||||
|
✓ |
✓ |
✓ |
||
|
✓ |
✓ |
✓ |
✓ |
|
|
✓ |
✓ |
✓ |
✓ |
✓ |
Auditprotokollrichtlinien
Auditprotokollrichtlinien ermöglichen es Endbenutzern, Redaktionen mithilfe von AuditPolicy cluster-scoped CRs zusätzlich zu den Standardredaktionen und -filtern zu konfigurieren.
Alle konfigurierten Auditprotokollrichtlinien sind additiv.
Redaktionsrichtlinien für Header verwenden eine reguläre Ausdrucks- (Regex-)Engine, um Header zu redigieren, während eine JSONPath-Engine verwendet wird, um Anforderungs-/Antwortheader zu redigieren.
Die JSONPath-Engine unterstützt keine Skript- oder Filterausdrücke. Um mit JSONPath-Ausdrücken zu beginnen, ist eine gute Ressource, die zu konsultieren ist, Stafan Goessners Artikel über JSONPath.
Die Struktur einer Auditprotokollrichtlinien-CR ist wie folgt:
apiVersion: auditlog.cattle.io/v1
kind: AuditPolicy
spec:
enabled : true # true/false
# list of API request filters
filters:
- action: allow # allow/deny
# would allow logs sent to "/foo/some/endpoint" but not "/foo" or "/foobar".
requestURI: "/foo/.*"
# additionalRedactions allows configuration of redactions on headers using `jsonpath` expressions
additionalRedactions:
# redacts headers based on regex expressions
- headers:
- "Cache.*"
# paths redacts information from request and response bodies based on json path expressions
paths:
- "$.gitCommit"
verbosity:
level : 0 # matches the levels in the above audit log table
# request allows fine-grained control over which request data
# gets included. This overrides the behaviour of the generic verbosity.level
request:
headers : true # true/false
body : true # true/false
# response allows fine-grained control over which response data
# gets included. This overrides the behaviour of the generic verbosity.level
response:
headers : true # true/false
body: true # true/false
Beispiele
Das folgende Beispiel zeigt, wie nur Anfragen, die login im Anfragepfad enthalten, im Audit-Protokollpfad protokolliert werden:
apiVersion: auditlog.cattle.io/v1
kind: AuditPolicy
metadata:
name: filters
spec:
filters:
- action: deny
requestUri: ".*"
- action: allow
requestUri: ".*login.*"
Das folgende Beispiel zeigt, wie spezifische Felder, die gitCommint in den Anfrage- und Antwortkörpern enthalten, redigiert werden können:
apiVersion: auditlog.cattle.io/v1
kind: AuditPolicy
metadata:
name: redactions
spec:
additionalRedactions:
- paths:
- "$.gitCommit"
Standardredaktionen und -filter
Der Auditprotokoll-Controller kommt mit standardmäßig integrierten Redaktionen für häufige sensible Informationen.
Redigierte Header
Allgemeine Header:
-
Cookie -
Set-Cookie -
X-Api-Set-Cookie-Header -
Authorization -
X-Api-Tunnel-Params -
X-Api-Tunnel-Token -
X-Api-Auth-Header -
X-Amz-Security-Token
Redigierte Körperfelder
Allgemeine Körperfelder:
-
credentials -
applicationSecret -
oauthCredential -
serviceAccountCredential -
spKey -
spCert -
certificate -
privateKey -
secretsEncryptionConfig -
manifestUrl -
insecureWindowsNodeCommand -
insecureNodeCommand -
insecureCommand -
command -
nodeCommand -
windowsNodeCommand -
clientRandom
Allgemeiner Körper-Regex-Redaktor:
-
".([pP]assword|[Kk]ube[Cc]onfig|[Tt]oken)."
Anzeigen von API-Audit-Protokollen
Docker-Installation
Teilen Sie das AUDIT_LOG_PATH-Verzeichnis (Standard: /var/log/auditlog) mit dem Host-System. Das Protokoll kann mit Standard-Kommandozeilenschnittstellen-Tools analysiert oder an ein Protokollsammlungswerkzeug wie Fluentd, Filebeat, Logstash usw. weitergeleitet werden.
Kubernetes Install
Die Aktivierung des API-Auditprotokolls mittels Helm-Chart-Installation erstellt einen rancher-audit-log-Sidecar-Container im Rancher-Pod. Dieser Container streamt das Protokoll an die Standardausgabe (stdout). Sie können das Protokoll wie jedes andere Containerprotokoll anzeigen.
Der rancher-audit-log Container ist Teil des rancher Pods im cattle-system Namespace.
Versand des Auditprotokolls
Sie können die integrierte Protokollsammlung und den Versand von Rancher aktivieren, um die Audit- und andere Dienstprotokolle an einen unterstützten Sammlungspunkt zu versenden. Siehe Rancher-Tools - Protokollierung für Details.
Beispiele für Auditprotokolle
Nachdem Sie die Protokollierung aktiviert haben, wird jede API-Anfrage oder -Antwort von Rancher in Form von JSON protokolliert. Jedes der folgenden Codebeispiele bietet Beispiele dafür, wie man jede API-Transaktion identifiziert.
Metadatenebene
Wenn Sie Ihre AUDIT_LEVEL auf 0 setzen, protokolliert Rancher den Metadaten-Header für jede API-Anfrage, jedoch weder den Anforderungskörper noch die Anforderungs- und Antwortheader. Die Metadaten bieten grundlegende Informationen über die API-Transaktion, wie die Transaktions-ID, den Initiator der Transaktion, die Zeit, zu der sie stattfand, usw.
{
"auditID": "40bd4e40-875b-4020-933e-4c4f4c4db366",
"requestURI": "/v3/schemas",
"user": {
"name": "user-6j5s6",
"group": [
"system:authenticated",
"system:cattle:authenticated"
],
"extra": {
"principalid": [
"local://user-6j5s6"
],
"requesthost": [
"localhost:8443"
],
"requesttokenid": [
"token-zs42h"
],
"username": [
"admin"
]
}
},
"method": "GET",
"remoteAddr": "127.0.0.1:58652",
"responseCode": 200,
"requestTimestamp": "2025-06-30T11:13:25-04:00",
"responseTimestamp": "2025-06-30T11:13:25-04:00"
}
Metadaten- und Header-Ebene
Wenn Sie Ihre AUDIT_LEVEL auf 1 setzen, protokolliert Rancher die Metadaten sowie die Anforderungs- und Antwortheader für jede API-Anfrage.
{
"auditID": "f8c83dc6-a080-4e2e-ab43-552bddf01716",
"requestURI": "/v1/apps.deployments?page=1&pagesize=100&sort=metadata.name&filter=metadata.namespace!=p-npsl5&filter=metadata.namespace!=p-nzp6c&filter=metadata.namespace!=cattle-fleet-clusters-system&filter=metadata.namespace!=cattle-fleet-system&filter=metadata.namespace!=cattle-global-data&filter=metadata.namespace!=cattle-impersonation-system&filter=metadata.namespace!=cattle-provisioning-capi-system&filter=metadata.namespace!=cattle-system&filter=metadata.namespace!=cattle-ui-plugin-system&filter=metadata.namespace!=cluster-fleet-local-local-1a3d67d0a899&filter=metadata.namespace!=fleet-default&filter=metadata.namespace!=fleet-local&filter=metadata.namespace!=kube-node-lease&filter=metadata.namespace!=kube-public&filter=metadata.namespace!=kube-system&exclude=metadata.managedFields",
"user": {
"name": "user-6j5s6",
"group": [
"system:authenticated",
"system:cattle:authenticated"
],
"extra": {
"principalid": [
"local://user-6j5s6"
],
"requesthost": [
"localhost:8443"
],
"requesttokenid": [
"token-zs42h"
],
"username": [
"admin"
]
}
},
"method": "GET",
"remoteAddr": "127.0.0.1:58833",
"responseCode": 200,
"requestTimestamp": "2025-06-30T11:17:04-04:00",
"responseTimestamp": "2025-06-30T11:17:04-04:00",
"requestHeader": {
"Accept": [
"application/json"
],
"Accept-Encoding": [
"gzip, deflate, br, zstd"
],
"Accept-Language": [
"en-US,en;q=0.5"
],
"Connection": [
"keep-alive"
],
"Cookie": [
"[redacted]"
],
"Referer": [
"https://localhost:8443/dashboard/c/local/explorer/apps.deployment"
],
"Sec-Fetch-Dest": [
"empty"
],
"Sec-Fetch-Mode": [
"cors"
],
"Sec-Fetch-Site": [
"same-origin"
],
"User-Agent": [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0"
],
"X-Api-Csrf": [
"fccc690cab7b0c169b3fc6527edadef3"
]
},
"responseHeader": {
"Cache-Control": [
"no-cache, no-store, must-revalidate"
],
"Content-Encoding": [
"gzip"
],
"Content-Type": [
"application/json"
],
"Expires": [
"Wed 24 Feb 1982 18:42:00 GMT"
],
"X-Api-Cattle-Auth": [
"true"
],
"X-Api-Schemas": [
"https://localhost:8443/v1/schemas"
],
"X-Content-Type-Options": [
"nosniff"
]
}
}
Metadaten, Header und Anforderungskörper-Ebene
Wenn Sie Ihre AUDIT_LEVEL auf 2 setzen, protokolliert Rancher die Metadaten, die Anfrage- und Antwortheader sowie den Anforderungskörper für jede API-Anfrage.
Das folgende Codebeispiel zeigt eine API-Anfrage mit ihren Metadaten, Headern und dem Anforderungskörper.
Anforderung
Das folgende Codebeispiel zeigt eine API-Anfrage, einschließlich ihres Metadaten-Headers und ihres Anforderungskörpers.
{
"auditID": "d1088a09-2a13-4450-970e-0d44bd2c49ee",
"requestURI": "/v3/projects",
"user": {
"name": "user-6j5s6",
"group": [
"system:authenticated",
"system:cattle:authenticated"
],
"extra": {
"principalid": [
"local://user-6j5s6"
],
"requesthost": [
"localhost:8443"
],
"requesttokenid": [
"token-zs42h"
],
"username": [
"admin"
]
}
},
"method": "POST",
"remoteAddr": "127.0.0.1:49966",
"responseCode": 201,
"requestTimestamp": "2025-06-30T12:32:13-04:00",
"responseTimestamp": "2025-06-30T12:32:13-04:00",
"requestHeader": {
"Accept": [
"application/json"
],
"Accept-Encoding": [
"gzip, deflate, br, zstd"
],
"Accept-Language": [
"en-US,en;q=0.5"
],
"Connection": [
"keep-alive"
],
"Content-Length": [
"214"
],
"Content-Type": [
"application/json"
],
"Cookie": [
"[redacted]"
],
"Impersonate-Extra-Principalid": [
"local://user-6j5s6"
],
"Impersonate-Extra-Requesthost": [
"localhost:8443"
],
"Impersonate-Extra-Requesttokenid": [
"token-zs42h"
],
"Impersonate-Extra-Username": [
"admin"
],
"Impersonate-Group": [
"system:authenticated",
"system:cattle:authenticated"
],
"Impersonate-User": [
"user-6j5s6"
],
"Origin": [
"https://localhost:8443"
],
"Priority": [
"u=0"
],
"Referer": [
"https://localhost:8443/dashboard/c/local/explorer/management.cattle.io.project/create"
],
"Sec-Fetch-Dest": [
"empty"
],
"Sec-Fetch-Mode": [
"cors"
],
"Sec-Fetch-Site": [
"same-origin"
],
"User-Agent": [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0"
],
"X-Api-Csrf": [
"fccc690cab7b0c169b3fc6527edadef3"
]
},
"responseHeader": {
"Cache-Control": [
"no-cache, no-store, must-revalidate"
],
"Content-Encoding": [
"gzip"
],
"Content-Type": [
"application/json"
],
"Expires": [
"Wed 24 Feb 1982 18:42:00 GMT"
],
"X-Api-Cattle-Auth": [
"true"
],
"X-Api-Schemas": [
"https://localhost:8443/v3/project/schemas"
],
"X-Content-Type-Options": [
"nosniff"
]
},
"requestBody": {
"annotations": {},
"clusterId": "local",
"containerDefaultResourceLimit": {},
"creatorId": "local://user-6j5s6",
"labels": {},
"name": "example-project",
"namespaceDefaultResourceQuota": {},
"resourceQuota": {},
"type": "project"
}
}
Metadaten-, Header-, Anforderungskörper- und Antwortkörper-Ebene
Wenn Sie Ihr AUDIT_LEVEL auf 3 setzen, protokolliert Rancher die Metadaten, die Anfrage- und Antwortheader sowie den Anforderungskörper und den Antwortkörper.
Das folgende Codebeispiel zeigt ein Beispiel für eine API-Anfrage, bei der diese Informationen protokolliert werden.
{
"auditID": "a9549a5b-4351-4bd5-adcd-12f7ec667a6b",
"requestURI": "/v3/projects",
"user": {
"name": "user-6j5s6",
"group": [
"system:authenticated",
"system:cattle:authenticated"
],
"extra": {
"principalid": [
"local://user-6j5s6"
],
"requesthost": [
"localhost:8443"
],
"requesttokenid": [
"token-zs42h"
],
"username": [
"admin"
]
}
},
"method": "POST",
"remoteAddr": "127.0.0.1:50454",
"responseCode": 201,
"requestTimestamp": "2025-06-30T12:42:24-04:00",
"responseTimestamp": "2025-06-30T12:42:24-04:00",
"requestHeader": {
"Accept": [
"application/json"
],
"Accept-Encoding": [
"gzip, deflate, br, zstd"
],
"Accept-Language": [
"en-US,en;q=0.5"
],
"Connection": [
"keep-alive"
],
"Content-Length": [
"214"
],
"Content-Type": [
"application/json"
],
"Cookie": [
"[redacted]"
],
"Impersonate-Extra-Principalid": [
"local://user-6j5s6"
],
"Impersonate-Extra-Requesthost": [
"localhost:8443"
],
"Impersonate-Extra-Requesttokenid": [
"token-zs42h"
],
"Impersonate-Extra-Username": [
"admin"
],
"Impersonate-Group": [
"system:authenticated",
"system:cattle:authenticated"
],
"Impersonate-User": [
"user-6j5s6"
],
"Origin": [
"https://localhost:8443"
],
"Priority": [
"u=0"
],
"Referer": [
"https://localhost:8443/dashboard/c/local/explorer/management.cattle.io.project/create"
],
"Sec-Fetch-Dest": [
"empty"
],
"Sec-Fetch-Mode": [
"cors"
],
"Sec-Fetch-Site": [
"same-origin"
],
"User-Agent": [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0"
],
"X-Api-Csrf": [
"fccc690cab7b0c169b3fc6527edadef3"
]
},
"responseHeader": {
"Cache-Control": [
"no-cache, no-store, must-revalidate"
],
"Content-Encoding": [
"gzip"
],
"Content-Type": [
"application/json"
],
"Expires": [
"Wed 24 Feb 1982 18:42:00 GMT"
],
"X-Api-Cattle-Auth": [
"true"
],
"X-Api-Schemas": [
"https://localhost:8443/v3/project/schemas"
],
"X-Content-Type-Options": [
"nosniff"
]
},
"requestBody": {
"annotations": {},
"clusterId": "local",
"containerDefaultResourceLimit": {},
"creatorId": "local://user-6j5s6",
"labels": {},
"name": "example-project",
"namespaceDefaultResourceQuota": {},
"resourceQuota": {},
"type": "project"
},
"responseBody": {
"actions": {
"exportYaml": "https://localhost:8443/v3/projects/local:p-qt6tq?action=exportYaml"
},
"annotations": {
"authz.management.cattle.io/creator-role-bindings": "{\"required\":[\"project-owner\"]}"
},
"backingNamespace": "local-p-qt6tq",
"baseType": "project",
"clusterId": "local",
"containerDefaultResourceLimit": {
"type": "/v3/schemas/containerResourceLimit"
},
"created": "2025-06-30T16:42:24Z",
"createdTS": 1751301744000,
"creatorId": "user-6j5s6",
"id": "local:p-qt6tq",
"labels": {
"cattle.io/creator": "norman"
},
"links": {
"basicAuths": "https://localhost:8443/v3/projects/local:p-qt6tq/basicauths",
"certificates": "https://localhost:8443/v3/projects/local:p-qt6tq/certificates",
"configMaps": "https://localhost:8443/v3/projects/local:p-qt6tq/configmaps",
"cronJobs": "https://localhost:8443/v3/projects/local:p-qt6tq/cronjobs",
"daemonSets": "https://localhost:8443/v3/projects/local:p-qt6tq/daemonsets",
"deployments": "https://localhost:8443/v3/projects/local:p-qt6tq/deployments",
"dnsRecords": "https://localhost:8443/v3/projects/local:p-qt6tq/dnsrecords",
"dockerCredentials": "https://localhost:8443/v3/projects/local:p-qt6tq/dockercredentials",
"horizontalPodAutoscalers": "https://localhost:8443/v3/projects/local:p-qt6tq/horizontalpodautoscalers",
"ingresses": "https://localhost:8443/v3/projects/local:p-qt6tq/ingresses",
"jobs": "https://localhost:8443/v3/projects/local:p-qt6tq/jobs",
"namespacedBasicAuths": "https://localhost:8443/v3/projects/local:p-qt6tq/namespacedbasicauths",
"namespacedCertificates": "https://localhost:8443/v3/projects/local:p-qt6tq/namespacedcertificates",
"namespacedDockerCredentials": "https://localhost:8443/v3/projects/local:p-qt6tq/namespaceddockercredentials",
"namespacedSecrets": "https://localhost:8443/v3/projects/local:p-qt6tq/namespacedsecrets",
"namespacedServiceAccountTokens": "[redacted]",
"namespacedSshAuths": "https://localhost:8443/v3/projects/local:p-qt6tq/namespacedsshauths",
"persistentVolumeClaims": "https://localhost:8443/v3/projects/local:p-qt6tq/persistentvolumeclaims",
"pods": "https://localhost:8443/v3/projects/local:p-qt6tq/pods",
"projectNetworkPolicies": "https://localhost:8443/v3/projects/local:p-qt6tq/projectnetworkpolicies",
"projectRoleTemplateBindings": "https://localhost:8443/v3/projects/local:p-qt6tq/projectroletemplatebindings",
"remove": "https://localhost:8443/v3/projects/local:p-qt6tq",
"replicaSets": "https://localhost:8443/v3/projects/local:p-qt6tq/replicasets",
"replicationControllers": "https://localhost:8443/v3/projects/local:p-qt6tq/replicationcontrollers",
"secrets": "https://localhost:8443/v3/projects/local:p-qt6tq/secrets",
"self": "https://localhost:8443/v3/projects/local:p-qt6tq",
"serviceAccountTokens": "[redacted]",
"services": "https://localhost:8443/v3/projects/local:p-qt6tq/services",
"sshAuths": "https://localhost:8443/v3/projects/local:p-qt6tq/sshauths",
"statefulSets": "https://localhost:8443/v3/projects/local:p-qt6tq/statefulsets",
"subscribe": "https://localhost:8443/v3/projects/local:p-qt6tq/subscribe",
"update": "https://localhost:8443/v3/projects/local:p-qt6tq",
"workloads": "https://localhost:8443/v3/projects/local:p-qt6tq/workloads"
},
"name": "example-project",
"namespaceDefaultResourceQuota": {
"limit": {
"type": "/v3/schemas/resourceQuotaLimit"
},
"type": "/v3/schemas/namespaceResourceQuota"
},
"namespaceId": null,
"resourceQuota": {
"limit": {
"type": "/v3/schemas/resourceQuotaLimit"
},
"type": "/v3/schemas/projectResourceQuota",
"usedLimit": {
"type": "/v3/schemas/resourceQuotaLimit"
}
},
"state": "active",
"transitioning": "no",
"transitioningMessage": "",
"type": "project",
"uuid": "b582603b-7826-4302-8393-792df2611265"
}
}