Statistiche e aggregazioni nella ricerca UDM utilizzando 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.
Panoramica
Quando devi gestire 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.
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 coinvolte, ad esempio gli host che comunicano con indirizzi IP notoriamente dannosi.
Rileva comportamenti anomali: puoi rilevare pattern o picchi insoliti nell'attività che potrebbero indicare un incidente di sicurezza, ad esempio volumi di traffico di rete insoliti o attività di accesso impreviste in orari insoliti.
Analizza le tendenze nel tempo: puoi identificare le variazioni nella postura di sicurezza per valutare l'impatto dei controlli o trovare le aree che richiedono miglioramenti, ad esempio monitorare le variazioni nel conteggio delle vulnerabilità nel tempo.
Struttura delle query YARA-L 2.0 nella ricerca
Puoi raggruppare e ordinare i risultati delle query di ricerca UDM utilizzando la sintassi simile alla struttura YARA-L nelle regole del motore di rilevamento. Per ulteriori informazioni, consulta la sintassi del linguaggio YARA-L 2.0.
La struttura della query è la seguente:
Inserzione di filtro: l'istruzione di filtro specifica le condizioni per filtrare gli eventi.
Corrispondenza (facoltativo): la sezione di corrispondenza specifica i campi in base ai quali eseguire il raggruppamento. Per maggiori informazioni, consulta la sezione Sintassi della sezione di corrispondenza.
Risultato: la sezione Risultato specifica gli output della query. Per maggiori informazioni, consulta la sezione Sintassi della sezione Risultato.
Ordine: la sezione Ordine specifica l'ordine dei risultati della query restituiti. Se l'ordine (
asc
odesc
) non è specificato, per impostazione predefinita saràasc
.Limite (facoltativo): la sezione Limite specifica il numero massimo di righe che la query restituisce.
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:
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 gruppi diversi nei 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)
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)
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 fanno corrispondere 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)
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)
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)
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)
Differenze tra l'utilizzo di YARA-L 2.0 nella ricerca e il suo utilizzo all'interno di UDM
La parola chiave
over
, che consente di cercare eventi all'interno di una finestra, non è applicabile nella ricerca.La struttura della query di ricerca UDM non include le sezioni
condition
eoption
.
Raggruppa per granularità temporale
Puoi raggruppare tutti i campi e i segnaposto degli eventi nella sezione match
in base a una granularità temporale specificata, in modo simile a una colonna in base alla quale puoi raggruppare 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:
MINUTE
om
HOUR
oh
DAY
od
WEEK
ow
MONTH
omo
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
è una parola chiave facoltativa che tratta un'origine dati valida per un intervallo di tempo come se fosse valida solo per 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>
),
ignorando l'ora di fine dell'intervallo di tempo.
Ad esempio, considera un'entità con un intervallo di tempo di (1m, 5m
) con una granularità temporale di 1 minuto. Supponiamo che i risultati siano raggruppati per host, ovvero
[h1, h2
]. Le colonne restituite sono (h1, 1m
) e (h2,
1m
) perché il resto dell'intervallo di tempo viene 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)