Szenarien für das Exportieren von Logging-Daten: Sicherheits- und Zugriffsanalysen

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

In diesem Dokument wird gezeigt, wie Logs zur Erfüllung der Sicherheits- und Analyseanforderungen der Cloud-Infrastrukturumgebung Ihrer Organisation von Cloud Logging an Ziele wie BigQuery, Chronicle oder ein SIEM eines Drittanbieters exportiert werden. Organisationen verwenden solche Sicherheitsanalysetools häufig, um Bedrohungen wie Malware, Phishing, Ransomware und potenzielle Fehlkonfigurationen von Assets zu verhindern, zu erkennen und darauf zu reagieren. Zur Erfüllung dieser Sicherheits- und Analyseanforderungen führt dieses Dokument zuerst die verschiedenen sicherheitsrelevanten Logs in Ihrer Google Cloud-Umgebung ein, von Ihren Anwendungslogs bis zu Plattformlogs und zusätzlich zu Audit-Logs wie Administratoraktivitätslogs und Logs zum Datenzugriff.

Mit dem Logbereichstool können Sie diese sicherheitsrelevanten Logtypen zuerst im Hinblick auf die von ihnen bereitgestellten Sichtbarkeits- und Bedrohungserkennungsfunktionen bewerten. Mit dem Tool können Sie Bedrohungstaktiken und -techniken aus dem beliebten MITRE ATT&CK®-Bedrohungsmodell den jeweiligen Google Cloud-Logtypen zuordnen, die Ihnen bei der Untersuchung dieser häufigen Bedrohungen helfen würden. Auf ähnliche Weise werden die Module Event Threat Detection von Security Command Center den entsprechenden Google Cloud-Logquellen zugeordnet, auf die sie sich verlassen.

In diesem Szenario werden die exportierten Logs an ein Dataset in BigQuery übertragen, das Sie zusätzlich zum benutzerdefinierten Logging-Filter als Teil des Exports konfigurieren. Sie erteilen Berechtigungen, um den Zugriff auf die Logs entsprechend zu beschränken. Sie können die Verwaltung und Abfrage der Daten vereinfachen, wenn Sie die Logsenke so konfigurieren, dass die Daten in partitionierte Tabellen exportiert werden, in denen Daten nach dem Feld timestamp des Logeintrags partitioniert sind. Mit diesem Ansatz können Sie die Abfragekosten reduzieren. Verringern Sie dazu die Anzahl der als Teil von Abfragen gescannten Daten. Ein weiterer Vorteil partitionierter Tabellen ist, dass Sie den Ablauf der Partition festlegen können - auf der Ebene der einzelnen Tabelle oder des gesamten Datasets -, sodass die Logging-Daten nur so lange wie nötig aufbewahrt werden. Beispielsweise können Sie Auditprotokolldaten für 3 Jahre aufbewahren. Ältere Daten werden dann automatisch gelöscht, wenn die Partitionen ablaufen.

Dieses Szenario ist Bestandteil der Reihe Entwurfsmuster zum Exportieren mit Cloud Logging.

Prüfen, welche Logs exportiert werden sollen

Logbereichstool

Das folgende interaktive Logbereichstool bietet wertvolle sicherheitsrelevante Logs in Google Cloud, darunter Cloud-Audit-Logs, Access Transparency-Logs und mehrere Plattformlogs. Das Tool hilft Ihnen bei der Beurteilung, welche Logs exportiert und analysiert werden sollen, um Ihre eigenen Sicherheits- und Complianceanforderungen zu erfüllen. Dazu ordnet es jeden Logtyp den folgenden entsprechenden Elementen zu:

Wählen Sie die gewünschten Logtypen aus, um automatisch einen geeigneten Logfilter im Abschnitt Logging-Export einrichten zu generieren.

Logfilter aufzeichnen

Erstellen Sie in Cloud Shell eine Variable, um den zuvor generierten Logfilter zu speichern. Sie können diese abhängig von Ihren Anforderungen auch weiter verfeinern. Sie können beispielsweise Ressourcen nur in einem oder in mehreren bestimmten Projekten filtern (oder ausschließen).

export LOG_FILTER='log-filter'

Logging-Export einrichten

Das folgende Diagramm zeigt die Schritte zum Aktivieren des Logging-Exports zu BigQuery.

  • Dataset für den Logging-Export in BigQuery einrichten
  • Audit-Logging für alle Google Cloud-Dienste aktivieren
  • Plattformlogs für bestimmte Google Cloud-Dienste aktivieren
  • Logging-Export konfigurieren
  • IAM-Richtlinienberechtigungen für das BigQuery-Dataset festlegen

Logging-Export nach BigQuery aktivieren

Dataset in BigQuery einrichten

Folgen Sie der Anleitung zum Einrichten eines Datasets, das Ihre exportierten Protokolle hostet. Wenn Sie zusammengefasste Logs verwenden, sollte sich das BigQuery-Dataset in einem der Google Cloud-Projekte in Ihrer Organisation befinden. Wenn Sie Logexporte für ein einzelnes Projekt verwenden, sollte sich das BigQuery-Dataset im selben Projekt befinden.

