Wiederkehrende Felder
Im Unified Data Model (UDM) sind einige Felder als wiederholt gekennzeichnet. Das bedeutet, dass es sich um Listen mit Werten oder anderen Nachrichtentypen handelt. In diesem Dokument finden Sie Informationen zur Verwendung von Ausdrücken, Platzhaltern, Array-Indexierung und wiederholten Nachrichten für wiederholte UDM-Felder.
Boolesche Ausdrücke und wiederkehrende Felder
Geänderte und unveränderte boolesche Ausdrücke können auf wiederkehrende Felder angewendet werden.
Betrachten Sie das folgende Ereignis:
event_original {
principal {
// ip is a repeated field
ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]
hostname: "host"
}
}
Geänderte Ausdrücke
Verwenden Sie die Modifizierer any und all in Ausdrücken in wiederkehrenden Feldern.
any: Wenn ein beliebiges Element des wiederkehrenden Felds die Bedingung erfüllt, erfüllt das Ereignis als Ganzes die Bedingung. Beispiel:event_originalerfülltany $e.principal.ip = "192.0.2.1"event_originalschlägt fehlany $e.repeated_field.field_a = "9.9.9.9"
all: Wenn alle Elemente des wiederkehrenden Felds die Bedingung erfüllen, erfüllt das Ereignis insgesamt die Bedingung. Beispiel:event_originalerfülltnet.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8")event_originalschlägt fehlall $e.principal.ip = "192.0.2.2"
Wenn Sie eine Bedingung mit any oder all schreiben, beachten Sie, dass die Negierung der Bedingung mit not möglicherweise nicht dieselbe Bedeutung hat wie die Verwendung des negierten Operators.
Beispiel:
- Mit
not all $e.principal.ip = "192.168.12.16"wird geprüft, ob nicht alle IP-Adressen mit192.168.12.16übereinstimmen. Das bedeutet, dass mit der Abfrage geprüft wird, ob mindestens eine IP-Adresse nicht mit192.168.12.16übereinstimmt. - Mit
all $e.principal.ip != "192.168.12.16"wird geprüft, ob alle IP-Adressen nicht mit192.168.12.16übereinstimmen. Bei der Abfrage wird also geprüft, ob keine IP-Adressen mit192.168.12.16übereinstimmen.
Einschränkungen:
- Die Operatoren
anyundallsind nur mit wiederkehrenden Feldern (nicht mit skalaren Feldern) kompatibel. anyundallkönnen nicht verwendet werden, um zwei wiederkehrende Felder zu verknüpfen. Beispiel:any $e1.principal.ip = $e2.principal.ipist nicht gültig.- Die Operatoren
anyundallwerden mit dem Ausdruck für die Referenzliste nicht unterstützt.
Unveränderte Ausdrücke
Bei unveränderten Ausdrücken wird jedes Element im wiederkehrenden Feld einzeln behandelt. Wenn das wiederkehrende Feld eines Ereignisses n Elemente enthält, wird die Abfrage auf n Kopien des Ereignisses angewendet, wobei jede Kopie eines der Elemente des wiederkehrenden Felds enthält. Diese Kopien sind temporär und werden nicht gespeichert.
Die Regel wird auf die folgenden Kopien angewendet:
| event copy | 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“ |
Wenn eine Ereigniskopie alle unveränderten Bedingungen für das wiederkehrende Feld erfüllt, erfüllt das Ereignis als Ganzes alle Bedingungen. Wenn Sie also mehrere Bedingungen für ein wiederkehrendes Feld haben, muss eine einzelne Ereigniskopie alle erfüllen. In den folgenden Abfragebeispielen wird das obige Beispiel-Dataset verwendet, um dieses Verhalten zu veranschaulichen.
Beispiel: Unveränderte Ausdrücke
Die folgende Regel gibt eine Übereinstimmung zurück, wenn sie für das Beispiel-Dataset event_original ausgeführt wird, da event_copy_1 alle Ereignisvorhersagen erfüllt:
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
}
Die folgende Regel gibt keine Übereinstimmung zurück, wenn sie für das Beispieldataset event_original ausgeführt wird, da es in $e.principal.ip keine Ereigniskopie gibt, die _alle_ Ereignisprädikate erfüllt.
rule repeated_field_2 {
meta:
events:
$e.principal.ip = "192.0.2.1"
$e.principal.ip = "192.0.2.2"
condition:
$e
}
Geänderte Ausdrücke in wiederkehrenden Feldern sind mit unveränderten Ausdrücken in wiederkehrenden Feldern kompatibel, da die Elementliste für jede Ereigniskopie gleich ist. Betrachten Sie die folgende Regel:
rule repeated_field_3 {
meta:
events:
any $e.principal.ip = "192.0.2.1"
$e.principal.ip = "192.0.2.3"
condition:
$e
}
Die Regel wird auf die folgenden Kopien angewendet:
| event copy | 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 diesem Fall erfüllen alle Kopien any $e.principal.ip = "192.0.2.1", aber nur event_copy_3 erfüllt $e.principal.ip = "192.0.2.3". Daher würde das Ereignis insgesamt übereinstimmen.
Eine andere Möglichkeit, diese Ausdruckstypen zu betrachten, ist:
- Ausdrücke für wiederkehrende Felder, die
anyoderallverwenden, werden auf die Liste inevent_originalangewendet. - Ausdrücke für wiederkehrende Felder, in denen
anyoderallnicht verwendet wird, werden für einzelneevent_copy_n-Ereignisse ausgeführt.
Platzhalter und wiederkehrende Felder
Wiederkehrende Felder funktionieren mit Platzhalterzuweisungen. Ähnlich wie bei unveränderten Ausdrücken für wiederkehrende Felder wird für jedes Element eine Kopie des Ereignisses erstellt. Im selben Beispiel mit event_copy nimmt der Platzhalter den Wert des wiederkehrenden Felds von event_copy_n für jede der Ereigniskopien an, wobei n die Nummer der Ereigniskopie ist. Wenn der Platzhalter im Abgleichbereich verwendet wird, kann dies zu mehreren Übereinstimmungen führen.
Beispiel: Platzhalter für wiederkehrendes Feld
Im folgenden Beispiel wird eine Übereinstimmung generiert. Der Platzhalter `$ip` entspricht für `event_copy_1` `192.0.2.1`, was den Bedingungen in der Regel entspricht. Die Ereignisbeispiele der Übereinstimmung enthalten ein einzelnes Element, `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
}
Im folgenden Beispiel werden drei Übereinstimmungen generiert. Der Platzhalter $ip entspricht für jede der verschiedenen event_copy_n-Kopien unterschiedlichen Werten.
Die Gruppierung erfolgt nach $ip, da sich dieses Feld im Abschnitt „Übereinstimmung“ befindet. Sie erhalten also drei Übereinstimmungen, bei denen die Variable $ip jeweils einen anderen Wert hat. Jede Übereinstimmung hat dasselbe Ereignisbeispiel: ein einzelnes Element, 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
}
Ergebnisse mit Platzhaltern, die wiederkehrenden Feldern zugewiesen sind
Platzhalter werden jedem Element jedes wiederkehrenden Felds zugewiesen, nicht der gesamten Liste. Wenn sie im Abschnitt outcome verwendet werden, wird das Ergebnis nur anhand der Elemente berechnet, die die Bedingungen der vorherigen Abschnitte erfüllt haben.
Beachten Sie die folgende Regel:
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
}
Diese Regel wird in vier Phasen ausgeführt. Die erste Phase ist das Kopieren von Ereignissen:
| event copy | $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 |
Im Abschnitt „Ereignisse“ werden dann Zeilen herausgefiltert, die nicht mit den Filtern übereinstimmen:
| Eventkopie | $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 wird herausgefiltert, weil "192.0.2.3" nicht $ip = "192.0.2.1" or $ip = "192.0.2.2" entspricht.
Im Abschnitt match wird dann nach Abgleichsvariablen gruppiert und im Abschnitt outcome wird die Aggregation für jede Gruppe ausgeführt:
| $host | $o | $e |
|---|---|---|
| "host" | ["192.0.2.1", "192.0.2.2"] | event_id |
$o = array_distinct($ip) wird anhand von $ip aus der vorherigen Phase und nicht aus der Phase des Kopierens von Ereignissen berechnet.
Schließlich wird jede Gruppe mit dem Abschnitt condition gefiltert. Da mit dieser Regel nur geprüft wird, ob $e vorhanden ist, wird in der Zeile von oben nur ein einziger Treffer erzielt.
$o enthält nicht alle Elemente aus $e.principal.ip, da nicht alle Elemente alle Bedingungen im Bereich „Ereignisse“ erfüllt haben. Alle Elemente von e.principal.ip werden jedoch im Ereignisbeispiel angezeigt, da im Ereignisbeispiel event_original verwendet wird.
Array-Indexierung
Sie können die Array-Indexierung für wiederkehrende Felder ausführen. Verwenden Sie die Standardlistsyntax, um auf das n-te wiederholte Feldelement zuzugreifen (Elemente sind 0-indexiert). Bei einem Element außerhalb des gültigen Bereichs wird der Standardwert zurückgegeben.
$e.principal.ip[0] = "192.168.12.16"$e.principal.ip[999] = ""Wenn weniger als 1.000 Elemente vorhanden sind, wird dies alstrueausgewertet.
Einschränkungen:
- Ein Index muss ein nicht negatives Ganzzahlliteral sein. Beispiel:
$e.principal.ip[-1]ist nicht gültig. - Werte vom Typ
int(z. B. ein Platzhalter, der aufintgesetzt ist) werden nicht berücksichtigt. - Die Array-Indexierung kann nicht mit
anyoderallkombiniert werden.any $e.intermediary.ip[0]ist beispielsweise ungültig. - Die Array-Indexierung kann nicht mit der Kartensyntax kombiniert werden. Beispiel:
$e.additional.fields[0]["key"]ist nicht gültig. - Wenn der Feldpfad mehrere wiederkehrende Felder enthält, müssen alle wiederkehrenden Felder die Array-Indexierung verwenden. Beispiel:
$e.intermediary.ip[0]ist nicht gültig, daintermediaryundipwiederkehrende Felder sind, aber nur ein Index füripvorhanden ist.
Wiederholte Nachrichten
Wenn ein message-Feld wiederholt wird, wird die Wahrscheinlichkeit einer Übereinstimmung unbeabsichtigt verringert. Dies wird in den folgenden Beispielen veranschaulicht.
Stellen Sie sich folgendes Ereignis vor:
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"
}
}
Wie bei unveränderten Ausdrücken für wiederkehrende Felder wird für jedes Element des wiederkehrenden Felds eine temporäre Kopie des Ereignisses erstellt. Betrachten Sie die folgende Regel:
rule repeated_message_1 {
meta:
events:
$e.about.ip = "192.0.2.1"
$e.about.hostname = "bob"
condition:
$e
}
Die Regel wird auf die folgenden Kopien angewendet:
| Eventkopie | 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“ |
Das Ereignis entspricht nicht der Regel, da keine Ereigniskopie vorhanden ist, die alle Ausdrücke erfüllt.
Wiederholte Nachrichten und Array-Indexierung
Ein weiteres unerwartetes Verhalten kann auftreten, wenn Sie die Array-Indexierung mit unveränderten Ausdrücken für wiederholte Nachrichtenfelder verwenden. Sehen Sie sich die folgende Beispielregel an, in der die Array-Indexierung verwendet wird:
rule repeated_message_2 {
meta:
events:
$e.about.ip = "192.0.2.1"
$e.about[1].hostname = "bob"
condition:
$e
}
Die Regel wird auf die folgenden Kopien angewendet:
| event copy | 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“ |
Da event_copy_1 alle Ausdrücke in repeated_message_2 erfüllt, entspricht das Ereignis der Regel.
Das kann zu unerwartetem Verhalten führen, da in Regel repeated_message_1 keine Array-Indexierung verwendet wurde und keine Übereinstimmungen gefunden wurden, während in Regel repeated_message_2 Array-Indexierung verwendet wurde und eine Übereinstimmung gefunden wurde.
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten