Audit-Logging

Auf dieser Seite wird erläutert, wie Sie Audit-Logging in Google Kubernetes Engine-Clustern verwenden.

Übersicht

Alle auf Kubernetes basierenden Cluster bieten Kubernetes-Audit-Logging mit einer chronologischen Aufzeichnung von Aufrufen, die an den Kubernetes-API-Server gesendet wurden. Die Einträge im Kubernetes-Audit-Log sind nützlich, um verdächtige API-Anfragen zu untersuchen, Statistiken zu erfassen oder Monitoring-Benachrichtigungen für unerwünschte API-Aufrufe zu erstellen.

GKE-Cluster ermöglichen die Einbindung von Kubernetes-Audit-Logging in Cloud-Audit-Logs und Stackdriver Logging. Dadurch können Sie Audit-Log-Einträge von Kubernetes im Google Cloud-Projekt ansehen.

Neben den von Kubernetes geschriebenen Einträgen enthalten die Audit-Logs des Projekts auch Einträge, die aus Kubernetes Engine stammen.

Audit Logging GA ist in GKE 1.11.4 und höher verfügbar.

Vorbereitung

Führen Sie zur Vorbereitung auf diese Aufgabe folgende Schritte aus:

  • Achten Sie darauf, dass die Google Kubernetes Engine API aktiviert ist.
  • Google Kubernetes Engine API aktivieren
  • Prüfen Sie, ob das Cloud SDK installiert ist.
  • Legen Sie Ihre standardmäßige Projekt-ID fest:
    gcloud config set project [PROJECT_ID]
  • Wenn Sie mit zonalen Clustern arbeiten, legen Sie die Compute-Standardzone fest:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Wenn Sie mit regionalen Clustern arbeiten, legen Sie die Compute-Standardregion fest:
    gcloud config set compute/region [COMPUTE_REGION]
  • Aktualisieren Sie gcloud auf die neueste Version:
    gcloud components update

Im Projekt muss ein Kubernetes Engine-Cluster enthalten sein. Sie können für die Übungen in diesem Thema einen vorhandenen Cluster verwenden oder einen neuen erstellen. Bei Verwendung eines vorhandenen Clusters müssen Sie darauf achten, dass er kürzlich aktiv war. Wenn Sie in letzter Zeit kein Deployment erstellt haben, können Sie dies jetzt beispielsweise mit folgendem Befehl tun:

kubectl run log-exercise --image nginx

Lesen Sie die Informationen zu Kubernetes Audit Logging.

Audit-Logs im Projekt

Im Google Cloud-Projekt sind folgende Audit-Logs enthalten:

  • Administratoraktivitätslog
  • Datenzugriffs-Log

Das Administratoraktivitäts-Logging ist standardmäßig ohne Zusatzkosten aktiviert.

Das Datenzugriffs-Logging ist standardmäßig deaktiviert und kann bei Aktivierung zusätzlich in Rechnung gestellt werden. Weitere Informationen zum Aktivieren des Datenzugriffs-Loggings und den damit verbundenen Kosten finden Sie unter Datenzugriffs-Logs konfigurieren.

Zugriffstransparenz-Logging wird in Kubernetes Engine nicht unterstützt.

Verschiedene Google Cloud Platform-Dienste schreiben Einträge in die Logs des Projekts. Auch der Kubernetes-Dienst schreibt Einträge in die Audit-Logs des Projekts. Für Kubernetes Engine-Cluster sind die von folgenden Diensten geschriebenen Log-Einträge am relevantesten:

Dienst Anzeigename
k8s.io Kubernetes
container.googleapis.com Kubernetes Engine

Administratoraktivitäts-Log des Projekts ansehen

