Raccogliere i log di Snowflake

Supportato in:

Questo documento spiega come importare i log di Snowflake in Google Security Operations utilizzando AWS S3. Il parser estrae i campi dai messaggi di log utilizzando una serie di regole di corrispondenza dei pattern Grok e KV, progettate specificamente per gestire il formato dei log Snowflake. Quindi mappa i campi estratti al modello Unified Data Model (UDM), arricchendo i dati con contesto aggiuntivo e standardizzando la rappresentazione per ulteriori analisi.

Prima di iniziare

Assicurati di soddisfare i seguenti prerequisiti:

  • Istanza Google SecOps
  • Accesso privilegiato ad AWS
  • Accesso privilegiato a Snowflake (ACCOUNTADMIN)

Configura un bucket Amazon S3

  1. Crea un bucket Amazon S3 seguendo questa guida utente: Creazione di un bucket
  2. Salva il nome e la regione del bucket per riferimento futuro.

Configura il criterio IAM AWS di Snowflake

  1. Accedi alla console di gestione AWS.
  2. Cerca e seleziona IAM.
  3. Seleziona Impostazioni account.
  4. In Security Token Service (STS) nell'elenco Endpoint, trova la regione Snowflake in cui si trova il tuo account.
  5. Se lo stato di STS è inattivo, sposta il pulsante di attivazione/disattivazione su Attivo.
  6. Seleziona Norme.
  7. Seleziona Crea policy.
  8. In Editor policy, seleziona JSON.
  9. Copia e incolla la seguente policy (in formato JSON) per fornire a Snowflake le autorizzazioni necessarie per caricare o scaricare dati utilizzando un singolo bucket e un singolo percorso di cartella. Puoi anche eliminare i file di dati utilizzando l'opzione di copia PURGE.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                  "s3:PutObject",
                  "s3:GetObject",
                  "s3:GetObjectVersion",
                  "s3:DeleteObject",
                  "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    
  10. Fai clic su Avanti.

  11. Inserisci un nome della norma (ad esempio, snowflake_access) e una descrizione facoltativa.

  12. Fai clic su Crea policy.

Configura il ruolo IAM AWS di Snowflake

  1. In AWS Identity and Access Management (IAM), seleziona Ruoli.
  2. Fai clic su Crea ruolo.
  3. Seleziona Account AWS come tipo di entità attendibile.
  4. Seleziona Un altro account AWS.
  5. Nel campo ID account, inserisci temporaneamente il tuo ID account AWS. In un secondo momento, modifichi la relazione di trust e concedi l'accesso a Snowflake.
  6. Seleziona l'opzione Richiedi ID esterno.
  7. Inserisci un ID segnaposto, ad esempio 0000. In un passaggio successivo, modificherai la relazione di attendibilità per il tuo ruolo IAM e specificherai l'ID esterno per l'integrazione dell'archiviazione.
  8. Fai clic su Avanti.
  9. Seleziona la policy IAM che hai creato in precedenza.
  10. Fai clic su Avanti.
  11. Inserisci un nome e una descrizione per il ruolo.
  12. Fai clic su Crea ruolo.
  13. Nella pagina di riepilogo del ruolo, copia e salva il valore ARN ruolo.

