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. Beide Methoden verwenden auf Snowflake-Seite denselben Mechanismus: Eine geplante Aufgabe lädt Daten zur Kontonutzung in eine externe Phase und Google SecOps liest die exportierten Dateien mit einem Feed.

Snowflake ist eine Cloud-Datenplattform, die Kontoaktivitäten im Schema SNOWFLAKE.ACCOUNT_USAGE speichert. 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 werden alle im Konto ausgeführten Anweisungen aufgezeichnet, einschließlich Nutzer, Rolle, Warehouse und betroffener Objekte.

Hinweis

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

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

Zugriff auf Nutzungsdaten des Snowflake-Kontos gewähren

Die SNOWFLAKE.ACCOUNT_USAGE-Ansichten sind nur für ACCOUNTADMIN lesbar, bis der Zugriff explizit gewährt wird. Erstellen Sie eine dedizierte Rolle für den Export und weisen Sie ihr die beiden Datenbankrollen zu, die die Ansichten abdecken, die dieses Dokument exportiert.

  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 weisen Sie sie der Rolle so zu:

    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, der Inhaber des Exports ist.

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, die am besten zu Ihren Anforderungen passt (Region, Dual-Region, Multi-Region).
    Standort Wählen Sie den Standort aus (z. B. us-central1).
    Speicherklasse Standard (empfohlen für Logs, auf die häufig zugegriffen wird)
    Zugriffssteuerung Einheitlich (empfohlen)
    Schutztools Optional: Objektversionsverwaltung oder Aufbewahrungsrichtlinie aktivieren
  6. Klicken Sie auf Erstellen.

Benutzerdefinierte Cloud Storage-Rolle für Snowflake erstellen

  1. Rufen Sie in der Google Cloud Console 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-Speichereinbindung für Cloud Storage erstellen

  1. Erstellen Sie in einem Snowflake-Arbeitsblatt die Speicherintegration 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, das Snowflake für die Integration erstellt hat, so ab:

    DESC STORAGE INTEGRATION SECOPS_GCS_INT;
    
  3. Kopieren Sie den Wert des Attributs STORAGE_GCP_SERVICE_ACCOUNT. Der Wert hat folgendes Format:

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

Dem 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 Wert STORAGE_GCP_SERVICE_ACCOUNT ein.
    • Rollen zuweisen: Wählen Sie Snowflake Unload aus.
  6. Klicken Sie auf Speichern.

Dateiformat und externe Stage erstellen

  1. Erstellen Sie in einem Snowflake-Arbeitsblatt das Dateiformat und die Stage, die in den Bucket schreibt, so:

    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;
    

Tabelle für den Exportstatus erstellen

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

  1. Erstellen Sie die Statustabelle 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, die beide Ansichten entlädt und den Wasserzeichenwert wie folgt erhöht:

    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 hinter 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. Ein Fenster, das jetzt endet, würde also Zeilen überspringen, die in der Ansicht noch nicht materialisiert wurden. Ereignisse erreichen Google SecOps daher etwa drei Stunden nach ihrem Auftreten. Wenn die Verzögerung verkürzt wird, geht das zulasten der Vollständigkeit, aber die Daten sind aktueller.
  • WINDOW_END wird vor dem Entladen in die Tabelle geschrieben, sodass der von der COPY INTO-Anweisung verwendete Wert und der in LAST_EXPORTED zurückgeschriebene Wert identisch sind. Wenn die aktuelle Zeit in der zweiten Anweisung neu berechnet wird, wird alles übersprungen, was dazwischen passiert ist.
  • Jedes LAST_EXPORTED-Update wird nach der zugehörigen COPY INTO-Anweisung ausgeführt. Wenn ein Entladevorgang fehlschlägt, wird der Vorgang beendet, die Markierung bleibt an der aktuellen Position und beim nächsten Durchlauf wird dieses Zeitfenster wiederholt, anstatt es zu überspringen.
  • INCLUDE_QUERY_ID = TRUE fügt jedem Dateinamen eine UUID hinzu. Ohne diesen Parameter werden entladene Dateien mit data_0_0_0 benannt und wiederholte Exporte in denselben Pfad kollidieren, was Snowflake als Quelle für duplizierte Daten in der Stage dokumentiert.

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 die Aufgabe 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 der Ausführung 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 Einstellungen > Datenverwaltung > Feeds auf. Wenn Sie eine reine SIEM-Plattform verwenden, rufen Sie die 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 Logtyp aus.
  7. Klicken Sie auf Dienstkonto abrufen.
  8. Eine eindeutige E-Mail-Adresse für das Dienstkonto wird angezeigt, z. B.:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. Kopieren Sie diese E-Mail-Adresse, um sie im nächsten Schritt zu verwenden.

  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 Löschoption 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.
    • Maximales Dateialter: Dateien einschließen, 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 beiden folgenden Rollen aus:
      • Storage-Objekt-Betrachter: Liest die Logobjekte.
      • Storage Legacy Bucket Reader: Liest die 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 gewährt.
  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 Stage identisch. Daher werden das Exportverfahren und die Aufgabe aus Methode 1 unverändert wiederverwendet.