Console

  1. Rufen Sie in der Cloud Console im Menü Logging die Seite Logs auf.

    Zur Seite "Logs"

  2. Suchen Sie oben auf der Seite nach dem Drop-down-Menü zum Auswählen eines Ressourcentyps. Wählen Sie im Drop-down-Menü den Eintrag Kubernetes-Cluster aus.

  3. Geben Sie optional den Speicherort an oder wählen Sie Alle Speicherorte aus. Wenn Sie einen Speicherort angeben, können Sie an diesem einen bestimmten Cluster auswählen.

  4. Im nächsten Menü rechts davon stehen die Logs zur Wahl. Wählen Sie im Drop-down-Menü Aktivität aus und klicken Sie auf OK.

  5. Standardmäßig werden alle Log-Ebenen angezeigt. Wenn Sie eine Log-Ebene wie Warnung angeben möchten, können Sie diese im Drop-down-Menü für Log-Ebenen auswählen.

  6. Unter Umständen werden nur Logeinträge aus der letzten Stunde angezeigt. Wenn keine Logeinträge aus der letzten Stunde zu sehen sind, klicken Sie auf Ältere Logs laden.

  7. Klicken Sie oberhalb der gerade erwähnten Drop-down-Menüs im Feld Nach Label oder Textsuche filtern auf den Abwärtspfeil, um das Drop-down-Menü zu öffnen. Wählen Sie im Menü den Eintrag In erweiterten Filter umwandeln aus.

  8. Im Textfeld wird ein Filter wie der folgende angezeigt:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  9. Klicken Sie zum Öffnen eines Logeintrags auf den Pfeil am Anfang der Zeile. Das Feld logName des Eintrags hat den Wert projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity.

gcloud

Listen Sie die ersten beiden Logeinträge im Administratoraktivitätslog des Projekts auf:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"' \
    --limit 2 \
    --freshness 300d

[PROJECT_ID] ist die Projekt-ID.

Es werden zwei Logeinträge ausgegeben. Das Feld logName enthält für jeden Logeintrag den Wert projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity.

insertId: 18yao5jem14og
labels:
  cluster_version: 1.8.8-gke.0
logName: projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity
...

Standardfiltermodus und erweiterte Filteroberflächen

In der Cloud Console stehen für die Seite Logs zwei Filteroberflächen zur Verfügung: Einfach und Erweitert. Informationen zu den beiden Filteroberflächen finden Sie unter Filteroberflächen der Loganzeige.

Dienste ansehen, die in das Administratoraktivitätslog schreiben

Console

  1. Rufen Sie in der Cloud Console im Menü Logging die Seite Logs auf.

    Zur Seite "Logs"

  2. Wenn sich die Seite Logs nicht bereits im erweiterten Modus befindet, schalten Sie auf diesen um. Klicken Sie dazu rechts im Filterfeld auf den Abwärtspfeil und wählen Sie In erweiterten Filter umwandeln aus.

  3. Löschen Sie eventuell vorhandenen Text aus dem Filterfeld und geben Sie diesen Filter ein:

    logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="k8s.io"
    

    [PROJECT_ID] ist die Projekt-ID.

    Klicken Sie auf Filter senden.

    Es werden alle Einträge im Administratoraktivitätslog aufgelistet, die vom Dienst k8s.io geschrieben wurden, also von der Kubernetes-Steuerungsebene.

  4. Suchen Sie jetzt nach Logeinträgen, die von anderen Diensten als k8s.io geschrieben wurden. Ändern Sie im Filterfeld den Eintrag serviceName="k8s.io" in serviceName!="k8s.io". Klicken Sie auf Filter senden.

    Es werden Einträge im Administratoraktivitätslog aufgelistet, die nicht vom Dienst k8s.io geschrieben wurden.

  5. Öffnen Sie einen der Logeinträge und erweitern Sie das Feld protoPayload. Überprüfen Sie anhand des Werts von serviceName, von welchem Dienst der Logeintrag geschrieben wurde.

  6. Suchen Sie jetzt nach Logeinträgen, die vom Dienst container.googleapis.com geschrieben wurden. Dies sind die Einträge, die von der Kubernetes Engine-Steuerungsebene stammen. Ändern Sie im Filterfeld den Eintrag serviceName!="k8s.io" in serviceName="container.googleapis.com". Klicken Sie auf Filter senden.

gcloud

