Raccogliere i log di Snowflake
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
- Crea un bucket Amazon S3 seguendo questa guida utente: Creazione di un bucket
- Salva il nome e la regione del bucket per riferimento futuro.
Configura il criterio IAM AWS di Snowflake
- Accedi alla console di gestione AWS.
- Cerca e seleziona IAM.
- Seleziona Impostazioni account.
- In Security Token Service (STS) nell'elenco Endpoint, trova la regione Snowflake in cui si trova il tuo account.
- Se lo stato di STS è inattivo, sposta il pulsante di attivazione/disattivazione su Attivo.
- Seleziona Norme.
- Seleziona Crea policy.
- In Editor policy, seleziona JSON.
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>/*" ] } } } ] }Fai clic su Avanti.
Inserisci un nome della norma (ad esempio, snowflake_access) e una descrizione facoltativa.
Fai clic su Crea policy.
Configura il ruolo IAM AWS di Snowflake
- In AWS Identity and Access Management (IAM), seleziona Ruoli.
- Fai clic su Crea ruolo.
- Seleziona Account AWS come tipo di entità attendibile.
- Seleziona Un altro account AWS.
- 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.
- Seleziona l'opzione Richiedi ID esterno.
- 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.
- Fai clic su Avanti.
- Seleziona la policy IAM che hai creato in precedenza.
- Fai clic su Avanti.
- Inserisci un nome e una descrizione per il ruolo.
- Fai clic su Crea ruolo.
- Nella pagina di riepilogo del ruolo, copia e salva il valore ARN ruolo.
Configura l'integrazione di Snowflake S3
- Connettiti al database Snowflake.
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
- 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= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
- Copia e salva i valori delle seguenti proprietà:
- STORAGE_AWS_IAM_USER_ARN
- STORAGE_AWS_EXTERNAL_ID
- Vai alla Console di gestione AWS.
- Seleziona IAM > Ruoli.
- Seleziona il ruolo che hai creato in precedenza.
- Seleziona la scheda Relazioni di trust.
- Fai clic su Modifica policy di attendibilità.
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>" } } } ] }Sostituisci:
snowflake_user_arnè il valore diSTORAGE_AWS_IAM_USER_ARNche hai registrato.snowflake_external_idè il valore diSTORAGE_AWS_EXTERNAL_IDche hai registrato.
Fai clic su Aggiorna policy.
Configurare il formato del file JSON in Snowflake
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
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
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);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
- Accedi alla console di gestione AWS.
- Crea un utente seguendo questa guida utente: Creazione di un utente IAM.
- Seleziona l'utente creato.
- Seleziona la scheda Credenziali di sicurezza.
- Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
- Seleziona Servizio di terze parti come Caso d'uso.
- Fai clic su Avanti.
- (Facoltativo) Aggiungi il tag della descrizione.
- Fai clic su Crea chiave di accesso.
- Fai clic su Scarica file CSV per salvare la chiave di accesso e la chiave di accesso segreta per riferimento futuro.
- Fai clic su Fine.
- Seleziona la scheda Autorizzazioni.
- Fai clic su Aggiungi autorizzazioni nella sezione Criteri per le autorizzazioni.
- Seleziona Aggiungi autorizzazioni.
- Seleziona Allega direttamente i criteri.
- Cerca e seleziona il criterio AmazonS3FullAccess.
- Fai clic su Avanti.
- Fai clic su Aggiungi autorizzazioni.
Configura i feed
Per configurare un feed:
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio, Log di Snowflake).
- Seleziona Amazon S3 V2 come Tipo di origine.
- Seleziona Snowflake come Tipo di log.
- Fai clic su Avanti.
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.
- URI S3: l'URI del bucket (il formato deve essere
Fai clic su Avanti.
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: true → AUTHTYPE_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: true → NETWORK_CONNECTION, true → STATUS_UPDATE, true → USER_LOGIN |
has_principal_user |
metadata.event_type |
Mappato: true → USER_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)azure → MICROSOFT_AZURE, (?i)amazon → AMAZON_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)Linux → LINUX, (?i)windows → WINDOWS, (?i)mac/ios → MAC |
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)success → action, (?i)fail → security_result_action_block |
STATUS |
security_result.action |
Mappato: (?i)success → action, (?i)fail → action |
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)azure → MICROSOFT_AZURE, (?i)amazon → AMAZON_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.