Statistiken und Aggregationen bei der Suche über 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.

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

Anwendungsfälle für statistische Abfragen

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

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

  • Anomalien erkennen: Sie können Aktivitätsspitzen erkennen, die auf Sicherheitsvorfälle hindeuten, z. B. unerwartete Netzwerkverkehrsspitzen oder Log-ins außerhalb der Geschäftszeiten.

  • Trends im Zeitverlauf analysieren: Sie können Änderungen des Sicherheitsstatus bewerten, um die Effektivität von Kontrollen zu beurteilen oder verbesserungswürdige Bereiche zu identifizieren, z. B. durch die Beobachtung von Schwankungen der Anzahl der Sicherheitslücken im Zeitverlauf.

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

Die YARA-L 2.0-Abfragestruktur sieht so aus:

  • Filteranweisung: Gibt die Bedingungen zum Filtern von Ereignissen an.

  • Abgleichen (optional): Definiert die Felder, nach denen gruppiert werden soll. Weitere Informationen finden Sie unter Syntax für den Abschnitt „Abgleich“.

  • Ergebnis: Gibt die Ausgaben der Abfrage an. Weitere Informationen finden Sie unter Syntax für Ergebnisabschnitte.

  • Order: Bestimmt die Reihenfolge der Abfrageergebnisse als asc (aufsteigend) oder desc (absteigend). Wenn die Reihenfolge (asc oder desc) nicht angegeben ist, wird standardmäßig asc verwendet.

  • Limit (optional): Legt die maximale Anzahl der Zeilen fest, die von der Abfrage zurückgegeben werden.

Hier ist 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:

Array

array(expression)

Beschreibung

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

Parameterdatentypen

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 zur Erstellung einer Liste mit eindeutigen Werten erfolgt vor dem Kürzen.

Parameterdatentypen

STRING

Rückgabetyp

LIST

Codebeispiele

Beispiel

Gibt ein Array mit unterschiedlichen Ereignistypen zurück.

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

durchschn.

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 häufig mit match verwendet, um die Durchschnittswerte innerhalb bestimmter Gruppen in den Daten zu berechnen.

Parameterdatentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Suchen Sie nach allen Ereignissen, bei denen target.ip nicht leer ist. Für alle Ereignisse, die mit principal.ip übereinstimmen, wird der Durchschnitt von metadata.event_timestamp.seconds in einer Variablen namens avg_seconds gespeichert.

  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 häufig mit match verwendet, um die Anzahl für bestimmte Gruppen in den Daten zu ermitteln.

Parameterdatentypen

STRING

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Gibt die Anzahl der erfolgreichen Nutzeranmeldungen im Zeitverlauf zurück.

  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 mit unterschiedlichen Werten in einer Gruppe zurück. Sie wird häufig mit match verwendet, um die Anzahl für bestimmte Gruppen in den Daten zu ermitteln.

Parameterdatentypen

STRING

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Gibt die Anzahl der eindeutigen erfolgreichen Nutzeranmeldungen im Zeitverlauf zurück.

  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)

max

max(numericExpression)

Beschreibung

Die Funktion max gibt den Maximalwert der Werte in einer numerischen Spalte zurück. Sie wird häufig mit match verwendet, um den Maximalwert in jeder Gruppe in den Daten abzurufen.

Parameterdatentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Suchen Sie nach allen Ereignissen, bei denen target.ip nicht leer ist. Für alle Ereignisse, die mit principal.ip übereinstimmen, wird der Maximalwert von metadata.event_timestamp.seconds in einer Variablen namens max_seconds gespeichert.

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

Min.

min(numericExpression)

Beschreibung

Die Funktion min gibt den Mindestwert der Werte in einer numerischen Spalte zurück. Sie wird häufig mit match verwendet, um den Mindestwert in jeder Gruppe in den Daten zu ermitteln.

Parameterdatentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Suchen Sie nach allen Ereignissen, 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)

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 häufig zusammen mit match verwendet, um die Summen innerhalb verschiedener Gruppen in den Daten zu berechnen.

Parameterdatentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Suchen Sie nach allen Ereignissen, bei denen target.ip nicht leer ist. Für alle Ereignisse, die mit principal.ip übereinstimmen, wird die Summe von network.sent_bytes in einer Variablen namens sent_bytes gespeichert.

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

stddev

stddev(numericExpression)

Beschreibung

Die Funktion stddev gibt die Standardabweichung für alle möglichen Werte zurück.

Parameterdatentypen

NUMBER

Rückgabetyp

NUMBER

Codebeispiele

Beispiel

Suchen Sie nach allen Ereignissen, 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)

frühesten

