Campi ripetuti
In Unified Data Model (UDM), alcuni campi sono etichettati come ripetuti, il che indica che sono elenchi di valori o altri tipi di messaggi. Questo documento fornisce informazioni su come utilizzare espressioni, segnaposto, indicizzazione di array e messaggi ripetuti per i campi UDM ripetuti.
Espressioni booleane e campi ripetuti
Le espressioni booleane modificate e non modificate possono agire sui campi ripetuti.
Considera il seguente evento:
event_original {
principal {
// ip is a repeated field
ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]
hostname: "host"
}
}
Espressioni modificate
Utilizza i modificatori any e all nelle espressioni nei campi ripetuti.
any: se uno qualsiasi degli elementi del campo ripetuto soddisfa la condizione, l'evento nel suo complesso soddisfa la condizione. Ad esempio:event_originalsoddisfaany $e.principal.ip = "192.0.2.1"event_originalnon riesceany $e.repeated_field.field_a = "9.9.9.9"
all: se tutti gli elementi del campo ripetuto soddisfano la condizione, l'evento nel suo complesso soddisfa la condizione. Ad esempio:event_originalsoddisfanet.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8")event_originalnon riesceall $e.principal.ip = "192.0.2.2"
Quando scrivi una condizione con any o all, tieni presente che la negazione della condizione
con not potrebbe non avere lo stesso significato dell'utilizzo dell'operatore negato.
Ad esempio:
not all $e.principal.ip = "192.168.12.16"verifica se non tutti gli indirizzi IP corrispondono a192.168.12.16, il che significa che la query verifica che almeno un indirizzo IP non corrisponda a192.168.12.16all $e.principal.ip != "192.168.12.16"verifica che tutti gli indirizzi IP non corrispondano a192.168.12.16, il che significa che la query verifica che nessun indirizzo IP corrisponda a192.168.12.16
Limitazioni:
- Gli operatori
anyeallsono compatibili solo con i campi ripetuti (non scalari). anyeallnon possono essere utilizzati per unire due campi ripetuti. Ad esempio,any $e1.principal.ip = $e2.principal.ipnon è valido.- Gli operatori
anyeallnon sono supportati con l'espressione dell'elenco di riferimento.
Espressioni non modificate
Con le espressioni non modificate, ogni elemento nel campo ripetuto viene trattato singolarmente. Se il campo ripetuto di un evento contiene n elementi, la query viene applicata a n copie dell'evento, in cui ogni copia ha uno degli elementi del campo ripetuto. Queste copie sono temporanee e non vengono archiviate.
La regola viene applicata alle seguenti copie:
| copia dell'evento | principal.ip | principal.hostname |
|---|---|---|
| event_copy_1 | "192.0.2.1" | "host" |
| event_copy_2 | "192.0.2.2" | "host" |
| event_copy_3 | "192.0.2.3" | "host" |
Se una copia dell'evento soddisfa tutte le condizioni non modificate nel campo ripetuto, l'evento nel suo complesso soddisfa tutte le condizioni. Pertanto, se hai più condizioni in un campo ripetuto, una singola copia dell'evento deve soddisfarle tutte. I seguenti esempi di query utilizzano il set di dati di esempio precedente per dimostrare questo comportamento.
Esempio: espressioni non modificate
La seguente regola restituisce una corrispondenza quando viene eseguita sul set di dati di esempio event_original, perché event_copy_1 soddisfa tutti i predicati degli eventi:
rule repeated_field_1 {
meta:
events:
net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/8") // Checks if IP address matches 192.x.x.x
$e.principal.ip = "192.0.2.1"
condition:
$e
}
La seguente regola non restituisce una corrispondenza se eseguita sul set di dati di esempio event_original
perché non esiste una copia dell'evento in $e.principal.ip che
soddisfi _tutti_ i predicati dell'evento.
rule repeated_field_2 {
meta:
events:
$e.principal.ip = "192.0.2.1"
$e.principal.ip = "192.0.2.2"
condition:
$e
}
Le espressioni modificate nei campi ripetuti sono compatibili con le espressioni non modificate nei campi ripetuti perché l'elenco degli elementi è lo stesso per ogni copia dell'evento. Considera la seguente regola:
rule repeated_field_3 {
meta:
events:
any $e.principal.ip = "192.0.2.1"
$e.principal.ip = "192.0.2.3"
condition:
$e
}
La regola viene applicata alle seguenti copie:
| copia dell'evento | principal.ip | any $e.principal.ip |
|---|---|---|
| event_copy_1 | "192.0.2.1" | ["192.0.2.1", "192.0.2.2", "192.0.2.3"] |
| event_copy_2 | "192.0.2.2" | ["192.0.2.1", "192.0.2.2", "192.0.2.3"] |
| event_copy_3 | "192.0.2.3" | ["192.0.2.1", "192.0.2.2", "192.0.2.3"] |
In questo caso, tutte le copie soddisfano any $e.principal.ip = "192.0.2.1", ma solo event_copy_3 soddisfa $e.principal.ip = "192.0.2.3". Di conseguenza, l'evento nel suo complesso corrisponderà.
Un altro modo per pensare a questi tipi di espressioni è:
- Le espressioni sui campi ripetuti che utilizzano
anyoalloperano sull'elenco inevent_original. - Le espressioni sui campi ripetuti che non utilizzano
anyoalloperano su singoli eventievent_copy_n.
Segnaposto e campi ripetuti
I campi ripetuti funzionano con le assegnazioni dei segnaposto. Analogamente alle espressioni non modificate nei campi ripetuti, viene creata una copia dell'evento per ogni elemento. Utilizzando lo stesso esempio di event_copy, il segnaposto assume il valore del campo ripetuto di event_copy_n per ciascuna delle copie dell'evento in cui n è il numero di copia dell'evento. Se il segnaposto viene utilizzato nella sezione della corrispondenza, possono verificarsi più corrispondenze.
Esempio: segnaposto per campo ripetuto
L'esempio seguente genera una corrispondenza. Il segnaposto `$ip` è uguale a `192.0.2.1` per `event_copy_1`, il che soddisfa i predicati nella regola. Gli esempi di eventi della corrispondenza contengono un singolo elemento, `event_original`.
// Generates 1 match.
rule repeated_field_placeholder1 {
meta:
events:
$ip = $e.principal.ip
$ip = "192.0.2.1"
$host = $e.principal.hostname
match:
$host over 5m
condition:
$e
}
L'esempio seguente genera tre corrispondenze. Il segnaposto $ip è uguale
a valori diversi per ciascuna delle diverse copie di event_copy_n.
Il raggruppamento viene eseguito su $ip perché si trova nella sezione della corrispondenza. Pertanto, ottieni tre partite
in cui ogni partita ha un valore diverso per la variabile $ip partita. Ogni corrispondenza ha lo stesso
esempio di evento: un singolo elemento, event_original.
// Generates 3 matches.
rule repeated_field_placeholder2 {
meta:
events:
$ip = $e.principal.ip
net.ip_in_range_cidr($ip, "192.0.2.0/8") // Checks if IP matches 192.x.x.x
match:
$ip over 5m
condition:
$e
}
Risultati utilizzando i segnaposto assegnati ai campi ripetuti
I segnaposto vengono assegnati a ogni elemento di ogni campo ripetuto, non all'intero elenco. Quando vengono utilizzati nella sezione outcome, il risultato viene calcolato utilizzando solo gli elementi che hanno soddisfatto le sezioni precedenti.
Considera la seguente regola:
rule outcome_repeated_field_placeholder {
meta:
events:
$ip = $e.principal.ip
$ip = "192.0.2.1" or $ip = "192.0.2.2"
$host = $e.principal.hostname
match:
$host over 5m
outcome:
$o = array_distinct($ip)
condition:
$e
}
L'esecuzione di questa regola prevede quattro fasi. La prima fase è la copia dell'evento:
| copia dell'evento | $ip | $host | $e |
|---|---|---|---|
| event_copy_1 | "192.0.2.1" | "host" | event_id |
| event_copy_2 | "192.0.2.2" | "host" | event_id |
| event_copy_3 | "192.0.2.3" | "host" | event_id |
La sezione degli eventi filtrerà quindi le righe che non corrispondono ai filtri:
| copia dell'evento | $ip | $host | $e |
|---|---|---|---|
| event_copy_1 | "192.0.2.1" | "host" | event_id |
| event_copy_2 | "192.0.2.2" | "host" | event_id |
event_copy_3 viene filtrato perché "192.0.2.3" non soddisfa $ip = "192.0.2.1" or $ip = "192.0.2.2".
La sezione match verrà quindi raggruppata in base alle variabili di corrispondenza e la sezione outcome eseguirà l'aggregazione su ogni gruppo:
| $host | $o | $e |
|---|---|---|
| "host" | ["192.0.2.1", "192.0.2.2"] | event_id |
$o = array_distinct($ip) viene calcolato utilizzando $ip della fase precedente e non della fase di copia dell'evento.
Infine, la sezione condition filtra ogni gruppo. Poiché questa regola verifica solo l'esistenza di $e, la riga precedente produrrà un singolo rilevamento.
$o non contiene tutti gli elementi di $e.principal.ip perché non tutti gli elementi soddisfano tutte le condizioni nella sezione degli eventi. Tuttavia, tutti gli elementi di e.principal.ip verranno visualizzati nell'esempio di evento perché l'esempio di evento utilizza event_original.
Indicizzazione degli array
Puoi eseguire l'indicizzazione degli array sui campi ripetuti. Per accedere all'ennesimo elemento del campo ripetuto, utilizza la sintassi dell'elenco standard (gli elementi sono indicizzati a partire da 0). Un elemento fuori dai limiti restituisce il valore predefinito.
$e.principal.ip[0] = "192.168.12.16"$e.principal.ip[999] = ""Se ci sono meno di 1000 elementi, il risultato ètrue.
Limitazioni:
- Un indice deve essere un valore letterale intero non negativo. Ad esempio,
$e.principal.ip[-1]non è valido. - I valori di tipo
int(ad esempio, un segnaposto impostato suint) non vengono conteggiati. - L'indicizzazione degli array non può essere combinata con
anyoall. Ad esempio,any $e.intermediary.ip[0]non è valido. - L'indicizzazione degli array non può essere combinata con la sintassi della mappa. Ad esempio,
$e.additional.fields[0]["key"]non è valido. - Se il percorso del campo contiene più campi ripetuti, tutti i campi ripetuti devono utilizzare l'indicizzazione degli array. Ad esempio,
$e.intermediary.ip[0]non è valido perchéintermediaryeipsono entrambi campi ripetuti, ma esiste un solo indice perip.
Messaggi ripetuti
Quando un campo message viene ripetuto, l'effetto indesiderato è quello di ridurre la probabilità di una corrispondenza. Ciò è illustrato negli esempi seguenti.
Considera il seguente evento:
event_repeated_message {
// about is a repeated message field.
about {
// ip is a repeated string field.
ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]
hostname: "alice"
}
about {
hostname: "bob"
}
}
Come indicato per le espressioni non modificate nei campi ripetuti, viene creata una copia temporanea dell'evento per ogni elemento del campo ripetuto. Considera la seguente regola:
rule repeated_message_1 {
meta:
events:
$e.about.ip = "192.0.2.1"
$e.about.hostname = "bob"
condition:
$e
}
La regola viene applicata alle seguenti copie:
| copia dell'evento | about.ip | about.hostname |
|---|---|---|
| event_copy_1 | "192.0.2.1" | "alice" |
| event_copy_2 | "192.0.2.2" | "alice" |
| event_copy_3 | "192.0.2.3" | "alice" |
| event_copy_4 | "" | "bob" |
L'evento non corrisponde alla regola perché non esiste una copia dell'evento che soddisfi tutte le espressioni.
Messaggi ripetuti e indicizzazione degli array
Un altro comportamento imprevisto può verificarsi quando si utilizza l'indicizzazione degli array con espressioni non modificate nei campi dei messaggi ripetuti. Considera la seguente regola di esempio che utilizza l'indicizzazione degli array:
rule repeated_message_2 {
meta:
events:
$e.about.ip = "192.0.2.1"
$e.about[1].hostname = "bob"
condition:
$e
}
La regola viene applicata alle seguenti copie:
| copia dell'evento | about.ip | about[1].hostname |
|---|---|---|
| event_copy_1 | "192.0.2.1" | "bob" |
| event_copy_2 | "192.0.2.2" | "bob" |
| event_copy_3 | "192.0.2.3" | "bob" |
| event_copy_4 | "" | "bob" |
Poiché event_copy_1 soddisfa tutte le espressioni in repeated_message_2, l'evento corrisponde alla regola.
Ciò può portare a un comportamento imprevisto perché la regola repeated_message_1 non aveva l'indicizzazione degli array e non ha prodotto corrispondenze, mentre la regola repeated_message_2 utilizzava l'indicizzazione degli array e ha prodotto una corrispondenza.
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.