Snowflake-Logs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie Snowflake-Logs in Google Security Operations aufnehmen. Sie können die Aufnahme mit zwei Methoden konfigurieren: Cloud Storage V2 (empfohlen) oder Amazon S3 V2. Bei beiden Methoden wird auf Snowflake-Seite derselbe Mechanismus verwendet: Bei einem geplanten Task werden Daten zur Kontonutzung in eine externe Staging-Umgebung entladen und Google SecOps liest die exportierten Dateien mit einem Feed.

Snowflake ist eine Cloud-Datenplattform, auf der Kontoaktivitäten im Schema SNOWFLAKE.ACCOUNT_USAGE gespeichert werden. In der Ansicht LOGIN_HISTORY werden Authentifizierungsversuche aufgezeichnet, einschließlich der Client-IP-Adresse, des Authentifizierungsfaktors und des Grunds für den Fehler. In der Ansicht QUERY_HISTORY wird jede im Konto ausgeführte Anweisung aufgezeichnet, einschließlich des Nutzers, der Rolle, des Data Warehouse und der betroffenen Objekte.

Hinweis

Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:

  • Eine Google SecOps-Instanz
  • Zugriff auf Snowflake mit einer Rolle, die Speicherintegrationen erstellen kann (standardmäßig hat nur ACCOUNTADMIN diese Berechtigung), Datenbanken, Warehouses, Stagingbereiche und Aufgaben
  • Für Cloud Storage V2: ein Google Cloud -Projekt mit aktivierter Cloud Storage API und Berechtigungen zum Erstellen von Buckets, IAM-Rollen (Identity and Access Management) und zum Verwalten von Bucket-IAM-Richtlinien
  • Für Amazon S3 V2: privilegierter Zugriff auf AWS zum Erstellen von S3-Buckets, IAM-Richtlinien, IAM-Rollen und IAM-Nutzern

Zugriff auf Snowflake-Kontonutzungsdaten gewähren

Die Ansichten SNOWFLAKE.ACCOUNT_USAGE sind für ACCOUNTADMIN erst lesbar, wenn der Zugriff explizit gewährt wird. Erstellen Sie eine spezielle Rolle für den Export und weisen Sie ihr die beiden Datenbankrollen zu, die die in diesem Dokument exportierten Ansichten abdecken.

  1. Melden Sie sich in Snowflake an und öffnen Sie ein Arbeitsblatt.
  2. Erstellen Sie die Exportrolle und gewähren Sie ihr Lesezugriff auf die Ansichten zur Kontonutzung:

    USE ROLE ACCOUNTADMIN;
    
    CREATE ROLE IF NOT EXISTS SECOPS_EXPORTER;
    
    GRANT DATABASE ROLE SNOWFLAKE.SECURITY_VIEWER TO ROLE SECOPS_EXPORTER;
    GRANT DATABASE ROLE SNOWFLAKE.GOVERNANCE_VIEWER TO ROLE SECOPS_EXPORTER;
    
  3. Erstellen Sie die Datenbank, das Schema und das Warehouse, die für den Export verwendet werden, und gewähren Sie der Rolle die entsprechenden Berechtigungen:

    CREATE DATABASE IF NOT EXISTS SECOPS_EXPORT;
    CREATE SCHEMA IF NOT EXISTS SECOPS_EXPORT.ACTIVITY;
    
    CREATE WAREHOUSE IF NOT EXISTS SECOPS_EXPORT_WH
        WITH WAREHOUSE_SIZE = 'XSMALL'
        AUTO_SUSPEND = 60
        AUTO_RESUME = TRUE
        INITIALLY_SUSPENDED = TRUE;
    
    GRANT USAGE ON DATABASE SECOPS_EXPORT TO ROLE SECOPS_EXPORTER;
    GRANT USAGE, CREATE STAGE, CREATE TABLE, CREATE PROCEDURE, CREATE TASK, CREATE FILE FORMAT
        ON SCHEMA SECOPS_EXPORT.ACTIVITY TO ROLE SECOPS_EXPORTER;
    GRANT USAGE, OPERATE ON WAREHOUSE SECOPS_EXPORT_WH TO ROLE SECOPS_EXPORTER;
    GRANT EXECUTE TASK ON ACCOUNT TO ROLE SECOPS_EXPORTER;
    GRANT ROLE SECOPS_EXPORTER TO USER <YOUR_USER>;
    
    • Ersetzen Sie <YOUR_USER> durch den Snowflake-Nutzer, dem der Export gehört.

Cloud Storage-Bucket erstellen

  1. Rufen Sie die Google Cloud Console auf.
  2. Wählen Sie Ihr Projekt aus oder erstellen Sie ein neues.
  3. Rufen Sie im Navigationsmenü Cloud Storage > Buckets auf.
  4. Klicken Sie auf Bucket erstellen.
  5. Geben Sie die folgenden Konfigurationsdetails an:

    Einstellung Wert
    Bucket benennen Geben Sie einen global eindeutigen Namen ein, z. B. snowflake-activity-logs.
    Standorttyp Wählen Sie die Option aus, die am besten zu Ihren Anforderungen passt (Region, Dual-Region, Multi-Region).
    Standort Wählen Sie den Speicherort aus, z. B. us-central1.
    Speicherklasse Standard (empfohlen für Logs, auf die häufig zugegriffen wird)
    Zugriffskontrolle Einheitlich (empfohlen)
    Schutztools Optional: Objektversionierung oder Aufbewahrungsrichtlinie aktivieren
  6. Klicken Sie auf Erstellen.

Benutzerdefinierte Cloud Storage-Rolle für Snowflake erstellen

  1. Rufen Sie in der Google Cloud Console die Seite IAM & Verwaltung > Rollen auf.
  2. Klicken Sie auf Rolle erstellen.
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Titel: Geben Sie Snowflake Unload ein.
    • ID: Geben Sie snowflake_unload ein.
    • Rollenstartphase: Wählen Sie Allgemeine Verfügbarkeit aus.
  4. Klicken Sie auf Berechtigungen hinzufügen und fügen Sie die folgenden Berechtigungen hinzu:
    • storage.buckets.get
    • storage.objects.create
    • storage.objects.delete
    • storage.objects.list
  5. Klicken Sie auf Erstellen.

Snowflake-Speicherintegration für Cloud Storage erstellen

  1. Erstellen Sie die Speicherintegration in einem Snowflake-Arbeitsblatt so:

    USE ROLE ACCOUNTADMIN;
    
    CREATE STORAGE INTEGRATION SECOPS_GCS_INT
        TYPE = EXTERNAL_STAGE
        STORAGE_PROVIDER = 'GCS'
        ENABLED = TRUE
        STORAGE_ALLOWED_LOCATIONS = ('gcs://snowflake-activity-logs/snowflake/');
    
    GRANT USAGE ON INTEGRATION SECOPS_GCS_INT TO ROLE SECOPS_EXPORTER;
    
    • Ersetzen Sie snowflake-activity-logs durch den Namen Ihres Buckets.
  2. Rufen Sie das Dienstkonto ab, das Snowflake für die Integration erstellt hat:

    DESC STORAGE INTEGRATION SECOPS_GCS_INT;
    
  3. Kopieren Sie den Wert der Property STORAGE_GCP_SERVICE_ACCOUNT. Der Wert hat das folgende Format:

    service-account-id@project1-123456.iam.gserviceaccount.com
    

Snowflake-Dienstkonto Zugriff auf den Bucket gewähren

  1. Rufen Sie in der Google Cloud Console Cloud Storage > Buckets auf.
  2. Klicken Sie auf den Bucket, den Sie erstellt haben (z. B. snowflake-activity-logs).
  3. Wechseln Sie zum Tab Berechtigungen.
  4. Klicken Sie auf Zugriff erlauben.
  5. Geben Sie die folgenden Konfigurationsdetails an:
    • Hauptkonten hinzufügen: Fügen Sie den STORAGE_GCP_SERVICE_ACCOUNT-Wert ein.
    • Rollen zuweisen: Wählen Sie Snowflake Unload aus.
  6. Klicken Sie auf Speichern.

Dateiformat und externe Staging-Umgebung erstellen

  1. Erstellen Sie in einem Snowflake-Arbeitsblatt das Dateiformat und die Staging-Umgebung, in die in den Bucket geschrieben wird:

    USE ROLE SECOPS_EXPORTER;
    USE SCHEMA SECOPS_EXPORT.ACTIVITY;
    
    CREATE OR REPLACE FILE FORMAT SECOPS_JSON_FORMAT
        TYPE = JSON;
    
    CREATE OR REPLACE STAGE SECOPS_EXPORT_STAGE
        URL = 'gcs://snowflake-activity-logs/snowflake/'
        STORAGE_INTEGRATION = SECOPS_GCS_INT
        FILE_FORMAT = SECOPS_JSON_FORMAT;
    

Exportstatus-Tabelle erstellen

Beim Export wird nachverfolgt, wie weit in jeder Ansicht gelesen wurde. Ohne dieses Wasserzeichen würde bei jedem Lauf die gesamte Ansicht noch einmal exportiert und dieselben Ereignisse würden noch einmal aufgenommen.

  1. Erstellen Sie die Status-Tabelle und füllen Sie sie so:

    CREATE TABLE IF NOT EXISTS SECOPS_EXPORT_STATE (
        VIEW_NAME STRING NOT NULL,
        LAST_EXPORTED TIMESTAMP_LTZ NOT NULL,
        WINDOW_END TIMESTAMP_LTZ
    );
    
    INSERT INTO SECOPS_EXPORT_STATE (VIEW_NAME, LAST_EXPORTED)
        SELECT 'LOGIN_HISTORY', DATEADD('day', -7, CURRENT_TIMESTAMP())
        UNION ALL
        SELECT 'QUERY_HISTORY', DATEADD('day', -7, CURRENT_TIMESTAMP());
    