Amazon S3-Bucket konfigurieren

  1. Erstellen Sie einen Amazon S3-Bucket gemäß diesem Nutzerhandbuch: Bucket erstellen.
  2. Speichern Sie den Namen und die Region des Buckets zur späteren Verwendung. Beispiel: snowflake-activity-logs

AWS-IAM-Richtlinie für Snowflake 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 unter Security Token Service (STS) in der Liste Endpunkte 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, um Snowflake die erforderlichen Berechtigungen zum Entladen von Daten in einen Bucket- und Ordnerpfad zu gewähren:

    {
        "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 (z. B. snowflake_access) und optional eine Beschreibung ein.

  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 Typ 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 zuvor erstellte IAM-Richtlinie aus.
  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 mit der Rollenzusammenfassung den Wert für Role ARN.

Snowflake-Speicherintegration für Amazon S3 erstellen

  1. Erstellen Sie in einem Snowflake-Arbeitsblatt die Speicherintegration 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. 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:

    • 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 zuvor erstellte Rolle aus.
  4. Wählen Sie den Tab Vertrauensstellungen aus.
  5. Klicken Sie auf Vertrauensrichtlinie bearbeiten.
  6. Aktualisieren Sie das Richtliniendokument mit den DESC INTEGRATION-Ausgabewerten so:

    {
        "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, Stage und Exportobjekte erstellen

  1. Erstellen Sie in einem Snowflake-Arbeitsblatt das Dateiformat und die Stage, die in den Bucket schreibt, so:

    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 Statustabelle, die Prozedur und die Aufgabe genau wie in Methode 1 in den Abschnitten Statustabelle für den Export erstellen, Exportprozedur erstellen und Exportaufgabe planen beschrieben. Die Anweisungen verweisen auf den Namen der Phase, sodass sie nicht geändert werden müssen.

AWS IAM für Google SecOps konfigurieren

  1. Melden Sie sich bei der AWS Management Console an.
  2. Erstellen Sie einen Nutzer gemäß diesem Nutzerhandbuch: IAM-Nutzer erstellen.
  3. Wählen Sie den erstellten Nutzer aus.
  4. Wählen Sie den Tab Sicherheitsanmeldedaten aus.
  5. Klicken Sie im Bereich Access Keys (Zugriffsschlüssel) auf Create Access Key (Zugriffsschlüssel erstellen).
  6. Wählen Sie als Anwendungsfall die Option Drittanbieterdienst aus.
  7. Klicken Sie auf Weiter.
  8. Optional: Fügen Sie ein Beschreibungs-Tag 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 spätere 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 Einstellungen > Datenverwaltung > Feeds auf. Wenn Sie eine reine SIEM-Plattform verwenden, rufen Sie die Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf der nächsten Seite 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 als Quelltyp Amazon S3 V2 aus.
  6. Wählen Sie Snowflake als Logtyp aus.
  7. Klicken Sie auf Weiter.
  8. Geben Sie die folgenden Werte für die Eingabeparameter an:

    • S3-URI: s3://snowflake-activity-logs/snowflake/
    • Option zum Löschen der Quelle: Wählen Sie die gewünschte Löschoption aus.
    • Maximales Dateialter: Dateien einschließen, 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: Der geheime 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 Geparst als yyyy-MM-dd HH:mm:ss.SSS Z
column2 metadata.event_timestamp Geparst als yyyy-MM-dd HH:mm:ss.SSS Z
column20 metadata.event_timestamp Geparst als yyyy-MM-dd HH:mm:ss.SSS Z
ts metadata.event_timestamp Geparst als ISO8601
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