Statistiche e aggregazioni nella ricerca tramite YARA-L 2.0
Questa pagina descrive come eseguire query statistiche sugli eventi UDM e raggruppare 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 funzioni statistiche e di aggregazione per ottenere insight utili dai log UDM. La ricerca UDM supporta tutte le funzioni di aggregazione 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 critiche: puoi misurare la distribuzione e la frequenza degli eventi UDM e degli asset associati, ad esempio gli host che comunicano con indirizzi IP dannosi noti.
Rilevare comportamenti anomali: puoi identificare picchi di attività che potrebbero indicare incidenti di sicurezza, come aumenti imprevisti del traffico di rete o accessi al sistema al di fuori dell'orario di lavoro.
Analizza le tendenze nel tempo: puoi valutare le modifiche alla postura di sicurezza per valutare l'efficacia del controllo o identificare le aree di miglioramento, ad esempio monitorare le fluttuazioni del numero di vulnerabilità nel tempo.
Struttura delle query YARA-L 2.0 nella ricerca
Puoi raggruppare e ordinare i risultati delle query di ricerca UDM utilizzando una sintassi simile a quella strutturata 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:
Istruzione di filtro: specifica le condizioni per filtrare gli eventi.
Corrispondenza (facoltativo): definisce i campi in base ai quali raggruppare. Per maggiori informazioni, consulta Sintassi della sezione di corrispondenza.
Risultato: specifica gli output della query. Per maggiori informazioni, consulta la sezione Sintassi della sezione Esito.
Ordine: determina l'ordine dei risultati della query come
asc
(crescente) odesc
(decrescente). Se l'ordine (asc
odesc
) 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 dei parametri
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. Tronca l'elenco a un massimo di 25 elementi casuali. La
deduplicazione per ottenere un elenco distinto viene applicata prima del troncamento.
Tipi di dati dei parametri
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 utilizzata
con match
per calcolare le medie all'interno di gruppi specifici nei dati.
Tipi di dati dei parametri
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 chiamata 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 i conteggi di gruppi specifici nei dati.
Tipi di dati dei parametri
STRING
Tipo restituito
NUMBER
Esempi di codice
Esempio
Restituisce il conteggio degli accessi riusciti degli utenti 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 i conteggi per gruppi specifici nei dati.
Tipi di dati dei parametri
STRING
Tipo restituito
NUMBER
Esempi di codice
Esempio
Restituisce il conteggio degli accessi riusciti di utenti unici 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 valore massimo dei valori all'interno di una colonna numerica.
Viene spesso utilizzata con match
per ottenere il valore massimo all'interno di ogni gruppo nei dati.
Tipi di dati dei parametri
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 massimo di metadata.event_timestamp.seconds
in una variabile chiamata 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 all'interno di una colonna numerica. Viene spesso utilizzato con match
per ottenere il valore minimo all'interno di ciascun gruppo nei dati.
Tipi di dati dei parametri
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 minimo di metadata.event_timestamp.seconds
in una variabile chiamata 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 nei dati.
Tipi di dati dei parametri
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
denominata sent_bytes
.
target.ip != ""
match:
principal.ip
outcome:
$sent_bytes = sum(network.sent_bytes)
stddev
stddev(numericExpression)
Descrizione
La funzione stddev
restituisce la deviazione standard di tutti i valori possibili.
Tipi di dati dei parametri
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 chiamata stddev_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$stddev_seconds = stddev(metadata.event_timestamp.seconds)
meno recenti
earliest(timestamp)
Descrizione
La funzione earliest
restituisce il timestamp meno recente di un insieme di record
con una risoluzione di microsecondi.
Tipi di dati dei parametri
TIMESTAMP
Tipo restituito
TIMESTAMP
Esempi di codice
Esempio
Per tutti gli eventi che corrispondono a hostname
, memorizza la data più vecchia di
metadata.event_timestamp
nella variabile start
.
$hostname = principal.hostname
match:
$hostname
outcome:
$start = earliest(metadata.event_timestamp)
più recente
latest(timestamp)
Descrizione
La funzione latest
restituisce il timestamp più recente di un insieme di record
con una risoluzione di microsecondi.
Tipi di dati dei parametri
TIMESTAMP
Tipo restituito
TIMESTAMP
Esempi di codice
Esempio
Per tutti gli eventi che corrispondono a hostname
, memorizza l'ultimo valore di
metadata.event_timestamp
nella variabile end
.
$hostname = principal.hostname
match:
$hostname
outcome:
$end = latest(metadata.event_timestamp)
YARA-L 2.0: ricerca e utilizzo di UDM
La parola chiave
over
, utilizzata per le ricerche nella finestra dell'evento, non è supportata nella ricerca.Le query di ricerca UDM non includono le sezioni
condition
eoption
.
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
om
HOUR
oh
DAY
od
WEEK
ow
MONTH
omo
Entrambe le parole chiave by
e over every
sono funzionalmente equivalenti. Puoi
utilizzarne uno rispetto all'altro.
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 il giorno in cui si è verificato l'evento.
$hostname = target.hostname
match:
$hostname over every day
outcome:
$events_count = count($hostname)
Alcune origini dati, come il contesto dell'entità, sono valide in un intervallo di tempo
(<start_time>
, <end_time>
) e non hanno timestamp singoli.
La parola chiave first
è facoltativa e si applica a un singolo timestamp. Ciò significa che per un'origine dati valida in un intervallo di tempo,
la parola chiave first
considera solo l'ora di inizio (<start_time>
).
Ad esempio, considera un'entità con un intervallo di tempo (1m, 5m
) con 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
sia a over every
, con lo stesso comportamento per entrambe. 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 contesto entità valida in un intervallo di tempo. In questa query, viene preso in considerazione l'intero intervallo di tempo perché la parola chiave first
è 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
Questa sezione descrive le funzionalità di visualizzazione dei dati all'interno della ricerca Unified Data Model (UDM) di Google SecOps. Questa funzionalità consente agli analisti del Security Operations Center (SOC) di rilevare, analizzare e rispondere in modo efficiente alle minacce creando visualizzazioni dai risultati di ricerca e salvandole nelle dashboard.
Creare e salvare visualizzazioni nella dashboard
Per creare e salvare le visualizzazioni da aggiungere alla dashboard, segui questi passaggi:
Scrivi una query YARA-L con sezioni
match
eoutcome
.Seleziona un intervallo di date, quindi fai clic su Esegui ricerca per eseguire la query. Visualizza i risultati nelle schede Statistiche e Visualizza.
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.
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.
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.