Statistiken und Aggregationen in der UDM-Suche mit YARA-L 2.0

Unterstützt in:

Auf dieser Seite wird beschrieben, wie Sie statistische Abfragen für UDM-Ereignisse ausführen und die Ergebnisse mit YARA-L 2.0 für die Analyse gruppieren.

Übersicht

Wenn in Ihrer Umgebung eine große Anzahl von UDM-Ereignissen generiert wird, ist es wichtig, die Trends in Ihren UDM-Suchdaten zu kennen. Mithilfe von Statistiken und Aggregationsfunktionen können Sie aus Ihren UDM-Logs umsetzbare Informationen gewinnen. Die UDM-Suche unterstützt alle Aggregatfunktionen in YARA-L 2.0.

Sie können statistische Abfragen für die folgenden Anwendungsfälle verwenden:

  • Kritische Messwerte erfassen: Sie können die Verteilung und Häufigkeit von UDM-Ereignissen und der zugehörigen Assets messen, z. B. von Hosts, die mit bekannten schädlichen IP-Adressen kommunizieren.

  • Ungewöhnliches Verhalten erkennen: Sie können ungewöhnliche Muster oder Spitzen bei Aktivitäten erkennen, die auf einen Sicherheitsvorfall hinweisen könnten, z. B. ungewöhnliches Netzwerkverkehrsvolumen oder unerwartete Anmeldeaktivitäten zu ungewöhnlichen Zeiten.

  • Trends im Zeitverlauf analysieren: Sie können Änderungen am Sicherheitsstatus ermitteln, um die Auswirkungen von Kontrollen zu bewerten oder Bereiche zu finden, die verbessert werden müssen. So können Sie beispielsweise die Änderungen bei der Anzahl der Sicherheitslücken im Zeitverlauf verfolgen.

Sie können die Ergebnisse von UDM-Suchanfragen mit einer Syntax gruppieren und sortieren, die der YARA-L-Struktur in den Regeln der Erkennungsmechanismen ähnelt. Weitere Informationen finden Sie unter YARA-L 2.0-Sprachsyntax.

Die Abfragestruktur sieht so aus:

  1. Filteranweisung: Die Filteranweisung gibt die Bedingungen an, nach denen Ereignisse gefiltert werden.

  2. Abgleich (optional): Im Bereich „Abgleich“ werden die Felder angegeben, nach denen gruppiert werden soll. Weitere Informationen finden Sie unter Syntax des Abgleichsabschnitts.

  3. Ergebnis: Im Bereich „Ergebnis“ werden die Ergebnisse der Abfrage angegeben. Weitere Informationen finden Sie unter Syntax des Abschnitts „Ergebnis“.

  4. Sortierung: Im Bereich „Sortierung“ wird die Reihenfolge der zurückgegebenen Abfrageergebnisse festgelegt. Wenn die Reihenfolge (asc oder desc) nicht angegeben ist, wird standardmäßig asc verwendet.

  5. Limit (optional): Im Bereich „Limit“ wird die maximale Anzahl von Zeilen angegeben, die die Abfrage zurückgibt.

Hier ein Beispiel für die Verwendung von „order“ und „limit“:

metadata.log_type = "OKTA"

match:
    principal.ip
Outcome:
    $user_count_by_ip = count(principal.user.userid)

order:
 $user_count_by_ip desc

limit:
    20

Zusammenfassungen

Die UDM-Suche unterstützt die folgenden Aggregatfunktionen:

Summe

sum(numericExpression)

Beschreibung

Die Funktion sum gibt die Summe der Werte in einer numerischen Spalte zurück. NULL-Werte werden bei der Berechnung ignoriert. Sie wird oft mit match verwendet, um Summen innerhalb verschiedener Gruppen in den Daten zu berechnen.

Param-Datentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Alle Ereignisse finden, bei denen target.ip nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip übereinstimmen, die Summe von network.sent_bytes in einer Variablen namens sent_bytes.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $sent_bytes = sum(network.sent_bytes)

Min.

min(numericExpression)

Beschreibung

Die Funktion min gibt den kleinsten Wert in einer numerischen Spalte zurück. Sie wird oft mit match verwendet, um den Mindestwert innerhalb jeder Gruppe in den Daten zu ermitteln.

Param-Datentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Alle Ereignisse finden, bei denen target.ip nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip übereinstimmen, das Minimum von metadata.event_timestamp.seconds in einer Variablen namens min_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $min_seconds = min(metadata.event_timestamp.seconds)

max

max(numericExpression)

Beschreibung

Die Funktion max gibt den Höchstwert der Werte in einer numerischen Spalte zurück. Sie wird oft mit match verwendet, um den Maximalwert innerhalb jeder Gruppe in den Daten zu ermitteln.

Param-Datentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Alle Ereignisse finden, bei denen target.ip nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip übereinstimmen, das Maximum von metadata.event_timestamp.seconds in einer Variablen namens max_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $max_seconds = max(metadata.event_timestamp.seconds)

Ø

avg(numericExpression)

Beschreibung

Die Funktion avg gibt den Durchschnitt der Werte in einer numerischen Spalte zurück. NULL-Werte werden bei der Berechnung ignoriert. Sie wird oft mit match verwendet, um Mittelwerte innerhalb bestimmter Gruppen in den Daten zu berechnen.

