Correlare i dati con le unioni esterne

Supportato in:

Questo documento descrive le outer join (left join e right join). Le operazioni di unione vengono utilizzate per correlare e combinare i dati di più origini in base a valori di campo comuni. Combinando eventi ed entità di sicurezza correlati in una visualizzazione singola e completa, puoi fornire un rilevamento e un'indagine efficaci sulle minacce.

A differenza dei join standard (interni), che richiedono voci corrispondenti in entrambe le origini dati, un outer join recupera tutti i record da un lato del join, anche se non ci sono voci corrispondenti nell'altro. I campi non corrispondenti dell'altro lato vengono in genere compilati con null. In questo modo eviti di perdere i dati che non hanno una corrispondenza.

Come funzionano i join esterni

Il concetto di outer join in YARA-L 2.0 è identico a quello delle outer join SQL standard:

  • Il left outer join conserva tutti i record del lato sinistro del join.

  • Il join esterno destro conserva tutti i record del lato destro del join.

La sintassi outer join (left join e right join) è supportata per tutte le query, sia con che senza una condizione match.

Informazioni sul left outer join

Un left outer join (o left join) conserva tutti i record dell'origine dati sul lato sinistro della parola chiave left join.

  • Se un record del lato sinistro non ha corrispondenze nell'evento destro, i campi dell'evento destro vengono restituiti come null.

  • Implicazione del segnaposto: qualsiasi variabile segnaposto utilizzata nella sezione match deve fare riferimento a un campo dell'evento a sinistra per garantire un'aggregazione accurata dei dati nell'intero set di risultati.

Esempio di left join da evento a evento

L'esempio seguente mostra un left outer join per correlare gli eventi di accesso dell'utente con gli eventi di connessione di rete successivi che si verificano sullo stesso host. Il left join garantisce che tutti gli eventi USER_LOGIN vengano conservati nel set di risultati. Se viene trovato un evento NETWORK_CONNECTION corrispondente ($e2), i relativi dati vengono uniti. Se non viene trovata alcuna corrispondenza, i campi per $e2 sono null.


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname

Definisci l'evento di sinistra

Il seguente esempio di query definisce il lato sinistro del join ($e1), ovvero l'insieme di eventi conservato nel risultato finale:

$e1.metadata.event_type = "USER_LOGIN"

La seguente tabella rappresenta il risultato della query, identificando il set iniziale di eventi di accesso utente:

Tipo di evento Nome host principale Indirizzo IP
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50
USER_LOGIN kiosk-4 192.168.1.104

Definisci l'evento giusto

Il seguente esempio di query definisce il lato destro del join ($e2), ovvero il set di eventi che viene confrontato con gli eventi a sinistra:

$e2.metadata.event_type = "NETWORK_CONNECTION"

La tabella seguente rappresenta l'insieme di eventi di connessione di rete disponibili per la corrispondenza:

Tipo di evento Nome host principale Indirizzo IP
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION kiosk-4 203.0.113.3

Partecipa agli eventi

con una sezione delle partite

L'esempio seguente mostra una query di corrispondenza che utilizza una left outer join sul campo principal.hostname:


  $e1.metadata.event_type = "USER_LOGIN"

  $e2.metadata.event_type = "NETWORK_CONNECTION"

  left join $e1.principal.hostname = $e2.principal.hostname

  $host = $e1.principal.hostname

  match:
    $host over 5m

  • L'unione esterna a sinistra garantisce che ogni evento USER_LOGIN ($e1) sia incluso nel set di risultati finale.

  • Al segnaposto $host viene assegnato il valore di $e1.principal.hostname. Il left outer join garantisce la presenza dell'evento $e1, assicurandosi che la variabile $host venga sempre compilata per l'aggregazione.

  • La regola aggrega i risultati per host per un intervallo di tempo di 5 minuti.

Risultato dell'iscrizione

I dati risultanti mostrano la combinazione dei due eventi. Tutti i record della tabella a sinistra ($e1) vengono conservati e i campi della tabella a destra ($e2) sono impostati su null quando non viene trovato alcun nome host corrispondente (ad esempio, per server-db-03).

Tipo di evento ($e1) Nome host principale ($host) Indirizzo IP ($e1) Tipo di evento ($e2) Indirizzo IP ($e2) Stato della partita
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION 192.168.1.101 Corrispondenza trovata
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION 192.168.1.101 Corrispondenza trovata
USER_LOGIN server-db-03 10.0.0.50 null null Nessuna corrispondenza
USER_LOGIN kiosk-4 192.168.1.104 NETWORK_CONNECTION 203.0.113.3 Corrispondenza trovata

Esempi di query left join

Questa sezione fornisce esempi di query di left join.

Esegue il join con una condizione di corrispondenza

  • Event-entity

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Event-datatable

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    match:
      $host by 5m
    

Join senza una condizione di corrispondenza

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    $e1.principal.ip = "114.241.96.87"
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    left join $e1.principal.hostname = $e2.principal.hostname
    
    
  • Event-entity

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    
  • Event-datatable

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    

Right outer join