earliest(timestamp)

Beschreibung

Die Funktion earliest gibt den frühesten Zeitstempel aus einer Gruppe von Datensätzen mit Mikrosekundenauflösung zurück.

Parameterdatentypen

TIMESTAMP

Rückgabetyp

TIMESTAMP

Codebeispiele

Beispiel

Speichern Sie für alle Ereignisse, die mit hostname übereinstimmen, den frühesten Wert von metadata.event_timestamp in der Variablen start.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $start = earliest(metadata.event_timestamp)

neueste

latest(timestamp)

Beschreibung

Die Funktion latest gibt den letzten Zeitstempel aus einer Reihe von Datensätzen mit Mikrosekundenauflösung zurück.

Parameterdatentypen

TIMESTAMP

Rückgabetyp

TIMESTAMP

Codebeispiele

Beispiel

Speichern Sie für alle Ereignisse, die mit hostname übereinstimmen, den neuesten Wert von metadata.event_timestamp in der Variablen end.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $end = latest(metadata.event_timestamp)

YARA-L 2.0: Suche im Vergleich zur UDM-Nutzung

  • Das Keyword over, das für die Suche nach Ereigniszeiträumen verwendet wird, wird in der Suche nicht unterstützt.

  • UDM-Suchanfragen enthalten nicht die Abschnitte condition und option.

Nach Zeitgranularität gruppieren

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

Die Syntax lautet so:

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. Folgende Zeitgranularitäten sind zulässig:

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

Die Schlüsselwörter by und over every sind funktional gleichwertig. Sie können eines der beiden verwenden.

Beispiele

IP-Adresse und Hostname nach Stunde gruppieren.

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

Gruppieren Sie die Anzahl aller Ereignisse nach Hostname 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 Zeitraum (<start_time>, <end_time>) gültig und haben keine einzelnen Zeitstempel.

Das Keyword first ist optional und gilt für einen einzelnen Zeitstempel. Das bedeutet, dass für eine Datenquelle, die für einen bestimmten Zeitraum gültig ist, mit dem Keyword first nur die Startzeit (<start_time>) berücksichtigt wird.

Angenommen, Sie haben eine Einheit mit dem Zeitraum (1m, 5m) und der Zeitgranularität 1m. Wenn die Ergebnisse nach Hosts gruppiert werden (h1,h2), sind die zurückgegebenen Spalten (h1, 1m) und (h2, 1m). Der Rest des Zeitbereichs wird ignoriert.

Das Keyword first kann sowohl by als auch over every hinzugefügt werden. Das Ergebnis ist in beiden Fällen dasselbe. Die Verwendung von by first entspricht over every first.

Das folgende Beispiel zeigt eine Abfrage, in der der Operator by mit der Datenquelle für den Entitätskontext verwendet wird, die für einen Zeitraum gültig ist. In dieser Abfrage wird der gesamte Zeitraum berücksichtigt, da das Keyword first ausgelassen wird.

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

Visualisierungen in der Suche erstellen und speichern

In diesem Abschnitt werden die Funktionen zur Datenvisualisierung in der Google SecOps-Suche für einheitliche Datenmodelle (Unified Data Model, UDM) beschrieben. Mit dieser Funktion können SOC-Analysten (Security Operations Center) Bedrohungen effizient erkennen, untersuchen und darauf reagieren, indem sie Visualisierungen aus Suchergebnissen erstellen und in Dashboards speichern.

Visualisierungen für das Dashboard erstellen und speichern

So erstellen und speichern Sie Visualisierungen, die Sie dem Dashboard hinzufügen können:

  1. Schreiben Sie eine YARA-L-Abfrage mit den Abschnitten match und outcome.

  2. Wählen Sie einen Zeitraum aus und klicken Sie dann auf Suche ausführen, um die Abfrage auszuführen. Die Ergebnisse finden Sie auf den Tabs Statistiken und Visualisieren.

  3. Gehen Sie auf dem Tab Visualisieren so vor: a. Wählen Sie in der Liste Diagrammtyp einen Diagrammtyp aus. b. Passen Sie die Einstellungen unter Dateneinstellungen an, um das Diagramm anzupassen.

  4. Führen Sie auf dem Bildschirm Zum Dashboard hinzufügen die folgenden Schritte aus: a. Geben Sie einen Diagrammnamen, eine Beschreibung und einen Zeitbereich ein. b. Sie können das Diagramm einem vorhandenen Dashboard hinzufügen oder ein neues Dashboard erstellen.

  5. Klicken Sie auf Zum Dashboard hinzufügen, um das Diagramm dem Dashboard hinzuzufügen.

Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten