Utilizzare le unioni nella ricerca

Supportato in:

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'API SearchService.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.