Exportprozedur erstellen

  1. Erstellen Sie die Prozedur, mit der beide Ansichten entladen und das Wasserzeichen verschoben wird:

    CREATE OR REPLACE PROCEDURE SECOPS_EXPORT_ACTIVITY()
    RETURNS STRING
    LANGUAGE SQL
    AS
    $$
    BEGIN
        UPDATE SECOPS_EXPORT_STATE
            SET WINDOW_END = DATEADD('hour', -3, CURRENT_TIMESTAMP());
    
        COPY INTO @SECOPS_EXPORT_STAGE/login_history/
            FROM (
                SELECT OBJECT_CONSTRUCT(
                    'application', 'snowflake',
                    'log_type', 'login_history',
                    'EVENT_TIMESTAMP', EVENT_TIMESTAMP,
                    'EVENT_TYPE', EVENT_TYPE,
                    'USER_NAME', USER_NAME,
                    'CLIENT_IP', CLIENT_IP,
                    'REPORTED_CLIENT_TYPE', REPORTED_CLIENT_TYPE,
                    'REPORTED_CLIENT_VERSION', REPORTED_CLIENT_VERSION,
                    'FIRST_AUTHENTICATION_FACTOR', FIRST_AUTHENTICATION_FACTOR,
                    'SECOND_AUTHENTICATION_FACTOR', SECOND_AUTHENTICATION_FACTOR,
                    'IS_SUCCESS', IS_SUCCESS,
                    'ERROR_CODE', ERROR_CODE,
                    'ERROR_MESSAGE', ERROR_MESSAGE)
                FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
                WHERE EVENT_TIMESTAMP > (SELECT LAST_EXPORTED FROM SECOPS_EXPORT_STATE WHERE VIEW_NAME = 'LOGIN_HISTORY')
                    AND EVENT_TIMESTAMP <= (SELECT WINDOW_END FROM SECOPS_EXPORT_STATE WHERE VIEW_NAME = 'LOGIN_HISTORY')
            )
            FILE_FORMAT = (TYPE = JSON)
            INCLUDE_QUERY_ID = TRUE;
    
        UPDATE SECOPS_EXPORT_STATE
            SET LAST_EXPORTED = WINDOW_END
            WHERE VIEW_NAME = 'LOGIN_HISTORY';
    
        COPY INTO @SECOPS_EXPORT_STAGE/query_history/
            FROM (
                SELECT OBJECT_CONSTRUCT(
                    'application', 'snowflake',
                    'log_type', 'query_history',
                    'START_TIME', START_TIME,
                    'END_TIME', END_TIME,
                    'QUERY_ID', QUERY_ID,
                    'QUERY_TYPE', QUERY_TYPE,
                    'EXECUTION_STATUS', EXECUTION_STATUS,
                    'ERROR_MESSAGE', ERROR_MESSAGE,
                    'USER_NAME', USER_NAME,
                    'ROLE_NAME', ROLE_NAME,
                    'WAREHOUSE_NAME', WAREHOUSE_NAME,
                    'WAREHOUSE_SIZE', WAREHOUSE_SIZE,
                    'DATABASE_NAME', DATABASE_NAME,
                    'SCHEMA_NAME', SCHEMA_NAME,
                    'SESSION_ID', SESSION_ID,
                    'BYTES_SCANNED', BYTES_SCANNED,
                    'ROWS_PRODUCED', ROWS_PRODUCED,
                    'TOTAL_ELAPSED_TIME', TOTAL_ELAPSED_TIME)
                FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
                WHERE START_TIME > (SELECT LAST_EXPORTED FROM SECOPS_EXPORT_STATE WHERE VIEW_NAME = 'QUERY_HISTORY')
                    AND START_TIME <= (SELECT WINDOW_END FROM SECOPS_EXPORT_STATE WHERE VIEW_NAME = 'QUERY_HISTORY')
            )
            FILE_FORMAT = (TYPE = JSON)
            INCLUDE_QUERY_ID = TRUE;
    
        UPDATE SECOPS_EXPORT_STATE
            SET LAST_EXPORTED = WINDOW_END
            WHERE VIEW_NAME = 'QUERY_HISTORY';
    
        RETURN 'Export completed';
    END;
    $$;
    