Audit-Logging für alle Dienste aktivieren

Audit-Logs zum Datenzugriff sind – außer für BigQuery – standardmäßig deaktiviert. Informationen zum Konfigurieren von Audit-Logs zum Datenzugriff direkt in der Cloud Console finden Sie unter Audit-Logs zum Datenzugriff konfigurieren. Alternativ können Sie Audit-Logs für den Datenzugriff mit gcloud konfigurieren. Verwenden Sie dazu IAM-Richtlinienobjekte. Eine Beispielkonfiguration für eine IAM-Richtlinie, die Audit-Logs zum Datenzugriff für alle Dienste und alle Nutzer aktiviert, finden Sie unter Alle Audit-Logs zum Datenzugriff aktivieren.

Dienstspezifische Plattformlogs aktivieren

Plattformlogs müssen für jeden einzelnen Dienst aktiviert werden, in der Regel auf Ressourcenebene. Beispielsweise werden Cloud DNS-Logs auf VPC-Netzwerkebene, VPC-Flusslogs auf der Subnetzebene für alle VMs im Subnetz und Firewallregeln auf deren jeweiliger Ebene aktiviert. Weitere Informationen zum Aktivieren eines bestimmten Logtyps finden Sie unter Logbereichstool. Klicken Sie in der jeweiligen Zeile auf den Link Aktivieren.

Logging-Export konfigurieren

Verwenden Sie im Google CLoud CLI den Befehl gcloud logging sinks create oder den API-Aufruf organizations.sinks.create, um Folgendes zu erstellen: Eine Senke mit dem entsprechenden Logging-Filter. Im folgenden Beispiel wird mit dem Befehl gcloud eine Senke mit dem Namen gcp_logging_sink_bq für die Organisation erstellt. Die Senke enthält alle untergeordneten Projekte und gibt den Logfilter an, der in der oben erstellten Variablen $LOG_FILTER gespeichert ist.

gcloud logging sinks create gcp_logging_sink_bq \
     bigquery.googleapis.com/projects/compliance-logging-export/datasets/gcp_logging_export \
     --use-partitioned-tables \
     --log-filter='$LOG_FILTER' \
     --include-children \
     --organization=324989855333

Die entsprechende Ausgabe sieht etwa so aus:

