Wiederkehrende Felder

Unterstützt in:

Im Unified Data Model (UDM) sind einige Felder als „repeated“ (wiederholt) gekennzeichnet. Das bedeutet, dass sie Listen mit Werten oder anderen Arten von Nachrichten sind. 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 wiederholte Felder angewendet werden.

Stellen Sie sich folgendes Ereignis vor:

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 Modifikatoren any und all in Ausdrücken in wiederkehrenden Feldern.

  • any: Wenn ein beliebiges Element des wiederholten Felds die Bedingung erfüllt, erfüllt das Ereignis als Ganzes die Bedingung. Beispiel:

    • event_original erfüllt any $e.principal.ip = "192.0.2.1"
    • event_original schlägt fehl any $e.repeated_field.field_a = "9.9.9.9"
  • all: Wenn alle Elemente des wiederholten Felds die Bedingung erfüllen, erfüllt das Ereignis als Ganzes die Bedingung. Beispiel:

    • event_original erfüllt net.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8")
    • event_original schlägt fehl all $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 mit 192.168.12.16 übereinstimmen. Das bedeutet, dass in der Abfrage mindestens eine IP-Adresse geprüft wird, die nicht mit 192.168.12.16 übereinstimmt.
  • Mit all $e.principal.ip != "192.168.12.16" wird geprüft, ob alle IP-Adressen nicht mit 192.168.12.16 übereinstimmen. Bei der Abfrage wird also geprüft, ob keine IP-Adressen mit 192.168.12.16 übereinstimmen.

Einschränkungen:

  • Die Operatoren any und all sind nur mit sich wiederholenden Feldern (nicht mit skalaren Feldern) kompatibel.
  • any und all können nicht verwendet werden, um zwei wiederkehrende Felder zu verknüpfen. any $e1.principal.ip = $e2.principal.ip ist beispielsweise ungültig.
  • Die Operatoren any und all werden 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 wiederholte Feld eines Ereignisses n Elemente enthält, wird die Abfrage auf n Kopien des Ereignisses angewendet, wobei jede Kopie eines der Elemente des wiederholten Felds enthält. Diese Kopien sind temporär und werden nicht gespeichert.

Die Regel wird auf die folgenden Kopien angewendet:

Ereigniskopie 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 wiederholte Feld erfüllt, erfüllt das Ereignis als Ganzes alle Bedingungen. Wenn Sie also mehrere Bedingungen für ein wiederholtes Feld haben, muss eine einzelne Ereigniskopie alle Bedingungen erfüllen. In den folgenden Beispielabfragen wird das oben genannte 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 den Beispiel-Dataset event_original ausgeführt wird, da event_copy_1 alle Ereignisprädikate 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 bei der Ausführung für den Beispieldatensatz event_original keine Übereinstimmung zurück, da in $e.principal.ip keine Ereigniskopie vorhanden ist, 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 für wiederholte Felder sind mit unveränderten Ausdrücken für wiederholte Felder kompatibel, da die Elementliste für jede Ereigniskopie identisch ist. Sehen Sie sich die folgende Regel an:

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:

Ereigniskopie 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 gesamte Ereignis übereinstimmen.

Sie können sich diese Ausdruckstypen auch so vorstellen:

  • Ausdrücke für wiederholte Felder, in denen any oder all verwendet wird, werden für die Liste in event_original ausgeführt.
  • Ausdrücke für wiederholte Felder, in denen any oder all nicht verwendet wird, werden für einzelne event_copy_n-Ereignisse ausgeführt.

Platzhalter und wiederkehrende Felder

Wiederkehrende Felder funktionieren mit Platzhalterzuweisungen. Ähnlich wie bei unveränderten Ausdrücken für wiederholte Felder wird für jedes Element eine Kopie des Ereignisses erstellt. Im Beispiel mit event_copy nimmt der Platzhalter den Wert des wiederholten Felds von event_copy_n für jede der Ereigniskopien an, wobei n die Nummer der Ereigniskopie ist. Wenn der Platzhalter im Abschnitt „Übereinstimmung“ verwendet wird, kann dies zu mehreren Übereinstimmungen führen.

Beispiel: Platzhalter für wiederholtes 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 für den Abgleich 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 auf $ip, da sich diese im Abschnitt „Abstimmung“ befindet. Sie erhalten also drei Übereinstimmungen, bei denen die Variable $ip jeweils einen anderen Wert hat. Jede Übereinstimmung hat dieselbe Ereignisstichprobe: 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 wiederholten Felds zugewiesen, nicht der gesamten Liste. Wenn sie im Abschnitt outcome verwendet werden, wird das Ergebnis nur anhand der Elemente berechnet, die die vorherigen Abschnitte erfüllt haben.

Sehen Sie sich die folgende Regel an:

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:

Ereigniskopie $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 Ereignisbereich werden dann Zeilen herausgefiltert, die nicht mit den Filtern übereinstimmen:

Ereigniskopie $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 zum Kopieren von Ereignissen berechnet.

Schließlich wird jede Gruppe mit dem Abschnitt condition gefiltert. Da diese Regel nur das Vorhandensein von $e prüft, wird in der Zeile von oben nur ein Ereignis erkannt.

$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 Array-Indexierung für wiederholte Felder ausführen. Für den Zugriff auf das n-te wiederholte Feldelement verwenden Sie die Standardlistensyntax (Elemente sind 0-indiziert). 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 als true ausgewertet.

Einschränkungen:

  • Ein Index muss ein nicht negatives Ganzzahlliteral sein. $e.principal.ip[-1] ist beispielsweise ungültig.
  • Werte vom Typ int (z. B. ein Platzhalter, der auf int festgelegt ist) werden nicht berücksichtigt.
  • Die Array-Indexierung kann nicht mit any oder all kombiniert werden. any $e.intermediary.ip[0] ist beispielsweise ungültig.
  • Die Array-Indexierung kann nicht mit der Map-Syntax kombiniert werden. $e.additional.fields[0]["key"] ist beispielsweise ungültig.
  • Wenn der Feldpfad mehrere wiederholte Felder enthält, muss für alle wiederholten Felder die Array-Indexierung verwendet werden. $e.intermediary.ip[0] ist beispielsweise ungültig, da intermediary und ip beides wiederkehrende Felder sind, aber nur für ip ein Index vorhanden 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. Sehen Sie sich die folgende Regel an:

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:

Ereigniskopie 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 stimmt nicht mit der Regel überein, da keine Ereigniskopie vorhanden ist, die alle Ausdrücke erfüllt.

Wiederholte Nachrichten und Array-Indexierung

Ein weiteres unerwartetes Verhalten kann auftreten, wenn die Array-Indexierung mit unveränderten Ausdrücken für wiederholte Nachrichtenfelder verwendet wird. 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:

Ereigniskopie 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, stimmt das Ereignis mit der Regel überein.

Dies 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