Cloud Audit Logs: Log-Typen erklärt und richtig exportieren
Admin Activity, Data Access, System Event und Policy Denied: was jedes Audit-Log erfasst, Aufbewahrung, wichtige Felder und vier Wege, die Logs zu exportieren.
Kurz gesagt. Google Cloud schreibt pro Projekt, Ordner und Organisation vier Audit-Logs: Admin Activity (Konfigurationsänderungen, immer aktiv, 400 Tage), System Event (von Google ausgelöste Änderungen, immer aktiv, 400 Tage), Data Access (Lesezugriffe und Datenschreibvorgänge, standardmäßig deaktiviert außer bei einigen BigQuery-Diensten, 30 Tage) und Policy Denied (durch Sicherheitsrichtlinien verweigerte Zugriffe, standardmäßig aktiv, 30 Tage). Exportieren Sie für eine Untersuchung alle vier als JSON: über den Logs Explorer für kurze Zeiträume, mit gcloud logging read für längere, oder kopieren Sie den Sink-Bucket, falls Sie einen haben.
Cloud Audit Logs sind das Protokoll der Control Plane von Google Cloud: wer hat was, wo und wann getan. Jede Untersuchung eines Google-Cloud-Projekts stützt sich darauf. Wer genau weiß, was jeder Typ erfasst und was nicht, spart Stunden.
Die vier Typen von Audit-Logs
Google dokumentiert vier Typen in der Übersicht zu Cloud Audit Logs. Am Log-Namen erkennen Sie, welchen Sie vor sich haben: projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2F<type>.
| Typ | Suffix des Log-Namens | Erfasst | Standard | Standard-Aufbewahrung |
|---|---|---|---|---|
| Admin Activity | activity | API-Aufrufe, die Konfiguration oder Metadaten ändern: IAM-Richtlinien, VMs, Firewalls, Sinks, Schlüssel | Immer aktiv, nicht deaktivierbar | 400 Tage (_Required) |
| System Event | system_event | Änderungen durch Google-Systeme, z. B. Live-Migration einer VM | Immer aktiv | 400 Tage (_Required) |
| Data Access | data_access | Lesen der Konfiguration (ADMIN_READ), Lesen von Nutzerdaten (DATA_READ), Schreiben von Nutzerdaten (DATA_WRITE) | Deaktiviert, außer bei einigen BigQuery-Diensten | 30 Tage (_Default) |
| Policy Denied | policy | Durch eine Sicherheitsrichtlinie verweigerte Zugriffe, etwa durch VPC Service Controls | Aktiv; kann ausgeschlossen, aber nicht deaktiviert werden | 30 Tage (_Default) |
Die Aufbewahrung ergibt sich aus den Log-Buckets: Der Bucket _Required bewahrt seine Logs 400 Tage auf, und sein Sink kann weder geändert noch gelöscht werden; der Bucket _Default bewahrt standardmäßig 30 Tage auf (Routing-Übersicht, Kontingente und Limits).
Daraus folgen zwei Konsequenzen für die Incident Response:
- Alles, was das Projekt verändert (ein neuer Schlüssel, ein neuer Owner, ein Startskript, ein gelöschter Sink), steht unabhängig von der Konfiguration über ein Jahr lang in Admin Activity.
- Alles, was Daten liest (ein Bucket, der Objekt für Objekt heruntergeladen wird, ein abgerufenes Secret, ein für ein Dienstkonto ausgestelltes Token), existiert nur, wenn das Data-Access-Logging vor dem Vorfall aktiviert war, und standardmäßig nur 30 Tage lang. Der Artikel zu den Grenzen der Data-Access-Logs behandelt diesen blinden Fleck.
Aufbau eines Audit-Eintrags
Jeder Eintrag ist ein LogEntry mit einem protoPayload vom Typ google.cloud.audit.AuditLog (AuditLog-Referenz). Diese Felder liest ein Ermittler zuerst:
| Feld | Warum es wichtig ist |
|---|---|
timestamp | Wann der Aufruf stattfand (UTC) |
protoPayload.methodName | Was getan wurde, z. B. SetIamPolicy, v1.compute.instances.setMetadata |
protoPayload.serviceName | Welche API, z. B. iam.googleapis.com |
protoPayload.authenticationInfo.principalEmail | Wer: ein Benutzer, ein Dienstkonto, ein Gmail-Konto |
protoPayload.authenticationInfo.serviceAccountKeyName | Vorhanden, wenn sich ein Dienstkonto mit einem nutzerverwalteten Schlüssel authentifiziert hat; endet mit der Schlüssel-ID |
protoPayload.authenticationInfo.serviceAccountDelegationInfo | Vorhanden, wenn die Identität des Dienstkontos angenommen wurde; nennt den eigentlichen Aufrufer |
protoPayload.requestMetadata.callerIp / callerSuppliedUserAgent | Von wo, mit welchem Client (gcloud, Terraform, ein Browser) |
protoPayload.resourceName, resource.labels | Auf welcher Ressource |
protoPayload.status.code | Leer bei Erfolg; 7 ist PERMISSION_DENIED |
protoPayload.serviceData.policyDelta / metadata | Die Differenz: IAM-bindingDeltas, auditConfigDeltas, hinzugefügte oder entfernte Metadatenschlüssel |
Der User-Agent wird unterschätzt. Ein Dienstkonto, das immer von Terraform/… aus aufruft und plötzlich mit google-cloud-sdk gcloud/… von einer unbekannten IP kommt, ist für sich allein schon eine starke Spur.
Audit-Logs für die Analyse exportieren
Exportieren Sie früh. Die Export-Anleitung auf der Tool-Seite enthält dieselben Schritte in Kurzform; hier folgen die Überlegungen hinter jedem Weg.
Download aus dem Logs Explorer
Gut geeignet für einige Tage eines kleinen Projekts. Unter Logging → Logs Explorer fragen Sie ab:
logName:"cloudaudit.googleapis.com"
Ergänzen Sie OR logName:"vpc_flows", wenn Sie auch Flow-Logs möchten, wählen Sie den Zeitraum und dann Aktionen → Herunterladen → JSON. Google dokumentiert ein Limit von 10.000 Einträgen pro Download (Oberfläche des Logs Explorer): Teilen Sie den Zeitraum auf mehrere Downloads auf und behalten Sie jede Datei. Wählen Sie JSON, nicht CSV; CSV verliert die verschachtelte Struktur, die die Erkennungen brauchen.
gcloud logging read
Der zuverlässigste Weg für größere Exporte (gcloud-logging-Referenz):
gcloud logging read 'logName:"cloudaudit.googleapis.com"' \
--project=PROJECT_ID --freshness=30d --format=json > audit.json
gzip audit.json
Verwenden Sie --organization=ORG_ID oder --folder=FOLDER_ID, wenn ein aggregierter Sink auf Organisationsebene oder Ordner-Logs relevant sind. Führen Sie einen zweiten Export für logName:"vpc_flows" aus.
Einen Log-Sink-Bucket kopieren
Leitet bereits ein Log-Sink Audit-Logs nach Cloud Storage, haben Sie die besten Beweise: Dateien, gegliedert als cloudaudit.googleapis.com/activity/YYYY/MM/DD/…json, ein JSON-Objekt pro Zeile, so weit zurück, wie der Sink existiert. Kopieren Sie den Bucket mit gcloud storage cp -r gs://BUCKET . und behalten Sie die Ordnerstruktur bei. Sinks füllen nicht rückwirkend auf: Sie enthalten nur Einträge, die nach ihrer Erstellung geschrieben wurden (Sinks konfigurieren). Brauchen Sie ältere Einträge, die noch in einem Log-Bucket liegen, dokumentiert Google das Kopieren von Log-Einträgen nach Cloud Storage.
BigQuery-Sink
Mit einem BigQuery-Sink fragen Sie die Tabellen cloudaudit_googleapis_com_activity und cloudaudit_googleapis_com_data_access für den Zeitraum ab und speichern das Ergebnis als zeilengetrenntes JSON. Der Analyzer bildet die Spalten protopayload_auditlog wieder auf die Struktur eines LogEntry ab. Avro- oder Parquet-Exporte liest er nicht.
Und VPC Flow Logs?
VPC Flow Logs sind keine Audit-Logs: Es sind stichprobenartig erfasste Netzwerk-Flow-Datensätze (compute.googleapis.com/vpc_flows), die nur für Subnetze geschrieben werden, in denen sie aktiviert wurden. Exportieren Sie sie auf dieselbe Weise und analysieren Sie sie zusammen mit den Audit-Logs, damit sich Aufrufer-IPs mit dem Netzwerkverkehr abgleichen lassen. Siehe Analyse von VPC Flow Logs.
Checkliste vor Beginn der Analyse
- Der Zeitraum deckt das vermutete Eindringen ab, plus eine Baseline normaler Aktivität (eine Woche oder mehr).
- Alle vier Audit-Typen sind enthalten, für jedes betroffene Projekt, dazu Logs auf Organisationsebene, falls sich IAM- oder Organisationsrichtlinien geändert haben könnten.
- Die Formate sind JSON oder JSON Lines, gzip-komprimiert oder nicht. Lassen Sie die Originaldateien unangetastet und arbeiten Sie mit Kopien.
- Sie haben notiert, ob Data-Access-Logs aktiviert waren und für welche Dienste. Fehlende Spuren von Lesezugriffen sagen ohne diese Notiz nichts aus.
Legen Sie die Dateien dann im Analyzer ab, wie in der Schritt-für-Schritt-Anleitung beschrieben.
Häufige Fragen
Welche Cloud Audit Logs sind standardmäßig aktiviert?
Admin-Activity-, System-Event- und Policy-Denied-Audit-Logs werden immer geschrieben und lassen sich nicht deaktivieren. Data-Access-Audit-Logs sind standardmäßig für alle Dienste deaktiviert, mit Ausnahme einiger BigQuery-Dienste (Data-Access-Audit-Logs konfigurieren).
Wie exportiere ich mehr als 10.000 Log-Einträge?
Der Download im Logs Explorer endet bei 10.000 Einträgen. Verwenden Sie gcloud logging read mit --format=json, kopieren Sie den Cloud-Storage-Bucket, in den ein Sink schreibt, oder exportieren Sie aus einem BigQuery-Sink als zeilengetrenntes JSON.
Weiterführende Links
- Cloud Audit Logs overview – Dokumentation von Google Cloud.
- Best practices for Cloud Audit Logs – Dokumentation von Google Cloud.
- Incident Response in Google Cloud: kompromittiertes Projekt – wo diese Logs in der Untersuchung ihren Platz haben.