Created [https://logging.googleapis.com/v2/organizations/324989855333/sinks/gcp_logging_sink_bq].
Please remember to grant `serviceAccount:gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com` the WRITER role on the dataset..
More information about sinks can be found at /logging/docs/export/configure_export

Im Eintrag serviceAccount, der vom API-Aufruf zurückgegeben wird, ist die Identität gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com in der Antwort enthalten. Diese Identität stellt ein Google Cloud-Dienstkonto dar, das speziell für Ihren Logexport erstellt wurde. Solange Sie dieser Identität keinen Schreibzugriff auf das BigQuery-Dataset erteilen, schlägt der Export von Logeinträgen aus dieser Senke fehl. Weitere Informationen finden Sie in folgenden Abschnitten:

IAM-Richtlinienberechtigungen für das BigQuery-Dataset festlegen

Durch Hinzufügen des Dienstkontos gcp-logging-sink-bq@logging-o324989855333.iam.gserviceaccount.com zum Dataset gcp_logging_export mit Bearbeiterberechtigungen erteilen Sie dem Dienstkonto die Berechtigung, in das Ziel zu schreiben. Ohne diese Berechtigungen schlägt der Export aus der Senke fehl.

So fügen Sie dem Dienstkonto die Berechtigungen hinzu:

  1. Wechseln Sie in der Google Cloud Console zu BigQuery:

    BigQuery aufrufen

  2. Öffnen Sie das neu erstellte Dataset gcp_logging_export.

  3. Klicken Sie im Tab „Dataset-Informationen“ auf das Drop-down-Menü Freigabe und dann auf Berechtigungen.

  4. Klicken Sie in der Seitenleiste mit den Dataset-Berechtigungen auf Hauptkonto hinzufügen.

  5. Geben Sie im Feld Neue Hauptkonten das Dienstkonto ein. Wählen Sie wie in der folgenden Abbildung gezeigt im Drop-down-Menü Rolle die Option BigQuery-Dateneditor aus:

    IAM-Richtlinienberechtigungen – Editor

Nachdem Sie den Logging-Export mithilfe dieses Filters erstellt haben, werden die Protokolldateien im konfigurierten Projekt in das BigQuery-Dataset eingepflegt.

Berechtigungen können Sie zum Beispiel so gewähren:

  • Entfernen Sie alle nicht erforderlichen Nutzer aus den Berechtigungen für das BigQuery-Dataset.
  • Geben Sie dem BigQuery-Administrator die uneingeschränkte Kontrolle.
  • Gewähren Sie dem Exportdienstkonto Berechtigungen zum Schreiben der Exportlogs.
  • Gewähren Sie anderen einzelnen Nutzern Lesezugriff auf die Google Cloud-Logging-Exporte.

Exportierte Logs verwenden

Wenn Sie die Logs in ein BigQuery-Dataset exportieren, werden in Cloud Logging für die exportierten Logeinträge Tabellen erstellt. Die Namen der Tabellen, in die die Logeinträge geschrieben werden, sind nach den Lognamen der Einträge benannt und nach den Zeitstempeln der Einträge partitioniert. Audit-Logs für den Datenzugriff werden beispielsweise an die Tabelle cloudaudit_googleapis_com_data_access weitergeleitet, wie in der folgenden Abbildung dargestellt:

Grafik: Liste der Tabellen mit Schema.

Sowohl Administratoraktivitäts- als auch Datenzugriffslogs werden in BigQuery im Format protoPayload geladen. Ausführliche Informationen zu Schema-Konvertierungen, die von Cloud Logging vor dem Schreiben in BigQuery ausgeführt werden, finden Sie unter Felder in exportierten Audit-Logs.

Beispielfragen- und -abfragen

Sie können viele verschiedene Abfragen für die Auditprotokolle ausführen. Mithilfe dieser Abfragen werden Analysen durchgeführt, um herauszufinden, wer auf Daten in Google Cloud zugreift oder sie ändert. Ersetzen Sie gcp_logging_export durch den Namen Ihres BigQuery-Datasets.

Welche Nutzer haben in der letzten Woche am häufigsten auf Daten zugegriffen?

Bei der folgenden Abfrage werden die Audit-Logs zum Datenzugriff verwendet, um die Nutzeridentitäten zu finden, die in der vergangenen Woche am häufigsten auf BigQuery-Tabellendaten zugegriffen haben.

SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

Welche Nutzer haben letzten Monat auf die Daten in der Tabelle "accounts" zugegriffen?

Bei der folgenden Abfrage werden die Audit-Logs für den Datenzugriff verwendet, um das Nutzerkonto zu finden, das am häufigsten die Tabelle "accounts" im letzten Monat abgefragt hat. Ersetzen Sie MY_PROJECT_ID und MY_DATASET durch Ihre Projekt-ID bzw. Ihr Dataset.

SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`,
  UNNEST(protopayload_auditlog.authorizationInfo) authorizationInfo
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND authorizationInfo.permission = "bigquery.tables.getData"
  AND authorizationInfo.resource = "projects/MY_PROJECT_ID/datasets/MY_DATASET/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

Welche Nutzer haben in der letzten Woche VMs gelöscht?

Bei der folgenden Abfrage werden die Audit-Logs zur Administratoraktivität verwendet, um die Nutzeridentitäten zu finden, die in der vergangenen Woche VMs gelöscht haben.

SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance"
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  resource.labels.instance_id
LIMIT
  1000

Bei der folgenden Abfrage werden die Cloud-Auditprotokolle zu Administratoraktivitäten verwendet, um herauszufinden, wie oft Autoscaling im letzten Monat verwendet wurde.

SELECT
  protopayload_auditlog.methodName,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  1
LIMIT
  1000

Mit der folgenden Abfrage können Sie den Trend für Vorgänge des Instanzmanagers in Compute Engine im Zeitverlauf anzeigen, aufgeschlüsselt nach Tag.

SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

Sie können die vorherige Abfrage als benutzerdefinierte Datenquellenabfrage in Google Data Studio verwenden, um den Trend im Zeitverlauf zu visualisieren. Ein Beispiel wird in der folgenden Abbildung dargestellt.

Data Studio-Visualisierung

Weitere Informationen finden Sie unter Benutzerdefinierte Data Studio-Abfragen.

Auf welche Tabellen wird am häufigsten zugegriffen und von wem?

Bei der folgenden Abfrage werden die Audit-Logs für den Datenzugriff verwendet, um die BigQuery-Tabellen mit den am häufigsten gelesenen und geänderten Daten im letzten Monat zu finden. Diese Abfrage ruft die zugeordnete Nutzeridentität sowie eine Aufschlüsselung der Gesamtzahl der Daten ab, die gelesen und geändert wurden.

SELECT
  protopayload_auditlog.resourceName,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

Was sind die Top-10-Abfragen für BigQuery der vergangenen Woche?

Bei der folgenden Abfrage werden die Audit-Logs für den Datenzugriff verwendet, um die am häufigsten verwendeten Abfragen der letzten Woche zu finden. Außerdem werden die entsprechenden Nutzer und referenzierten Tabellen aufgeführt.

SELECT
  COALESCE(
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_data_access`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobChange") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

Was sind die häufigsten Aktionen, die im Datenzugriffslog des letzten Monats aufgezeichnet wurden?

Bei der folgenden Abfrage werden alle Cloud-Audit-Logs verwendet, um die 100 häufigsten Aktionen zu finden, die im letzten Monat aufgezeichnet wurden.

SELECT
  ANY_VALUE(_TABLE_SUFFIX),
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type,
  COUNT(*) AS counter
FROM `gcp_logging_export.cloudaudit_googleapis_com_*`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

Nächste Schritte