Statistiche e aggregazioni nella ricerca UDM utilizzando YARA-L 2.0

Supportato in:

Questa pagina descrive come eseguire query statistiche sugli eventi UDM e agrupare i risultati per l'analisi utilizzando YARA-L 2.0.

Quando gestisci un volume elevato di eventi UDM generati nel tuo ambiente, è importante comprendere le tendenze nei dati di ricerca UDM. Puoi utilizzare le statistiche e le funzioni di aggregazione per ottenere informazioni strategiche dai log UDM. La ricerca UDM supporta tutte le funzioni aggregate in YARA-L 2.0.

Casi d'uso per le query statistiche

Puoi utilizzare le query statistiche per i seguenti casi d'uso:

  • Monitora le metriche fondamentali: puoi misurare la distribuzione e la frequenza degli eventi UDM e delle risorse associate, ad esempio gli host che comunicano con indirizzi IP notoriamente dannosi.

  • Rileva comportamenti anomali: puoi identificare picchi di attività che potrebbero indicare incidenti di sicurezza, come picchi di traffico di rete inaspettati o accessi fuori orario.

  • Analisi delle tendenze nel tempo: puoi valutare le variazioni della security posture per valutare l'efficacia del controllo o identificare aree di miglioramento, ad esempio monitorando le fluttuazioni del numero di vulnerabilità nel tempo.

Puoi raggruppare e ordinare i risultati delle query di ricerca UDM utilizzando una sintassi simile a quella strutturata di YARA-L utilizzata nelle regole del motore di rilevamento. Per ulteriori informazioni, consulta la sintassi del linguaggio YARA-L 2.0.

La struttura della query YARA-L 2.0 è la seguente:

  • Inserzione di filtro: specifica le condizioni per filtrare gli eventi.

  • Corrispondenza (facoltativo): definisce i campi per i quali eseguire il raggruppamento. Per maggiori informazioni, consulta la sezione Sintassi della sezione di corrispondenza.

  • Risultato: specifica gli output della query. Per maggiori informazioni, consulta la sezione Sintassi della sezione Risultato.

  • Ordine: determina l'ordine dei risultati della query come asc (crescente) o desc (decrescente). Se l'ordine (asc o desc) non è specificato, il valore predefinito è asc.

  • Limite (facoltativo): imposta il numero massimo di righe restituite dalla query.

Ecco un esempio di utilizzo di ordini e limiti:

metadata.log_type = "OKTA"

match:
    principal.ip
Outcome:
    $user_count_by_ip = count(principal.user.userid)

order:
 $user_count_by_ip desc

limit:
    20

Aggregazioni

La ricerca UDM supporta le seguenti funzioni aggregate:

matrice

array(expression)

Descrizione

La funzione array restituisce tutti i valori sotto forma di elenco. L'elenco viene troncato a un massimo di 25 elementi casuali.

Tipi di dati Param

STRING

Tipo restituito

LIST

Esempi di codice

Esempio

Restituisce un array contenente i tipi di eventi.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array($event_type)

array_distinct

array_distinct(expression)

Descrizione

La funzione array_distinct restituisce tutti i valori distinti sotto forma di elenco. L'elenco viene troncato a un massimo di 25 elementi casuali. La deduplica per ottenere un elenco distinto viene applicata prima del troncamento.

Tipi di dati Param

STRING

Tipo restituito

LIST

Esempi di codice

Esempio

Restituisce un array contenente tipi di eventi distinti.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array_distinct($event_type)

in media

avg(numericExpression)

Descrizione

La funzione avg restituisce la media dei valori all'interno di una colonna numerica. Ignora i valori NULL durante il calcolo. Viene spesso utilizzato con match per calcolare le medie all'interno di gruppi specifici di dati.

Tipi di dati Param

NUMBER

Tipo restituito

NUMBER

Esempi di codice

Esempio

Trova tutti gli eventi in cui target.ip non è vuoto. Per tutti gli eventi che corrispondono a principal.ip, memorizza la media di metadata.event_timestamp.seconds in una variabile denominata avg_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $avg_seconds = avg(metadata.event_timestamp.seconds)

conteggio

count(expression)

Descrizione

La funzione count restituisce il numero di righe all'interno di un gruppo. Viene spesso utilizzato con match per ottenere conteggi per gruppi specifici nei dati.

Tipi di dati Param

STRING

Tipo restituito

NUMBER

Esempi di codice

Esempio

Restituisce il conteggio degli accessi utente riusciti nel tempo.

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count(metadata.id)

count_distinct

count_distinct(expression)

Descrizione

La funzione count_distinct restituisce il numero di righe con valori distinti all'interno di un gruppo. Viene spesso utilizzato con match per ottenere conteggi per gruppi specifici nei dati.

Tipi di dati Param

STRING

Tipo restituito

NUMBER

Esempi di codice

Esempio

Restituisce il conteggio degli accessi riusciti degli utenti distinti nel tempo.

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count_distinct(metadata.id)

max

max(numericExpression)

Descrizione

La funzione max restituisce il massimo dei valori all'interno di una colonna numerica. Viene spesso utilizzato con match per ottenere il valore massimo all'interno di ciascun gruppo di dati.

Tipi di dati Param

NUMBER

Tipo restituito

NUMBER

Esempi di codice

Esempio

Trova tutti gli eventi in cui target.ip non è vuoto. Per tutti gli eventi che corrispondono a principal.ip, memorizza il valore massimo di metadata.event_timestamp.seconds in una variabile denominata max_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $max_seconds = max(metadata.event_timestamp.seconds)