Listen Sie die ersten beiden Logeinträge im Administratoraktivitätslog des Projekts auf, die vom Dienst k8s.io geschrieben wurden. Dies sind die Einträge, die von der Kubernetes-Steuerungsebene stammen.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName="k8s.io"' \
    --limit 2 \
    --freshness 300d

[PROJECT_ID] ist die Projekt-ID.

In der Ausgabe sehen Sie, dass protoPayload:serviceName den Wert k8s.io enthält:

protoPayload:
  ...
  serviceName: k8s.io

Suchen Sie jetzt nach Logeinträgen, die von anderen Diensten als k8s.io geschrieben wurden:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName!="k8s.io"' \
    --limit 2 \
    --freshness 300d

In der Ausgabe werden Einträge im Administratoraktivitätslog aufgelistet, die nicht vom Dienst k8s.io geschrieben wurden.

logName: projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity
...
protoPayload:
  ...
  serviceName: compute.googleapis.com
...

Überprüfen Sie in einem der Logeinträge den Wert von protoPayload.serviceName, um zu erfahren, von welchem Dienst der Logeintrag geschrieben wurde.

Suchen Sie jetzt nach Logeinträgen, die vom Dienst container.googleapis.com geschrieben wurden. Dies sind die Einträge, die von der Kubernetes Engine-Steuerungsebene stammen.

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.serviceName="container.googleapis.com"' \
    --limit 2 \
    --freshness 300d

[PROJECT_ID] ist die Projekt-ID.

Administratoraktivitäts-Log nach Ressourcentyp filtern

Jeder Log-Eintrag in Ihrem Administratoraktivitätslog bezieht sich auf einen bestimmten Ressourcentyp. Folgende Ressourcentypen sind für Kubernetes-Cluster am relevantesten:

Ressourcentyp Anzeigename
k8s_cluster Kubernetes-Cluster
gke_cluster GKE-Clustervorgänge

Vom Kubernetes API-Server geschriebene Logeinträge beziehen sich auf den Ressourcentyp k8s_cluster. Diese Logeinträge beschreiben Vorgänge auf Kubernetes-Clusterressourcen wie Pods, Deployments und Secrets.

Vom Kubernetes Engine-API-Server geschriebene Logeinträge gelten für die Ressource gke_cluster. Diese Logeinträge beschreiben Vorgänge wie das Erstellen und Löschen von Clustern.

Console

  1. Rufen Sie in der Cloud Console im Menü Logging die Seite Logs auf.

    Zur Seite "Logs"

  2. Wenn sich die Seite Logs nicht bereits im Standardmodus befindet, schalten Sie auf diesen um. Klicken Sie dazu rechts im Filterfeld auf den Abwärtspfeil und wählen Sie Filter löschen und zum Standardmodus zurückkehren aus.

  3. Wählen Sie im Drop-down-Menü zur Auswahl eines Ressourcentyps den Eintrag Kubernetes-Cluster aus. Dies ist der Anzeigename für den Ressourcentyp k8s_cluster.

  4. Wählen Sie im Drop-down-Menü zum Auswählen eines Logs den Eintrag Aktivität aus und klicken Sie auf OK.

    Es werden alle Einträge im Administratoraktivitätslog aufgelistet, die sich auf den Ressourcentyp k8s_cluster beziehen.

  5. Öffnen Sie einen der Logeinträge und erweitern Sie das Feld resource. Überprüfen Sie, ob das Feld type den Wert k8s_cluster enthält.

  6. Wählen Sie jetzt im Drop-down-Menü den Eintrag GKE-Clustervorgänge aus. Dies ist der Anzeigename für den Ressourcentyp gke_cluster. Wählen Sie im Drop-down-Menü zum Auswählen eines Logs den Eintrag Aktivität aus und klicken Sie auf OK.

    Es werden alle Einträge im Administratoraktivitätslog aufgelistet, die sich auf den Ressourcentyp gke_cluster beziehen.

gcloud

Listen Sie die ersten beiden Logeinträge im Administratoraktivitätslog des Projekts auf, die sich auf den Ressourcentyp k8s_cluster beziehen:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND resource.type="k8s_cluster"' \
    --limit 2 \
    --freshness 300d

[PROJECT_ID] ist die Projekt-ID.

In der Ausgabe sehen Sie, dass das Feld resource:type den Wert k8s_cluster enthält:

resource:
  ...
  type: k8s_cluster

Listen Sie als Nächstes die ersten beiden Logeinträge im Administratoraktivitätslog des Projekts auf, die sich auf den Ressourcentyp gke_cluster beziehen:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
        AND resource.type="gke_cluster"' \
    --limit 2 \
    --freshness 300d

In der Ausgabe sehen Sie, dass das Feld resource:type den Wert gke_cluster enthält:

resource:
  ...
  type: gke_cluster

Beispielfilter für das Administratoraktivitätslog

Hier finden Sie einige Beispiele für Filter, die Sie in der Cloud Console ausprobieren können. Ersetzen Sie in jedem Fall [PROJECT_ID] durch die Projekt-ID.

Suchen Sie nach Änderungen an der rollenbasierten Zugriffssteuerung. Schließen Sie dabei automatisierte Systemänderungen aus der Suche aus.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.roles"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.rolebindings"
NOT protoPayload.authenticationInfo.principalEmail:"system"

Sie können ähnliche Abfragen verwenden, um Änderungen an clusterroles und clusterrolebindings zu finden.

Suchen Sie nach Anfragen für Zertifikatsignaturen.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.resourceName:"certificates.k8s.io/v1beta1/certificatesigningrequests"

Suchen Sie nach nicht authentifizierte Webanfragen.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:anonymous"

Suchen Sie nach Aufrufen der kubelet-Bootstrap-Identität.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"kubelet"

Suchen Sie nach authentifizierten Knotenanfragen.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:node"

Suchen Sie nach Aufrufen außerhalb eines IP-Bereichs.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.requestMetadata.callerIp!="127.0.0.1"
protoPayload.requestMetadata.callerIp!="::1"
NOT protoPayload.requestMetadata.callerIp:"[IP Prefix]"

Suchen Sie im Administratoraktivitätslog nach Einträgen, die sich auf den Ressourcentyp k8s_cluster beziehen und das Erstellen eines Deployments beschreiben.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"deployments.create"

Suchen Sie im Administratoraktivitätslog nach Einträgen, die sich auf den Ressourcentyp k8s_cluster beziehen und im Feld principalEmail den Wert system:anonymous enthalten. Diese Einträge stellen wahrscheinlich fehlgeschlagene Authentifizierungsversuche dar.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail="system:anonymous"

Suchen Sie im Administratoraktivitätslog nach Einträgen, die sich auf den Ressourcentyp gke_cluster beziehen und das Erstellen eines Clusters beschreiben:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster"

Suchen Sie im Administratoraktivitätslog nach Einträgen, die sich auf den Ressourcentyp gke_cluster beziehen und im Feld severity den Wert ERROR enthalten:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
severity="ERROR"

Suchen Sie im Administratoraktivitätslog nach Einträgen, die sich auf den Ressourcentyp k8s_cluster beziehen und eine Schreibanfrage für ein Secret beschreiben:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.secrets"
NOT protoPayload.methodName:"get"
NOT protoPayload.methodName:"list"
NOT protoPayload.methodName:"watch"

Suchen Sie im Administratoraktivitätslog nach Einträgen, die sich auf den Ressourcentyp k8s_cluster beziehen und eine Pod-Anfrage von einem bestimmten Nutzer beschreiben:

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.pods"
protoPayload.authenticationInfo.principalEmail="dev@example.com"

Weitere Informationen zum Erstellen von Filtern finden Sie unter Erweiterte Logfilter.

Struktur eines Logeintrags

Jeder Logeintrag ist ein Objekt vom Typ LogEntry. Weitere Informationen finden Sie unter Audit-Logs verstehen.

Datenzugriffslogs aktivieren

Rufen Sie die Cloud IAM-Richtlinie (Cloud Identity and Access Management) für Ihr Projekt ab:

gcloud projects get-iam-policy [PROJECT_ID] > my-policy.yaml

[PROJECT_ID] ist die Projekt-ID.