Configura l'integrazione di Snowflake S3

  1. Connettiti al database Snowflake.
  2. Sostituisci i seguenti campi ed esegui il comando:

    • <integration_name> è il nome della nuova integrazione (ad esempio, s3_integration).
    • <iam_role> è l'Amazon Resource Name (ARN) del ruolo che hai creato in precedenza.
    • <aws_s3_bucket_path> è il percorso del bucket che hai creato in precedenza (ad esempio, s3://your-log-bucket-name/).
    CREATE OR REPLACE STORAGE INTEGRATION <integration_name>
      TYPE = EXTERNAL_STAGE
      STORAGE_PROVIDER = 'S3'
      ENABLED = TRUE
      STORAGE_AWS_ROLE_ARN = '<iam_role>'
      STORAGE_ALLOWED_LOCATIONS = ('<aws_s3_bucket_path>')
    

Configura le autorizzazioni utente IAM AWS per accedere al bucket

  1. Recupera l'ARN per l'utente IAM creato automaticamente per il tuo account Snowflake, sostituisci <integration_name> con il nome effettivo dell'integrazione che hai creato in precedenza: none DESC INTEGRATION <integration_name>;
  • Ad esempio: none DESC INTEGRATION s3_integration; +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+ | property | property_type | property_value | property_default | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------| | ENABLED | Boolean | true | false | | STORAGE_ALLOWED_LOCATIONS | List | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/ | [] | | STORAGE_BLOCKED_LOCATIONS | List | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/ | [] | | STORAGE_AWS_IAM_USER_ARN | String | arn:aws:iam::123456789001:user/abc1-b-self1234 | | | STORAGE_AWS_ROLE_ARN | String | arn:aws:iam::001234567890:role/myrole | | | STORAGE_AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
  1. Copia e salva i valori delle seguenti proprietà:
    • STORAGE_AWS_IAM_USER_ARN
    • STORAGE_AWS_EXTERNAL_ID
  2. Vai alla Console di gestione AWS.
  3. Seleziona IAM > Ruoli.
  4. Seleziona il ruolo che hai creato in precedenza.
  5. Seleziona la scheda Relazioni di trust.
  6. Fai clic su Modifica policy di attendibilità.
  7. Aggiorna il documento delle norme con i valori di output di DESC INTEGRATION:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<snowflake_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<snowflake_external_id>"
            }
          }
        }
      ]
    }
    
  8. Sostituisci:

    • snowflake_user_arn è il valore di STORAGE_AWS_IAM_USER_ARN che hai registrato.
    • snowflake_external_id è il valore di STORAGE_AWS_EXTERNAL_ID che hai registrato.
  9. Fai clic su Aggiorna policy.

Configurare il formato del file JSON in Snowflake

  1. In Snowflake, inserisci questo comando:

    CREATE OR REPLACE FILE FORMAT my_json_format
      type = json
      COMPRESSION = 'gzip'
      null_if = ('NULL', 'null');
    

Crea l'area temporanea S3 in Snowflake

  1. In Snowflake, sostituisci i seguenti campi e inserisci il comando:

    • <DB_NAME>
    • <DB_SCHEMA_NAME>
    • <AWS_S3_BUCKET_PATH>
    use database '<DB_NAME>';
    use schema '<DB_SCHEMA_NAME>';
    CREATE OR REPLACE STAGE my_s3_stage
    storage_integration = s3_integration
    url = '<AWS_S3_BUCKET_PATH>'
    file_format = my_json_format;
    

Configurare Snowflake per esportare i dati

  1. Esegui il comando unload per esportare i dati dalle tabelle nell'area di staging e a sua volta in AWS S3:

    use database '<DB_NAME>';
    use WAREHOUSE '<WAREHOUSE_NAME>';
    
    copy into @my_s3_stage/login_history from (SELECT OBJECT_CONSTRUCT('application', 'snowflake' ,'environment', '<PUT_HERE_ENV_NAME>', '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, 'FIRST_AUTHENTICATION_FACTOR',FIRST_AUTHENTICATION_FACTOR, 'IS_SUCCESS', IS_SUCCESS, 'ERROR_CODE', ERROR_CODE, 'ERROR_MESSAGE', ERROR_MESSAGE) from snowflake.account_usage.Login_history) FILE_FORMAT = (TYPE = JSON) ;
    
    copy into @my_s3_stage/access_history from (SELECT OBJECT_CONSTRUCT('application', 'snowflake' ,'environment', '<PUT_HERE_DB_NAME>', 'log_type', 'access_history', 'QUERY_START_TIME',QUERY_START_TIME, 'USER_NAME', USER_NAME, 'DIRECT_OBJECTS_ACCESSED',DIRECT_OBJECTS_ACCESSED, 'BASE_OBJECTS_ACCESSED', BASE_OBJECTS_ACCESSED, 'OBJECTS_MODIFIED', OBJECTS_MODIFIED) from snowflake.account_usage.Access_History ) FILE_FORMAT = (TYPE = JSON);
    
  2. Ripeti la procedura di esportazione per tutte le tabelle seguenti in cui Snowflake archivia i log e i dati correlati all'audit:

    Databases ;
    WAREHOUSE_EVENTS_HISTORY ;
    WAREHOUSE_LOAD_HISTORY ;
    WAREHOUSE_METERING_HISTORY ;
    DATABASE_STORAGE_USAGE_HISTORY ;
    DATA_TRANSFER_HISTORY ;
    GRANTS_TO_ROLES ;
    GRANTS_TO_USERS ;
    METERING_DAILY_HISTORY ;
    PIPE_USAGE_HISTORY ;
    REPLICATION_USAGE_HISTORY ;
    STAGE_STORAGE_USAGE_HISTORY ;
    STORAGE_USAGE ;
    TASK_HISTORY ;
    COPY_HISTORY ;
    

Configurare AWS IAM per Google SecOps

  1. Accedi alla console di gestione AWS.
  2. Crea un utente seguendo questa guida utente: Creazione di un utente IAM.
  3. Seleziona l'utente creato.
  4. Seleziona la scheda Credenziali di sicurezza.
  5. Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
  6. Seleziona Servizio di terze parti come Caso d'uso.
  7. Fai clic su Avanti.
  8. (Facoltativo) Aggiungi il tag della descrizione.
  9. Fai clic su Crea chiave di accesso.
  10. Fai clic su Scarica file CSV per salvare la chiave di accesso e la chiave di accesso segreta per riferimento futuro.
  11. Fai clic su Fine.
  12. Seleziona la scheda Autorizzazioni.
  13. Fai clic su Aggiungi autorizzazioni nella sezione Criteri per le autorizzazioni.
  14. Seleziona Aggiungi autorizzazioni.
  15. Seleziona Allega direttamente i criteri.
  16. Cerca e seleziona il criterio AmazonS3FullAccess.
  17. Fai clic su Avanti.
  18. Fai clic su Aggiungi autorizzazioni.

Configura i feed

Per configurare un feed:

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed.
  3. Nella pagina successiva, fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio, Log di Snowflake).
  5. Seleziona Amazon S3 V2 come Tipo di origine.
  6. Seleziona Snowflake come Tipo di log.
  7. Fai clic su Avanti.
  8. Specifica i valori per i seguenti parametri di input:

    • URI S3: l'URI del bucket (il formato deve essere s3://your-log-bucket-name/). Sostituisci quanto segue:
      • your-log-bucket-name: il nome del bucket.
    • Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.
  9. Fai clic su Avanti.

  10. Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.

Tabella di mappatura UDM

Campo log mapping UDM Logica
column4_label additional.fields Unita
column7_label additional.fields Unita
first_authentication_factor_label additional.fields Unita
host_list additional.fields Unita
query_text_label additional.fields Unita
query_type_label additional.fields Unita
roleIds_list additional.fields Unita
roleNames_list additional.fields Unita
rolecount_label additional.fields Unita
user_count_label additional.fields Unita
has_principal extensions.auth.type Mappato: trueAUTHTYPE_UNSPECIFIED
START_TIME metadata.event_timestamp Analizzato come yyyy-MM-dd HH:mm:ss.SSS Z
column2 metadata.event_timestamp Analizzato come yyyy-MM-dd HH:mm:ss.SSS Z
column20 metadata.event_timestamp Analizzato come yyyy-MM-dd HH:mm:ss.SSS Z
ts metadata.event_timestamp Analizzato come ISO8601
event_type metadata.event_type Mappato direttamente
has_principal metadata.event_type Mappato: trueNETWORK_CONNECTION, trueSTATUS_UPDATE, trueUSER_LOGIN
has_principal_user metadata.event_type Mappato: trueUSER_UNCATEGORIZED
column10 metadata.product_event_type Mappato direttamente
QUERY_ID metadata.product_log_id Mappato direttamente
column1 metadata.product_log_id Mappato direttamente
column6 metadata.product_version Mappato direttamente
SESSION_ID network.http.session_id Mappato direttamente
RECEIVED_BYTES network.received_bytes Rinominate/mappate
BYTES_SENT_OVER_THE_NETWORK network.sent_bytes Rinominate/mappate
SENT_BYTES network.sent_bytes Rinominate/mappate
APPLICATION principal.application Mappato direttamente
data.user_name principal.asset.hostname Mappato direttamente
CLIENT_IP principal.asset.ip Unita
IP principal.asset.ip Unita
column5 principal.asset.ip Unita
SOURCE_REGION principal.cloud.availability_zone Mappato direttamente
SOURCE_CLOUD principal.cloud.environment Mappato: (?i)azureMICROSOFT_AZURE, (?i)amazonAMAZON_WEB_SERVICES, (?i)google ...
data.user_name principal.hostname Mappato direttamente
CLIENT_IP principal.ip Unita
IP principal.ip Unita
column5 principal.ip Unita
OS principal.platform Mappato: (?i)LinuxLINUX, (?i)windowsWINDOWS, (?i)mac/iosMAC
OS_VERSION principal.platform_version Mappato direttamente
SOURCE_CLOUD_label principal.resource.attribute.labels Unita
roles principal.user.attribute.roles Unita
data.role_name principal.user.role_name Mappato direttamente
column9 principal.user.user_display_name Mappato direttamente
USER_NAME principal.user.userid Mappato direttamente
column10 principal.user.userid Mappato direttamente
column3 principal.user.userid Mappato direttamente
EXECUTION_STATUS security_result.action Mappato: (?i)successaction, (?i)failsecurity_result_action_block
STATUS security_result.action Mappato: (?i)successaction, (?i)failaction
action security_result.action Unita
security_result_action_block security_result.action Unita
OCSP_MODE security_result.action_details Mappato direttamente
column11 security_result.action_details Mappato direttamente
column3 security_result.action_details Mappato direttamente
BYTES_DELETED_label security_result.detection_fields Unita
BYTES_READ_FROM_RESULT_label security_result.detection_fields Unita
BYTES_SCANNED_label security_result.detection_fields Unita
BYTES_SPILLED_TO_LOCAL_STORAGE_label security_result.detection_fields Unita
BYTES_SPILLED_TO_REMOTE_STORAGE_label security_result.detection_fields Unita
BYTES_WRITTEN_TO_RESULT_label security_result.detection_fields Unita
BYTES_WRITTEN_label security_result.detection_fields Unita
CHILD_QUERIES_WAIT_TIME_label security_result.detection_fields Unita
CLUSTER_NUMBER_label security_result.detection_fields Unita
COMPILATION_TIME_label security_result.detection_fields Unita
CREDITS_USED_CLOUD_SERVICES_label security_result.detection_fields Unita
DATABASE_ID_label security_result.detection_fields Unita
DATABASE_NAME_label security_result.detection_fields Unita
END_TIME_label security_result.detection_fields Unita
ERROR_MESSAGE_label security_result.detection_fields Unita
EXECUTION_TIME_label security_result.detection_fields Unita
EXTERNAL_FUNCTION_TOTAL_INVOCATIONS_label security_result.detection_fields Unita
EXTERNAL_FUNCTION_TOTAL_RECEIVED_BYTES_label security_result.detection_fields Unita
EXTERNAL_FUNCTION_TOTAL_RECEIVED_ROWS_label security_result.detection_fields Unita
EXTERNAL_FUNCTION_TOTAL_SENT_BYTES_label security_result.detection_fields Unita
EXTERNAL_FUNCTION_TOTAL_SENT_ROWS_label security_result.detection_fields Unita
INBOUND_DATA_TRANSFER_BYTES_label security_result.detection_fields Unita
IS_CLIENT_GENERATED_STATEMENT_label security_result.detection_fields Unita
LIST_EXTERNAL_FILES_TIME_label security_result.detection_fields Unita
OUTBOUND_DATA_TRANSFER_BYTES_label security_result.detection_fields Unita
PARTITIONS_SCANNED_label security_result.detection_fields Unita
PARTITIONS_TOTAL_label security_result.detection_fields Unita
PERCENTAGE_SCANNED_FROM_CACHE_label security_result.detection_fields Unita
QUERY_ACCELERATION_BYTES_SCANNED_label security_result.detection_fields Unita
QUERY_ACCELERATION_PARTITIONS_SCANNED_label security_result.detection_fields Unita
QUERY_ACCELERATION_UPPER_LIMIT_SCALE_FACTOR_label security_result.detection_fields Unita
QUERY_HASH_VERSION_label security_result.detection_fields Unita
QUERY_HASH_label security_result.detection_fields Unita
QUERY_LOAD_PERCENT_label security_result.detection_fields Unita
QUERY_PARAMETERIZED_HASH_VERSION_label security_result.detection_fields Unita
QUERY_TAG_label security_result.detection_fields Unita
QUERY_TYPE_label security_result.detection_fields Unita
QUEUED_OVERLOAD_TIME_label security_result.detection_fields Unita
QUEUED_PROVISIONING_TIME_label security_result.detection_fields Unita
QUEUED_REPAIR_TIME_label security_result.detection_fields Unita
RELEASE_VERSION_label security_result.detection_fields Unita
ROLE_TYPE_label security_result.detection_fields Unita
ROWS_DELETED_label security_result.detection_fields Unita
ROWS_INSERTED_label security_result.detection_fields Unita
ROWS_PRODUCED_label security_result.detection_fields Unita
ROWS_UNLOADED_label security_result.detection_fields Unita
ROWS_UPDATED_label security_result.detection_fields Unita
ROWS_WRITTEN_TO_RESULT_label security_result.detection_fields Unita
SCHEMA_ID_label security_result.detection_fields Unita
SCHEMA_NAME_label security_result.detection_fields Unita
TOTAL_ELAPSED_TIME_label security_result.detection_fields Unita
TRANSACTION_BLOCKED_TIME_label security_result.detection_fields Unita
TRANSACTION_ID_label security_result.detection_fields Unita
WAREHOUSE_ID_label security_result.detection_fields Unita
WAREHOUSE_NAME_label security_result.detection_fields Unita
WAREHOUSE_SIZE_label security_result.detection_fields Unita
WAREHOUSE_TYPE_label security_result.detection_fields Unita
authentication_factor_label security_result.detection_fields Unita
column4_label security_result.detection_fields Unita
column6_label security_result.detection_fields Unita
column7_label security_result.detection_fields Unita
column8_label security_result.detection_fields Unita
event_id_label security_result.detection_fields Unita
event_type_label security_result.detection_fields Unita
is_success_label security_result.detection_fields Unita
python_compiler_label security_result.detection_fields Unita
python_runtime_label security_result.detection_fields Unita
python_version_label security_result.detection_fields Unita
reported_client_type_label security_result.detection_fields Unita
reported_client_version_label security_result.detection_fields Unita
tracing_label security_result.detection_fields Unita
EXECUTION_STATUS security_result.summary Mappato direttamente
STATUS security_result.summary Mappato direttamente
column17 security_result.summary Mappato direttamente
TARGET_REGION target.cloud.availability_zone Mappato direttamente
TARGET_CLOUD target.cloud.environment Mappato: (?i)azureMICROSOFT_AZURE, (?i)amazonAMAZON_WEB_SERVICES, (?i)google ...
TARGET_CLOUD_label target.resource.attribute.labels Unita
column2_label target.resource.attribute.labels Unita
column7_label target.resource.attribute.labels Unita
USER_NAME target.user.userid Mappato direttamente
column4 target.user.userid Mappato direttamente
N/D extensions.auth.type Costante: AUTHTYPE_UNSPECIFIED
N/D metadata.event_type Costante: NETWORK_CONNECTION
N/D metadata.product_name Costante: SNOWFLAKE
N/D metadata.vendor_name Costante: SNOWFLAKE
N/D principal.cloud.environment Costante: MICROSOFT_AZURE
N/D principal.platform Costante: LINUX
N/D target.cloud.environment Costante: MICROSOFT_AZURE

Log delle modifiche

Visualizza il log delle modifiche per questo parser

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.