min

min(numericExpression)

Descrizione

La funzione min restituisce il valore minimo dei valori all'interno di una colonna numerica. Viene spesso utilizzato con match per ottenere il valore minimo all'interno di ciascun gruppo di dati.

Tipi di dati Param

NUMBER

Tipo restituito

NUMBER

Esempi di codice

Esempio

Trova tutti gli eventi in cui target.ip non è vuoto. Per tutti gli eventi che fanno corrispondere principal.ip, memorizza il valore minimo di metadata.event_timestamp.seconds in una variabile denominata min_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $min_seconds = min(metadata.event_timestamp.seconds)

somma

sum(numericExpression)

Descrizione

La funzione sum restituisce la somma dei valori all'interno di una colonna numerica. Ignora i valori NULL durante il calcolo. Viene spesso utilizzato con match per calcolare le somme all'interno di diversi gruppi di dati.

Tipi di dati Param

NUMBER

Tipo restituito

NUMBER

Esempi di codice

Esempio

Trova tutti gli eventi in cui target.ip non è vuoto. Per tutti gli eventi che corrispondono a principal.ip, memorizza una somma di network.sent_bytes in una variabile chiamata sent_bytes.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $sent_bytes = sum(network.sent_bytes)

dev.st

stddev(numericExpression)

Descrizione

La funzione stddev restituisce la deviazione standard su tutti i valori possibili.

Tipi di dati Param

NUMBER

Tipo restituito

NUMBER

Esempi di codice

Esempio

Trova tutti gli eventi in cui target.ip non è vuoto. Per tutti gli eventi che corrispondono a principal.ip, memorizza la deviazione standard di metadata.event_timestamp.seconds in una variabile denominata stddev_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $stddev_seconds = stddev(metadata.event_timestamp.seconds)

YARA-L 2.0: ricerca e utilizzo di UDM

  • La parola chiave over, utilizzata per le ricerche nella finestra di eventi, non è supportata nella ricerca.

  • Le query di ricerca UDM non includono le sezioni condition e option.

Raggruppa per granularità temporale

Puoi raggruppare i campi evento e i segnaposto nella sezione match in base a una granularità temporale specificata, in modo simile al raggruppamento di una colonna in SQL.

La sintassi è la seguente:

match:
  ... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]

Per raggruppare in base alla granularità temporale, puoi utilizzare la parola chiave by o over every. Le granularità temporali consentite sono le seguenti:

  • MINUTE o m
  • HOUR o h
  • DAY o d
  • WEEK o w
  • MONTH o mo

Le parole chiave by e over every sono funzionalmente equivalenti. Puoi scegliere una delle due.

Esempi

Raggruppa l'indirizzo IP e il nome host per ora.

$hostname = principal.hostname
match:
  $hostname, target.ip by hour

Raggruppa il conteggio di tutti gli eventi per nome host e per giorno di occorrenza.

$hostname = target.hostname
match:
  $hostname over every day
outcome:
  $events_count = count($hostname)

Alcune origini dati, come il contesto dell'entità, sono valide per un intervallo di tempo (<start_time>, <end_time>) e non hanno timestamp singolari.

La parola chiave first è facoltativa e si applica a un singolo timestamp. Ciò significa che per un'origine dati valida per un intervallo di tempo, la parola chiave first prende in considerazione solo l'ora di inizio (<start_time>).

Ad esempio, considera un'entità con un intervallo di tempo di (1m, 5m) e una granularità temporale di 1m. Se i risultati sono raggruppati per host (h1,h2), le colonne restituite saranno (h1, 1m) e (h2, 1m), mentre il resto dell'intervallo di tempo verrà ignorato.

La parola chiave first può essere aggiunta sia a by che a over every, con lo stesso comportamento per entrambi. L'utilizzo di by first è equivalente a over every first.

Di seguito è riportato un esempio di query che utilizza l'operatore by con l'origine dati del contesto dell'entità valida per un intervallo di tempo. In questa query, viene preso in considerazione l'intero intervallo di tempo perché la parola chiave first viene omessa.

graph.entity.hostname != ""
match:
  graph.entity.ip by hour
outcome:
  $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)

Creare e salvare visualizzazioni nella Ricerca

La ricerca nel modello di dati unificato (UDM) di Google SecOps offre potenti funzionalità di visualizzazione dei dati. Queste funzionalità consentono agli analisti del Security Operations Center (SOC) di rilevare, indagare e rispondere in modo efficiente alle minacce creando visualizzazioni dai risultati di ricerca e salvandole nelle dashboard.

Creare e salvare visualizzazioni nella dashboard nativa

Per creare e salvare le visualizzazioni da aggiungere alla dashboard nativa:

  1. Scrivi una query YARA-L con sezioni match e outcome.

  2. Seleziona un intervallo di date e poi fai clic su Esegui ricerca per eseguire la query. Visualizza i risultati nelle schede Statistiche e Visualizza.

  3. Nella scheda Visualizza, procedi nel seguente modo: a. Seleziona un tipo di grafico dall'elenco Tipo di grafico. b. Modifica le impostazioni in Impostazioni dati per personalizzare il grafico.

  4. Nella schermata Aggiungi alla dashboard, procedi nel seguente modo: a. Inserisci un nome del grafico, una descrizione e un intervallo di tempo. b. Scegli se aggiungere il grafico a una dashboard esistente o crearne una nuova.

  5. Fai clic su Aggiungi alla dashboard per aggiungere il grafico alla dashboard.

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