Un right outer join (o right join) conserva tutti i record dell'origine dati sul lato destro della parola chiave right join.

  • Se un record dell'evento a destra non ha corrispondenze nell'evento a sinistra, i campi dell'evento a sinistra vengono restituiti come null.

  • Implicazione del segnaposto:qualsiasi variabile segnaposto utilizzata nella sezione match deve fare riferimento a un campo dell'evento corretto per garantire un'aggregazione accurata dei dati nell'intero set di risultati.

Esempio di unione destra da evento a evento

L'esempio seguente mostra un right outer join per correlare gli eventi di accesso utente con gli eventi di connessione di rete successivi che si verificano sullo stesso host. right joingarantisce che tutti gli eventi NETWORK_CONNECTION vengano conservati nel set di risultati. Se viene trovato un evento USER_LOGIN corrispondente, i relativi dati vengono uniti. Se non viene trovata alcuna corrispondenza, i campi per $e1 sono null.


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

Definisci l'evento di sinistra

La seguente query definisce il lato sinistro del join ($e1), ovvero il set di eventi facoltativo nel risultato finale:


$e1.metadata.event_type = "USER_LOGIN"

La seguente tabella rappresenta il risultato della query, identificando l'insieme iniziale di eventi di accesso utente:

Tipo di evento Nome host principale Indirizzo IP
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50

Definisci l'evento giusto

La seguente query definisce il lato destro del join ($e2), ovvero l'insieme di eventi che viene conservato nel risultato finale.


$e2.metadata.event_type = "NETWORK_CONNECTION"

La tabella seguente rappresenta l'insieme di eventi di connessione di rete disponibili per la corrispondenza.

Tipo di evento Nome host principale Indirizzo IP
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION vm-unauth-05 203.0.113.3

Partecipa agli eventi

L'esempio seguente mostra una query di corrispondenza con una giunzione esterna destra sul campo principal.hostname:


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

$host = $e1.principal.hostname

match:
  $host over 5m

  • Il right outer join garantisce che ogni evento NETWORK_CONNECTION ($e2) sia incluso nel set di risultati finale.

  • Al segnaposto $host viene assegnato il valore di $e2.principal.hostname. Il right outer join garantisce la presenza dell'evento $e2, assicurandosi che la variabile $host venga sempre compilata per l'aggregazione.

  • La regola aggrega i risultati per host per un intervallo di tempo di 5 minuti.

Risultato dell'iscrizione

Il set di dati risultante mostra la combinazione dei due eventi. Tutti i record della tabella a destra ($e2) vengono conservati e i campi della tabella a sinistra ($e1) vengono impostati su null quando non viene trovato alcun nome host corrispondente (ad esempio, vm-unauth-05).

Tipo di evento ($e1) Nome host principale ($e1) Indirizzo IP ($e1) Tipo di evento ($e2) Nome host principale ($host) Indirizzo IP ($e2) Stato della partita
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION workstation-01 192.168.1.101 Corrispondenza trovata
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION laptop-hr-02 192.168.1.101 Corrispondenza trovata
null null null NETWORK_CONNECTION vm-unauth-05 203.0.113.4 Nessuna corrispondenza

Esempi di query di join a destra

Questa sezione fornisce esempi di query di unione a destra.

Esegue il join con una condizione di corrispondenza

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    $host = $e2.principal.hostname
    
    match:
      $host over 5m
    
    
  • Entity-event

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    match:
      $host by 5m
    
    

Join senza una condizione di corrispondenza

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e1.principal.ip = "114.241.96.87"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    
  • Entity-event

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    

Limitazioni

Tieni presenti le seguenti limitazioni quando crei outer join:

  • Un full outer join (left join e right join insieme) non è supportato.

  • L'intervallo di tempo della query per i join senza corrispondenza è limitato a un massimo di 14 giorni.

  • Non puoi unire direttamente due origini contestuali (ad esempio, un'entità direttamente a una tabella di dati).

  • L'evento Unified Data Model (UDM) principale deve essere il lato conservato dell'outer join. La query non è valida se l'evento principale si trova sul lato "nullable".

    • Un'unione evento-entità deve essere un'unione a sinistra. In questo modo l'evento ($e1) viene conservato correttamente.

    • Un'unione di entità-evento deve essere un'unione a destra. In questo modo l'evento ($e1) viene conservato correttamente.

    L'esempio seguente non è valido perché l'evento UDM ($e1) si trova a sinistra, ma il right join conserva il lato destro ($g1), il che viola la regola che l'evento UDM deve essere conservato:

    
    // Invalid query
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    right join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    
    

Best practice

Per evitare prestazioni lente e timeout delle query nelle query outer join, utilizza filtri specifici e ristretti.

Ad esempio, una query generica come la seguente:


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname

Può essere ottimizzato aggiungendo criteri specifici come segue:


$e1.metadata.event_type = "USER_LOGIN"
$e1.principal.ip = "121.121.121.121"
$e1.principal.user.userid = "alex"
$e2.metadata.event_type = "NETWORK_CONNECTION"
$e2.src.hostname = "altostrat.com"
$e1.principal.hostname = $e2.principal.hostname

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