Jedes Element des Verfahrens hat einen bestimmten Zweck:

  • Das Fenster schließt drei Stunden nach der aktuellen Zeit. Snowflake füllt LOGIN_HISTORY mit einer Latenz von bis zu zwei Stunden und QUERY_HISTORY mit einer Latenz von bis zu 45 Minuten. Bei einem Fenster, das jetzt endet, werden also Zeilen übersprungen, die in der Ansicht noch nicht materialisiert wurden. Ereignisse erreichen Google SecOps daher etwa drei Stunden nach ihrem Eintreten. Durch Verkürzen der Verzögerung wird die Aktualität der Daten erhöht.
  • WINDOW_END wird vor dem Entladen in die Tabelle geschrieben. Der von der COPY INTO-Anweisung verwendete Wert und der in LAST_EXPORTED zurückgeschriebene Wert sind also identisch. Wenn die aktuelle Zeit in der zweiten Anweisung neu berechnet würde, würden alle Ereignisse, die in der Zwischenzeit passiert sind, übersprungen.
  • Jede LAST_EXPORTED-Aktualisierung wird nach der zugehörigen COPY INTO-Anweisung ausgeführt. Wenn das Entladen fehlschlägt, wird der Vorgang beendet, das Wasserzeichen bleibt an der ursprünglichen Position und beim nächsten Durchlauf wird das entsprechende Fenster wiederholt, anstatt es zu überspringen.
  • INCLUDE_QUERY_ID = TRUE fügt jedem Dateinamen eine UUID hinzu. Ohne diese Option werden nicht geladene Dateien mit data_0_0_0 benannt und wiederholte Exporte in denselben Pfad führen zu Konflikten, was laut Snowflake eine Quelle für doppelte Daten in der Staging-Umgebung ist.

Exportaufgabe planen

  1. So erstellen und starten Sie die Aufgabe:

    CREATE OR REPLACE TASK SECOPS_EXPORT_TASK
        WAREHOUSE = SECOPS_EXPORT_WH
        SCHEDULE = 'USING CRON 0 * * * * UTC'
        AS CALL SECOPS_EXPORT_ACTIVITY();
    
    ALTER TASK SECOPS_EXPORT_TASK RESUME;
    
  2. Führen Sie den Task einmal aus, um die Einrichtung zu überprüfen, ohne auf den Zeitplan zu warten:

    EXECUTE TASK SECOPS_EXPORT_TASK;
    
  3. So prüfen Sie das Ergebnis des Laufs und die Dateien, die die Phase erreicht haben:

    SELECT NAME, STATE, ERROR_MESSAGE, SCHEDULED_TIME
    FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME => 'SECOPS_EXPORT_TASK'))
    ORDER BY SCHEDULED_TIME DESC
    LIMIT 5;
    
    LIST @SECOPS_EXPORT_STAGE;
    

Google SecOps-Dienstkonto abrufen

Google SecOps verwendet ein eindeutiges Dienstkonto, um Daten aus Ihrem Cloud Storage-Bucket zu lesen. Sie müssen diesem Dienstkonto Zugriff auf Ihren Bucket gewähren.

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf Einzelnen Feed konfigurieren.
  4. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. Snowflake activity logs.
  5. Wählen Sie Google Cloud Storage V2 als Quelltyp aus.
  6. Wählen Sie Snowflake als Protokolltyp aus.
  7. Klicken Sie auf Dienstkonto abrufen.
  8. Es wird eine eindeutige E-Mail-Adresse für das Dienstkonto angezeigt, z. B.:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. Kopieren Sie diese E‑Mail-Adresse für den nächsten Schritt.

  10. Klicken Sie auf Weiter.

  11. Geben Sie Werte für die folgenden Eingabeparameter an:

    • Storage-Bucket-URL: Geben Sie den Cloud Storage-Bucket-URI mit dem Präfixpfad ein:

      gs://snowflake-activity-logs/snowflake/
      
    • Option zum Löschen der Quelle: Wählen Sie die gewünschte Option zum Löschen aus:

      • Dateien nie löschen: Dateien werden nie aus der Quelle gelöscht (empfohlen für Tests).
      • Übertragene Dateien und leere Verzeichnisse löschen: Dateien und leere Verzeichnisse werden nach einem erfolgreichen Abruf aus der Quelle gelöscht.
    • Höchstalter der Datei: Dateien einbeziehen, die in den letzten Tagen geändert wurden (Standardwert: 180 Tage)

    • Asset-Namespace: Der Asset-Namespace

    • Labels für Datenaufnahme: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll

  12. Klicken Sie auf Weiter.

  13. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

Dem Google SecOps-Dienstkonto IAM-Berechtigungen gewähren

Das Google SecOps-Dienstkonto benötigt zwei Rollen für Ihren Cloud Storage-Bucket: Storage Object Viewer zum Lesen der Logobjekte und eine Rolle auf Bucket-Ebene zum Lesen der Bucket-Metadaten.

  1. Rufen Sie Cloud Storage > Buckets auf.
  2. Klicken Sie auf den Namen Ihres Buckets.
  3. Wechseln Sie zum Tab Berechtigungen.
  4. Klicken Sie auf Zugriff erlauben.
  5. Geben Sie die folgenden Konfigurationsdetails an:
    • Hauptkonten hinzufügen: Fügen Sie die E‑Mail-Adresse des Google SecOps-Dienstkontos ein.
    • Rollen zuweisen: Wählen Sie die folgenden beiden Optionen aus:
      • Storage Object Viewer: Liest die Logobjekte.
      • Leser alter Storage-Buckets: Berechtigt zum Lesen der Bucket-Metadaten. Wenn Sie die Löschoption Übertragene Dateien und leere Verzeichnisse löschen ausgewählt haben, wählen Sie stattdessen Storage Legacy Bucket Writer aus. Dadurch wird auch die Löschberechtigung erteilt.
  6. Klicken Sie auf Speichern.