Öffnen Sie my-policy.yaml, um die Cloud IAM-Richtlinie anzuzeigen. Die Richtlinie enthält wahrscheinlich ein bindings-Objekt ähnlich dem folgenden:

bindings:
- members:
  - serviceAccount:xxx.gserviceaccount.com
  - serviceAccount:yyy.gserviceaccount.com
  role: roles/container.clusterAdmin
- members:
  ...

Erstellen Sie in my-policy.yaml ein Objekt von Typ auditConfigs oder ergänzen Sie das vorhandene Objekt auditConfigs, sodass ADMIN_READ, DATA_WRITE UND DATA_READ unter auditLogConfigs aufgeführt werden.

auditConfigs:
- auditLogConfigs:
  - logType: ADMIN_READ
  - logType: DATA_WRITE
  - logType: DATA_READ
  service: allServices

Lassen Sie den Wert von etag unverändert.

Speichern Sie die aktualisierte Datei unter dem Namen my-policy-2.yaml.

Legen Sie die Cloud IAM-Richtlinie für Ihr Projekt fest:

gcloud projects set-iam-policy [PROJECT_ID] my-policy-2.yaml

[PROJECT_ID] ist die Projekt-ID.

Datenzugriffs-Log des Projekts ansehen

Console

  1. Rufen Sie in der Cloud Console im Menü Logging die Seite Logs auf.

    Zur Seite "Logs"

  2. Wenn sich die Seite Logs nicht bereits im Standardmodus befindet, schalten Sie auf diesen um. Klicken Sie dazu rechts im Filterfeld auf den Abwärtspfeil und wählen Sie Filter löschen und zum Standardmodus zurückkehren aus.

  3. Suchen Sie oben auf der Seite nach dem Drop-down-Menü zum Auswählen eines Ressourcentyps. Wählen Sie im Drop-down-Menü den Eintrag Kubernetes-Cluster aus.

  4. Wählen Sie im Menü zum Auswählen eines Logs data_access aus und klicken Sie auf OK.

  5. Klicken Sie rechts neben dem Feld Nach Label oder Textsuche filtern auf den Abwärtspfeil, um das Drop-down-Menü zu öffnen. Wählen Sie im Menü den Eintrag In erweiterten Filter umwandeln aus.

  6. Im Textfeld wird ein Filter wie der folgende angezeigt:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access"
  7. Öffnen Sie einen der Logeinträge und beachten Sie, dass das Feld logName des Eintrags den Wert projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access enthält.

gcloud

Listen Sie die ersten beiden Log-Einträge im Datenzugriffs-Log des Projekts auf:

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access"' \
    --limit 2 \
    --freshness 30d

[PROJECT_ID] ist die Projekt-ID.

Es werden zwei Logeinträge ausgegeben. Das Feld logName enthält für jeden Logeintrag den Wert projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access.

insertId:  "x0vy9eej0j54"
labels: {…}
logName:  "projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Fdata_access"
...

Logeinträge exportieren und speichern

Logeinträge werden in Stackdriver Logging über eine begrenzte Aufbewahrungsdauer beibehalten. Anschließend werden die Einträge gelöscht.

Wenn Sie Ihre Logeinträge länger aufbewahren möchten, können Sie sie in einen Google-Dienst wie Cloud Storage, BigQuery oder Cloud Pub/Sub exportieren.

Messwerte und Benachrichtigungen einrichten

In Stackdriver Monitoring haben Sie die Möglichkeit, Messwerte auf Basis der Logeinträge einzurichten. Außerdem können Sie mithilfe von logbasierten Messwerten Diagramme und Benachrichtigungen einrichten.

Audit-Richtlinie

Die Audit-Richtlinie von Kubernetes legt fest, welche Log-Einträge vom Kubernetes-API-Server exportiert werden. Die Audit-Richtlinie von Kubernetes Engine legt fest, welche Einträge in das Administratoraktivitätslog und welche Einträge in das Datenzugriffslog geschrieben werden.

Weitere Informationen zu Audit-Richtlinien in Kubernetes Engine finden Sie unter Audit-Richtlinie von Kubernetes Engine.

Weitere Informationen