Param-Datentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Alle Ereignisse finden, bei denen target.ip nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip übereinstimmen, den Durchschnitt von metadata.event_timestamp.seconds in einer Variablen namens avg_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $avg_seconds = avg(metadata.event_timestamp.seconds)

Anzahl

count(expression)

Beschreibung

Die Funktion count gibt die Anzahl der Zeilen in einer Gruppe zurück. Sie wird oft mit match verwendet, um Zählungen für bestimmte Gruppen in den Daten zu erhalten.

Param-Datentypen

STRING

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Die Anzahl der erfolgreichen Nutzeranmeldungen im Zeitverlauf zurückgeben.

  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)

Beschreibung

Die Funktion count_distinct gibt die Anzahl der Zeilen zurück, die innerhalb einer Gruppe unterschiedliche Werte haben. Sie wird oft mit match verwendet, um Zählungen für bestimmte Gruppen in den Daten zu erhalten.

Param-Datentypen

STRING

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Die Anzahl der einzelnen erfolgreichen Nutzeranmeldungen im Zeitverlauf zurückgeben.

  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)

Array

array(expression)

Beschreibung

Die Funktion array gibt alle Werte in Form einer Liste zurück. Die Liste wird auf maximal 25 beliebige Elemente gekürzt.

Param-Datentypen

STRING

Rückgabetyp

LIST

Codebeispiele

Beispiel

Gibt ein Array mit Ereignistypen zurück.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array($event_type)

array_distinct

array_distinct(expression)

Beschreibung

Die Funktion array_distinct gibt alle eindeutigen Werte in Form einer Liste zurück. Die Liste wird auf maximal 25 zufällige Elemente gekürzt. Die Deduplizierung, um eine eindeutige Liste zu erhalten, wird vor der Kürzung angewendet.

Param-Datentypen

STRING

Rückgabetyp

LIST

Codebeispiele

Beispiel

Gibt ein Array mit verschiedenen Ereignistypen zurück.

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array_distinct($event_type)

stddev

stddev(numericExpression)

Beschreibung

Die Funktion stddev gibt die Standardabweichung aller möglichen Werte zurück.

Param-Datentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Alle Ereignisse finden, bei denen target.ip nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip übereinstimmen, die Standardabweichung von metadata.event_timestamp.seconds in einer Variablen namens stddev_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $stddev_seconds = stddev(metadata.event_timestamp.seconds)

Unterschiede zwischen der Verwendung von YARA-L 2.0 in der Suche und in UDM

  • Das Keyword over, mit dem nach Ereignissen innerhalb eines bestimmten Zeitraums gesucht werden kann, ist in der Suche nicht zulässig.

  • Die Struktur der UDM-Suchanfrage enthält nicht die Abschnitte condition und option.

Nach zeitlichem Detaillierungsgrad gruppieren

Sie können alle Ereignisfelder und Platzhalter im Bereich match nach einer bestimmten Zeitgranularität gruppieren, ähnlich wie eine Spalte, nach der Sie in SQL gruppieren können.

Die Syntax lautet:

match:
  ... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]

Wenn Sie nach Zeitgranularität gruppieren möchten, können Sie entweder das Schlüsselwort by oder over every verwenden. Zulässige Zeitauflösungen:

  • MINUTE oder m
  • HOUR oder h
  • DAY oder d
  • WEEK oder w
  • MONTH oder mo

Sowohl das Schlüsselwort by als auch das Schlüsselwort over every sind funktional äquivalent. Sie können eine der beiden Optionen verwenden.

Beispiele

Gruppieren Sie IP-Adresse und Hostnamen nach Stunden.

$hostname = principal.hostname
match:
  $hostname, target.ip by hour

Gruppieren Sie die Anzahl aller Ereignisse nach Hostnamen und nach dem Tag, an dem das Ereignis aufgetreten ist.

$hostname = target.hostname
match:
  $hostname over every day
outcome:
  $events_count = count($hostname)

Einige Datenquellen, z. B. der Entitätskontext, sind für einen bestimmten Zeitraum (<start_time>, <end_time>) gültig und haben keinen einzelnen Zeitstempel.

Das Keyword first ist ein optionales Keyword, mit dem eine Datenquelle, die über einen bestimmten Zeitraum gültig ist, so behandelt wird, als wäre sie nur für einen einzelnen Zeitstempel gültig. Das bedeutet, dass für eine Datenquelle, die für einen bestimmten Zeitraum gültig ist, beim Keyword first nur der Beginn (<start_time>) berücksichtigt wird. Die Endzeit des Zeitraums wird ignoriert.

Angenommen, eine Entität hat den Zeitraum (1m, 5m) mit einer Zeitgranularität von 1 Minute. Angenommen, die Ergebnisse sind nach Hosts gruppiert, die [h1, h2] sind. Die zurückgegebenen Spalten sind dann (h1, 1m) und (h2, 1m), da der Rest des Zeitraums ignoriert wird.

Das Keyword first kann sowohl by als auch over every hinzugefügt werden. Das hat für beide Keywords dasselbe Verhalten zur Folge. Die Verwendung von by first entspricht over every first.

Im folgenden Beispiel wird der Operator by mit der Datenquelle „Entitätskontext“ verwendet, die für einen bestimmten Zeitraum gültig ist. In dieser Abfrage wird der gesamte Zeitraum berücksichtigt, da das Keyword first weggelassen wird.

graph.entity.hostname != ""
match:
  graph.entity.ip by hour
outcome:
  $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)