Methode 2: Amazon S3 V2

Verwenden Sie diese Methode, wenn die Logs in Amazon S3 gespeichert werden müssen. Die Snowflake-Seite ist bis auf die Speicherintegration und die Staging-Umgebung identisch. Das Exportverfahren und die Aufgabe aus Methode 1 werden daher unverändert wiederverwendet.

Amazon S3-Bucket konfigurieren

  1. Erstellen Sie einen Amazon S3-Bucket. Folgen Sie dazu der Anleitung unter Bucket erstellen.
  2. Speichern Sie den Namen und die Region des Buckets zur späteren Verwendung. Beispiel: snowflake-activity-logs

Snowflake-AWS-IAM-Richtlinie konfigurieren

  1. Melden Sie sich bei der AWS Management Console an.
  2. Suchen Sie nach IAM und wählen Sie es aus.
  3. Wählen Sie Kontoeinstellungen aus.
  4. Suchen Sie in der Liste Endpunkte unter Security Token Service (STS) nach der Snowflake-Region, in der sich Ihr Konto befindet.
  5. Wenn der STS-Status inaktiv ist, stellen Sie den Schalter auf Aktiv.
  6. Wählen Sie Richtlinien aus.
  7. Wählen Sie Richtlinie erstellen aus.
  8. Wählen Sie im Richtlinieneditor die Option JSON aus.
  9. Kopieren Sie die folgende Richtlinie und fügen Sie sie ein. Sie gewährt Snowflake die Berechtigungen, die zum Entladen von Daten in einen Bucket- und Ordnerpfad erforderlich sind:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:GetObjectVersion",
                    "s3:DeleteObject",
                    "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::snowflake-activity-logs/snowflake/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::snowflake-activity-logs",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "snowflake/*"
                        ]
                    }
                }
            }
        ]
    }
    
  10. Klicken Sie auf Weiter.

  11. Geben Sie einen Richtliniennamen ein (z. B. snowflake_access) und optional eine Beschreibung.

  12. Klicken Sie auf Richtlinie erstellen.

Snowflake-AWS-IAM-Rolle konfigurieren

  1. Wählen Sie unter IAM die Option Rollen aus.
  2. Klicken Sie auf Rolle erstellen.
  3. Wählen Sie AWS-Konto als Art der vertrauenswürdigen Entität aus.
  4. Wählen Sie Anderes AWS-Konto aus.
  5. Geben Sie im Feld Konto-ID vorübergehend Ihre eigene AWS-Konto-ID ein. Später ändern Sie die Vertrauensstellung und gewähren Zugriff auf Snowflake.
  6. Wählen Sie die Option Externe ID erforderlich aus.
  7. Geben Sie eine Platzhalter-ID ein, z. B. 0000. Sie ersetzen sie später durch die externe ID der Speicherintegration.
  8. Klicken Sie auf Weiter.
  9. Wählen Sie die IAM-Richtlinie aus, die Sie zuvor erstellt haben.
  10. Klicken Sie auf Weiter.
  11. Geben Sie einen Namen und eine Beschreibung für die Rolle ein.
  12. Klicken Sie auf Rolle erstellen.
  13. Kopieren und speichern Sie auf der Seite „Rollenübersicht“ den Wert für Rollen-ARN.

Snowflake-Speicherintegration für Amazon S3 erstellen

  1. Erstellen Sie die Speicherintegration in einem Snowflake-Arbeitsblatt so:

    USE ROLE ACCOUNTADMIN;
    
    CREATE STORAGE INTEGRATION SECOPS_S3_INT
        TYPE = EXTERNAL_STAGE
        STORAGE_PROVIDER = 'S3'
        ENABLED = TRUE
        STORAGE_AWS_ROLE_ARN = '<IAM_ROLE_ARN>'
        STORAGE_ALLOWED_LOCATIONS = ('s3://snowflake-activity-logs/snowflake/');
    
    GRANT USAGE ON INTEGRATION SECOPS_S3_INT TO ROLE SECOPS_EXPORTER;
    
    • Ersetzen Sie <IAM_ROLE_ARN> durch den gespeicherten Rollen-ARN.
  2. So rufen Sie die AWS-Identität ab, die Snowflake für die Integration erstellt hat:

    DESC INTEGRATION SECOPS_S3_INT;
    
  3. Kopieren und speichern Sie die Werte der folgenden Attribute so:

    • STORAGE_AWS_IAM_USER_ARN
    • STORAGE_AWS_EXTERNAL_ID

Snowflake-IAM-Nutzer Zugriff auf den Bucket gewähren

  1. Rufen Sie die AWS Management Console auf.
  2. Wählen Sie IAM > Rollen aus.
  3. Wählen Sie die Rolle aus, die Sie zuvor erstellt haben.
  4. Wählen Sie den Tab Vertrauensstellungen aus.
  5. Klicken Sie auf Vertrauensrichtlinie bearbeiten.
  6. Aktualisieren Sie das Richtliniendokument mit den DESC INTEGRATION-Ausgabewerten:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "<STORAGE_AWS_IAM_USER_ARN>"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                    "StringEquals": {
                        "sts:ExternalId": "<STORAGE_AWS_EXTERNAL_ID>"
                    }
                }
            }
        ]
    }
    
  7. Klicken Sie auf Richtlinie aktualisieren.

