Utilizzare le unioni nella ricerca
Le unioni aiutano a correlare i dati provenienti da più origini per fornire un contesto più ampio per un'indagine. Collegando eventi, entità e altri dati correlati, puoi esaminare scenari di attacco complessi.
Questo documento spiega come utilizzare l'operazione di unione in Google Security Operations. Vengono inoltre trattati i tipi di unione supportati, i casi d'uso e le best practice.
Creare un join
Sono supportati solo i join basati sulle statistiche. Devi definirli nella sezione
corrispondenza di una query con una finestra temporale di correlazione fino a 48 ore.
Puoi creare un join collegando i campi direttamente (ad esempio, $e1.hostname = $e2.hostname
) o utilizzando variabili segnaposto. Quando
definisci un join nella sezione match
, devi utilizzare le variabili segnaposto.
La seguente query di esempio unisce due campi con un segno uguale (=
) e una
variabile segnaposto condivisa:
Esempio 1:
events:
// Assign a value from the first event to the placeholder variable $user
$user = $e1.principal.user.userid
// The second assignment creates an implicit join, linking $e2 to $e1
// where the user ID is the same.
$user = $e2.principal.user.userid
match:
$user over 1h
condition:
$e1 and $e2
Esempio 2:
$e1.principal.ip = $ip
$e1.metadata.event_type = "USER_LOGIN"
$e1.principal.hostname = $host
$e2.target.ip = $ip
$e2.principal.hostname = "altostrat"
$e2.target.hostname = $host
match:
$ip, $host over 5m
Tipi di join supportati
Questa sezione descrive i diversi tipi di join che puoi utilizzare.
Unione evento-evento
Un'unione evento-evento collega due eventi UDM (Unified Data Model) diversi.
La seguente query di esempio collega un evento USER_LOGIN
a un altro evento per
trovare il nome host (altostrat
) con cui l'utente ha interagito, in base a un indirizzo
IP comune:
$e1.principal.ip = $ip
$e1.metadata.event_type = "USER_LOGIN"
$e2.target.ip = $ip
$e2.principal.hostname = "altostrat"
match:
$ip over 5m
Event-ECG join
Un'unione Event-ECG collega un evento UDM a un'entità del grafico del contesto dell'entità (ECG). La seguente query di esempio trova un evento NETWORK_CONNECTION
e
un ASSET
dal grafico delle entità che condividono lo stesso nome host in un intervallo
di 1 ora:
events:
$e1.metadata.event_type = "NETWORK_CONNECTION"
$g1.graph.metadata.entity_type = "ASSET"
$e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
$x = $g1.graph.entity.asset.hostname
match:
$x over 1h
condition:
$e1 and $g1
Datatable-event join
Un'unione evento-tabella di dati collega gli eventi UDM alle voci di una tabella di dati personalizzata.
Ciò è utile per confrontare i dati degli eventi live con un elenco definito dall'utente, ad esempio indirizzi IP dannosi noti o autori di minacce. La seguente query di esempio
unisce gli eventi NETWORK_CONNECTION
a una tabella di dati per trovare le connessioni che coinvolgono
indirizzi IP specifici di questo elenco:
$ip = %DATATABLE_NAME.COLUMN_NAME
$ip = $e1.principal.ip
$e1.metadata.event_type = "NETWORK_CONNECTION"
match:
$ip over 1h
Best practice
Le query di unione possono richiedere molte risorse perché combinano molti risultati. I filtri generici e ampi possono causare errori nelle query, a volte dopo un lungo ritardo, ad esempio:
target.ip != null
metadata.event_type = "NETWORK_CONNECTION"
(se questo tipo di evento è molto comune nel tuo ambiente)
Ti consigliamo di combinare i filtri generali con quelli più specifici per ridurre il numero totale di eventi che la query deve elaborare. Un filtro generico come
target.ip != null
deve essere abbinato a filtri più specifici per migliorare le
prestazioni della query, ad esempio:
$e1.metadata.log_type = $log
$e1.metadata.event_type = "USER_LOGIN"
$e1.target.ip != ""
$e2.metadata.log_type = $log
$e2.principal.ip = "10.0.0.76"
$e2.target.hostname != "altostrat"
match:
$log over 5m
Se la query è ancora lenta, puoi anche ridurre l'intervallo di tempo complessivo della query (ad esempio, da 30 giorni a una settimana).
Per saperne di più, consulta le best practice per YARA-L.
Limitazioni
Quando utilizzi le unioni, si applicano le seguenti limitazioni:
Puoi utilizzare un massimo di due eventi UDM per query.
Puoi utilizzare un massimo di un evento ECG per query.
Puoi utilizzare un massimo di due tabelle di dati per query.
Non puoi unire eventi di tabelle di dati, UDM ed ECG in un'unica query.
L'intervallo di tempo massimo per le query è 90 giorni.
La finestra temporale massima per
match
è di 48 ore.I join sono supportati nell'interfaccia utente e nell'API
EventService.UDMSearch
, ma non nell'APISearchService.UDMSearch
.
Casi d'uso comuni
Questa sezione elenca alcuni modi comuni per utilizzare i join.
Rilevare il furto e l'utilizzo di credenziali
Obiettivo: trovare istanze in cui un utente esegue l'accesso correttamente e poi elimina rapidamente un file di sistema critico. Ciò potrebbe suggerire una compromissione dell'account o un'attività interna dannosa.
Tipo di unione: unione evento-evento
Descrizione: questa query collega due eventi distinti che non sono sospetti
di per sé, ma lo diventano quando si verificano insieme. Viene prima
cercato un evento USER_LOGIN
, poi un evento FILE_DELETION
. Questi sono uniti
dal comune user.userid
con una breve finestra temporale.
Query di esempio:
// Event 1: A user successfully logs in
$e1.metadata.event_type = "USER_LOGIN"
$e1.security_result.action = "ALLOW"
$e1.principal.user.userid = $user
// Event 2: The same user deletes a critical file
$e2.metadata.event_type = "FILE_DELETION"
$e2.target.file.full_path = /etc\/passwd|C:\\Windows\\System32\\/
$e2.principal.user.userid = $user
match:
$user over 10m
condition:
$e1 and $e2
Identificare le connessioni rischiose dagli asset critici
Obiettivo: arricchire i dati di rete live con informazioni sugli asset per trovare connessioni in uscita da server che non devono comunicare con domini esterni a bassa prevalenza (ad esempio, un server di database di produzione).
Tipo di unione: unione evento-ECG
Descrizione: una singola connessione di rete a un dominio raro potrebbe non essere una
priorità elevata. Tuttavia, questa query aumenta l'importanza di questo evento unendolo al grafico del contesto delle entità (ECG). Cerca in particolare gli eventi NETWORK_CONNECTION
provenienti da asset etichettati come "Critical Database Server" nel grafico delle entità.
Query di esempio:
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.target.domain.prevalence.day_count <= 5
$asset.graph.metadata.entity_type = "ASSET"
$asset.graph.entity.asset.labels.value = "Critical Database Server"
$e.principal.asset.hostname = $asset.graph.entity.asset.hostname
$host = $e.principal.asset.hostname
match:
$host over 1h
condition:
$e and $asset
Cerca gli indicatori di compromissione degli autori di minacce
Obiettivo: cercare attivamente indicatori di compromissione (IoC) controllando tutte le query DNS attive rispetto a un elenco di domini noti per essere utilizzati da un attore delle minacce specifico.
Tipo di unione: unione tabella dati-evento
Descrizione: il tuo team di intelligence sulle minacce gestisce una tabella di dati chiamata
ThreatActor_Domains
che elenca i domini dannosi. Questa query unisce tutti
gli eventi NETWORK_DNS_QUERY
in tempo reale a questa tabella di dati. Mostra immediatamente
qualsiasi istanza in cui un host della tua rete tenta di risolvere un dominio dal tuo
elenco di intelligence sulle minacce.
Query di esempio:
// Datatable: Get the list of malicious domains
$domain = $ip = %DATATABLE_NAME.COLUMN_NAME
// Event: A DNS query is made
$e.metadata.event_type = "NETWORK_DNS"
$e.network.dns.questions.name = $domain
match:
$domain over 5m
condition:
$e
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.