Dateiformat erstellen, Objekte bereitstellen und exportieren

  1. Erstellen Sie in einem Snowflake-Arbeitsblatt das Dateiformat und die Staging-Umgebung, in die in den Bucket geschrieben wird:

    USE ROLE SECOPS_EXPORTER;
    USE SCHEMA SECOPS_EXPORT.ACTIVITY;
    
    CREATE OR REPLACE FILE FORMAT SECOPS_JSON_FORMAT
        TYPE = JSON;
    
    CREATE OR REPLACE STAGE SECOPS_EXPORT_STAGE
        URL = 's3://snowflake-activity-logs/snowflake/'
        STORAGE_INTEGRATION = SECOPS_S3_INT
        FILE_FORMAT = SECOPS_JSON_FORMAT;
    
  2. Erstellen Sie die Status-Tabelle, die Prozedur und die Aufgabe genau wie in Methode 1 in den Abschnitten Status-Tabelle für den Export erstellen, Exportprozedur erstellen und Exportaufgabe planen beschrieben. In den Anweisungen wird auf die Phase mit dem Namen verwiesen, sodass keine Änderung erforderlich ist.

AWS IAM für Google SecOps konfigurieren

  1. Melden Sie sich bei der AWS Management Console an.
  2. Erstellen Sie einen Nutzer gemäß dieser Anleitung: IAM-Nutzer erstellen.
  3. Wählen Sie den erstellten Nutzer aus.
  4. Wählen Sie den Tab Sicherheitsanmeldedaten aus.
  5. Klicken Sie im Bereich Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
  6. Wählen Sie als Anwendungsfall Drittanbieterdienst aus.
  7. Klicken Sie auf Weiter.
  8. Optional: Fügen Sie ein Beschreibungstag hinzu.
  9. Klicken Sie auf Zugriffsschlüssel erstellen.
  10. Klicken Sie auf CSV-Datei herunterladen, um den Zugriffsschlüssel und den geheimen Zugriffsschlüssel für die zukünftige Verwendung zu speichern.
  11. Klicken Sie auf Fertig.
  12. Wählen Sie den Tab Berechtigungen aus.
  13. Klicken Sie im Bereich Berechtigungsrichtlinien auf Berechtigungen hinzufügen.
  14. Wählen Sie Berechtigungen hinzufügen aus.
  15. Wählen Sie Richtlinien direkt anhängen aus.
  16. Suchen Sie nach der Richtlinie AmazonS3FullAccess und wählen Sie sie aus.
  17. Klicken Sie auf Weiter.
  18. Klicken Sie auf Berechtigungen hinzufügen.

Feed in Google SecOps konfigurieren, um Snowflake-Logs aufzunehmen

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf der nächsten Seite auf Einen einzelnen Feed konfigurieren.
  4. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. Snowflake activity logs.
  5. Wählen Sie Amazon S3 V2 als Quelltyp aus.
  6. Wählen Sie Snowflake als Protokolltyp aus.
  7. Klicken Sie auf Weiter.
  8. Geben Sie Werte für die folgenden Eingabeparameter an:

    • S3-URI: s3://snowflake-activity-logs/snowflake/
    • Option zum Löschen der Quelle: Wählen Sie die gewünschte Option zum Löschen aus.
    • Höchstalter der Datei: Dateien einbeziehen, die in den letzten Tagen geändert wurden (Standardwert: 180 Tage)
    • Zugriffsschlüssel-ID: Nutzerzugriffsschlüssel mit Zugriff auf den S3-Bucket
    • Geheimer Zugriffsschlüssel: Geheimer Schlüssel des Nutzers mit Zugriff auf den S3-Bucket
    • Asset-Namespace: Der Asset-Namespace
    • Labels für Datenaufnahme: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll
  9. Klicken Sie auf Weiter.

  10. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
column4_label additional.fields Zusammengeführt
column7_label additional.fields Zusammengeführt
first_authentication_factor_label additional.fields Zusammengeführt
host_list additional.fields Zusammengeführt
query_text_label additional.fields Zusammengeführt
query_type_label additional.fields Zusammengeführt
roleIds_list additional.fields Zusammengeführt
roleNames_list additional.fields Zusammengeführt
rolecount_label additional.fields Zusammengeführt
user_count_label additional.fields Zusammengeführt
has_principal extensions.auth.type Zugeordnet: true → AUTHTYPE_UNSPECIFIED
START_TIME metadata.event_timestamp Als yyyy-MM-dd HH:mm:ss.SSS Z geparst
column2 metadata.event_timestamp Als yyyy-MM-dd HH:mm:ss.SSS Z geparst
column20 metadata.event_timestamp Als yyyy-MM-dd HH:mm:ss.SSS Z geparst
ts metadata.event_timestamp Als ISO8601 geparst
event_type metadata.event_type Direkt zugeordnet
has_principal metadata.event_type Zugeordnet: true → NETWORK_CONNECTION, true → STATUS_UPDATE, true → USER_LOGIN
has_principal_user metadata.event_type Zugeordnet: true → USER_UNCATEGORIZED
column10 metadata.product_event_type Direkt zugeordnet
QUERY_ID metadata.product_log_id Direkt zugeordnet
column1 metadata.product_log_id Direkt zugeordnet
column6 metadata.product_version Direkt zugeordnet
SESSION_ID network.http.session_id Direkt zugeordnet
RECEIVED_BYTES network.received_bytes Umbenannt/zugeordnet
BYTES_SENT_OVER_THE_NETWORK network.sent_bytes Umbenannt/zugeordnet
SENT_BYTES network.sent_bytes Umbenannt/zugeordnet
APPLICATION principal.application Direkt zugeordnet
data.user_name principal.asset.hostname Direkt zugeordnet
CLIENT_IP principal.asset.ip Zusammengeführt
IP principal.asset.ip Zusammengeführt
column5 principal.asset.ip Zusammengeführt
SOURCE_REGION principal.cloud.availability_zone Direkt zugeordnet
SOURCE_CLOUD principal.cloud.environment Zugeordnet: (?i)azure → MICROSOFT_AZURE, (?i)amazon → AMAZON_WEB_SERVICES, (?i)google …
data.user_name principal.hostname Direkt zugeordnet
CLIENT_IP principal.ip Zusammengeführt
IP principal.ip Zusammengeführt
column5 principal.ip Zusammengeführt
OS principal.platform Zugeordnet: (?i)Linux → LINUX, (?i)windows → WINDOWS, (?i)mac/ios → MAC
OS_VERSION principal.platform_version Direkt zugeordnet
SOURCE_CLOUD_label principal.resource.attribute.labels Zusammengeführt
roles principal.user.attribute.roles Zusammengeführt
data.role_name principal.user.role_name Direkt zugeordnet
column9 principal.user.user_display_name Direkt zugeordnet
USER_NAME principal.user.userid Direkt zugeordnet
column10 principal.user.userid Direkt zugeordnet
column3 principal.user.userid Direkt zugeordnet
EXECUTION_STATUS security_result.action Zugeordnet: (?i)success → action, (?i)fail → security_result_action_block
STATUS security_result.action Zugeordnet: (?i)success → action, (?i)fail → action
action security_result.action Zusammengeführt
security_result_action_block security_result.action Zusammengeführt
OCSP_MODE security_result.action_details Direkt zugeordnet
column11 security_result.action_details Direkt zugeordnet
column3 security_result.action_details Direkt zugeordnet
BYTES_DELETED_label security_result.detection_fields Zusammengeführt
BYTES_READ_FROM_RESULT_label security_result.detection_fields Zusammengeführt
BYTES_SCANNED_label security_result.detection_fields Zusammengeführt
BYTES_SPILLED_TO_LOCAL_STORAGE_label security_result.detection_fields Zusammengeführt
BYTES_SPILLED_TO_REMOTE_STORAGE_label security_result.detection_fields Zusammengeführt
BYTES_WRITTEN_TO_RESULT_label security_result.detection_fields Zusammengeführt
BYTES_WRITTEN_label security_result.detection_fields Zusammengeführt
CHILD_QUERIES_WAIT_TIME_label security_result.detection_fields Zusammengeführt
CLUSTER_NUMBER_label security_result.detection_fields Zusammengeführt
COMPILATION_TIME_label security_result.detection_fields Zusammengeführt
CREDITS_USED_CLOUD_SERVICES_label security_result.detection_fields Zusammengeführt
DATABASE_ID_label security_result.detection_fields Zusammengeführt
DATABASE_NAME_label security_result.detection_fields Zusammengeführt
END_TIME_label security_result.detection_fields Zusammengeführt
ERROR_MESSAGE_label security_result.detection_fields Zusammengeführt
EXECUTION_TIME_label security_result.detection_fields Zusammengeführt
EXTERNAL_FUNCTION_TOTAL_INVOCATIONS_label security_result.detection_fields Zusammengeführt
EXTERNAL_FUNCTION_TOTAL_RECEIVED_BYTES_label security_result.detection_fields Zusammengeführt
EXTERNAL_FUNCTION_TOTAL_RECEIVED_ROWS_label security_result.detection_fields Zusammengeführt
EXTERNAL_FUNCTION_TOTAL_SENT_BYTES_label security_result.detection_fields Zusammengeführt
EXTERNAL_FUNCTION_TOTAL_SENT_ROWS_label security_result.detection_fields Zusammengeführt
INBOUND_DATA_TRANSFER_BYTES_label security_result.detection_fields Zusammengeführt
IS_CLIENT_GENERATED_STATEMENT_label security_result.detection_fields Zusammengeführt
LIST_EXTERNAL_FILES_TIME_label security_result.detection_fields Zusammengeführt
OUTBOUND_DATA_TRANSFER_BYTES_label security_result.detection_fields Zusammengeführt
PARTITIONS_SCANNED_label security_result.detection_fields Zusammengeführt
PARTITIONS_TOTAL_label security_result.detection_fields Zusammengeführt
PERCENTAGE_SCANNED_FROM_CACHE_label security_result.detection_fields Zusammengeführt
QUERY_ACCELERATION_BYTES_SCANNED_label security_result.detection_fields Zusammengeführt
QUERY_ACCELERATION_PARTITIONS_SCANNED_label security_result.detection_fields Zusammengeführt
QUERY_ACCELERATION_UPPER_LIMIT_SCALE_FACTOR_label security_result.detection_fields Zusammengeführt
QUERY_HASH_VERSION_label security_result.detection_fields Zusammengeführt
QUERY_HASH_label security_result.detection_fields Zusammengeführt
QUERY_LOAD_PERCENT_label security_result.detection_fields Zusammengeführt
QUERY_PARAMETERIZED_HASH_VERSION_label security_result.detection_fields Zusammengeführt
QUERY_TAG_label security_result.detection_fields Zusammengeführt
QUERY_TYPE_label security_result.detection_fields Zusammengeführt
QUEUED_OVERLOAD_TIME_label security_result.detection_fields Zusammengeführt
QUEUED_PROVISIONING_TIME_label security_result.detection_fields Zusammengeführt
QUEUED_REPAIR_TIME_label security_result.detection_fields Zusammengeführt
RELEASE_VERSION_label security_result.detection_fields Zusammengeführt
ROLE_TYPE_label security_result.detection_fields Zusammengeführt
ROWS_DELETED_label security_result.detection_fields Zusammengeführt
ROWS_INSERTED_label security_result.detection_fields Zusammengeführt
ROWS_PRODUCED_label security_result.detection_fields Zusammengeführt
ROWS_UNLOADED_label security_result.detection_fields Zusammengeführt
ROWS_UPDATED_label security_result.detection_fields Zusammengeführt
ROWS_WRITTEN_TO_RESULT_label security_result.detection_fields Zusammengeführt
SCHEMA_ID_label security_result.detection_fields Zusammengeführt
SCHEMA_NAME_label security_result.detection_fields Zusammengeführt
TOTAL_ELAPSED_TIME_label security_result.detection_fields Zusammengeführt
TRANSACTION_BLOCKED_TIME_label security_result.detection_fields Zusammengeführt
TRANSACTION_ID_label security_result.detection_fields Zusammengeführt
WAREHOUSE_ID_label security_result.detection_fields Zusammengeführt
WAREHOUSE_NAME_label security_result.detection_fields Zusammengeführt
WAREHOUSE_SIZE_label security_result.detection_fields Zusammengeführt
WAREHOUSE_TYPE_label security_result.detection_fields Zusammengeführt
authentication_factor_label security_result.detection_fields Zusammengeführt
column4_label security_result.detection_fields Zusammengeführt
column6_label security_result.detection_fields Zusammengeführt
column7_label security_result.detection_fields Zusammengeführt
column8_label security_result.detection_fields Zusammengeführt
event_id_label security_result.detection_fields Zusammengeführt
event_type_label security_result.detection_fields Zusammengeführt
is_success_label security_result.detection_fields Zusammengeführt
python_compiler_label security_result.detection_fields Zusammengeführt
python_runtime_label security_result.detection_fields Zusammengeführt
python_version_label security_result.detection_fields Zusammengeführt
reported_client_type_label security_result.detection_fields Zusammengeführt
reported_client_version_label security_result.detection_fields Zusammengeführt
tracing_label security_result.detection_fields Zusammengeführt
EXECUTION_STATUS security_result.summary Direkt zugeordnet
STATUS security_result.summary Direkt zugeordnet
column17 security_result.summary Direkt zugeordnet
TARGET_REGION target.cloud.availability_zone Direkt zugeordnet
TARGET_CLOUD target.cloud.environment Zugeordnet: (?i)azure → MICROSOFT_AZURE, (?i)amazon → AMAZON_WEB_SERVICES, (?i)google …
TARGET_CLOUD_label target.resource.attribute.labels Zusammengeführt
column2_label target.resource.attribute.labels Zusammengeführt
column7_label target.resource.attribute.labels Zusammengeführt
USER_NAME target.user.userid Direkt zugeordnet
column4 target.user.userid Direkt zugeordnet
– extensions.auth.type Konstante: AUTHTYPE_UNSPECIFIED
– metadata.event_type Konstante: NETWORK_CONNECTION
– metadata.product_name Konstante: SNOWFLAKE
– metadata.vendor_name Konstante: SNOWFLAKE
– principal.cloud.environment Konstante: MICROSOFT_AZURE
– principal.platform Konstante: LINUX
– target.cloud.environment Konstante: MICROSOFT_AZURE

Änderungsprotokoll

Änderungsprotokoll für diesen Parser ansehen

Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten