Syntax für Ergebnisabschnitt

Unterstützt in:

Im outcome-Abschnitt einer YARA-L-Abfrage werden Ergebnisvariablen definiert, die die Ausgabe für eine Such- und Dashboard-Abfrage sowie zusätzlichen Kontext und Informationen für eine Erkennung angeben, wenn eine Regel ausgelöst wird. Diese Variablen können für verschiedene Zwecke verwendet werden, z. B. zum Anzeigen relevanter Daten in Dashboards und zum Erstellen von Risikobewertungen.

Ergebnisabschnitt definieren

Verwenden Sie das Zeichen $, gefolgt von einem Variablennamen, um eine Ergebnisvariable im Bereich outcome einer einzelnen Abfrage zu definieren. Sie können bis zu 20 Ergebnisvariablen definieren. Die Variablennamen selbst sind beliebig. Bei Regeln werden Ergebniswerte basierend auf jeder Erkennung berechnet und aggregiert.

Jeder Ergebnisvariablen wird mithilfe eines Ausdrucks ein Wert zugewiesen.

Mit dieser Regel wird nach fehlgeschlagenen Anmeldeversuchen von einem neuen Standort gesucht:

rule failed_logins
{
  meta:
   author = "Security Team"
   description = "Detects multiple failed user logins within 10-minute windows."
   severity = "HIGH"

  events:
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $user = $e.target.user.userid

  match:
   $user over 10m

  outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

  condition:
   #e >= 5
}

Im Abschnitt outcome werden die Ereignis- und Platzhaltervariablen aggregiert: Die fehlgeschlagenen Anmeldungen und die eindeutigen IP-Adressen werden gezählt und die Uhrzeit des Fehlers wird abgerufen.

outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

Wenn Sie die spezielle Ergebnisvariable $risk_score einfügen und ausfüllen, wird ihr Wert (Ganzzahl oder Gleitkommazahl) auf der Seite Benachrichtigungen und IoCs für Benachrichtigungen angezeigt, die von der Abfrage generiert werden.

Wenn Sie im Abschnitt outcome einer Abfrage keine $risk_score-Variable angeben, wird einer der folgenden Standardwerte festgelegt:

  • Wenn die Abfrage so konfiguriert ist, dass eine Benachrichtigung generiert wird, ist $risk_score auf 40 gesetzt.

  • Wenn die Abfrage nicht so konfiguriert ist, dass eine Benachrichtigung generiert wird, wird $risk_score auf 15 gesetzt.

Der Wert von $risk_score wird im UDM-Feld security_result.risk_score gespeichert.

Ergebnisvariable für Risikobewertung

In Google SecOps Risk Analytics werden Erkennungen und Warnungen automatisch mit Entitäten verknüpft, die mit der jeweiligen Erkennung oder Warnung in Verbindung stehen. Mit der Ergebnisvariablen risk_score wird ein Risikobetrag zugewiesen. Wenn dieser Wert nicht festgelegt ist, wird der Standardwert für die Erkennung oder Benachrichtigung verwendet. Sie können Standardwerte in den Einstellungen konfigurieren.

Um die Konsistenz auf der Plattform zu gewährleisten, empfehlen wir, beim Zuweisen einer risk_score zu Ihren benutzerdefinierten Erkennungen die folgenden Wertebereiche zu verwenden. Diese Ausrichtung trägt dazu bei, die Priorisierung von Benachrichtigungen und die Reaktions-Workflows zu standardisieren.

Schweregrad Punktzahlbereich Beschreibung Beispiel
Benachrichtigung – Kritisch 90–100 Aktive Manipulation mit dem Potenzial, sich über ein einzelnes Nutzerkonto oder einen einzelnen Endpunkt hinaus auszuwirken. Sofortige Überprüfung erforderlich. Mimikatz wurde auf dem Domaincontroller ausgeführt.
Benachrichtigungen – Hoch 80–89 Aktiver Angriff auf einen einzelnen Endpunkt oder eine einzelne Identität. Sollte sofort überprüft werden. Der Produktionsserver ruft ein aktuelles, bekanntes C2 auf.
Benachrichtigungen – Mittel 50–79 Potenzielles Sicherheitsproblem, das untersucht werden muss. Keine bestätigte Manipulation, aber Eskalierung möglich. Offengelegte Anmeldedaten, keine Anzeichen von Missbrauch
Keine Benachrichtigung – niedrig 20–49 Sicherheitsereignis mit geringen Auswirkungen, das in Kombination mit anderen Indikatoren oder Beobachtungen zu einem schwerwiegenderen Vorfall führen könnte. In der Regel ist keine Überprüfung erforderlich. Kann mit anderen Erkennungen durch zusammengesetzte Regeln kombiniert werden, um eine Benachrichtigung zu erstellen. Interner Portscan.
Beobachtungen ohne Benachrichtigung 1–19 Im Allgemeinen sind das Informationen, die dazu dienen, ein Situationsbewusstsein für eine Bedrohung zu schaffen. Erfordert in der Regel keine Überprüfung; kann durch zusammengesetzte Regeln mit anderen Erkennungen kombiniert werden, um Benachrichtigungen zu generieren. Ein Anmeldeereignis, keine Anzeichen von Missbrauch.

Da risk_score eine Ergebnisvariable ist, können Ihre Regeln je nach Faktoren wie Threat Intelligence oder anderen gleichzeitigen Bedingungen Nuancen ausdrücken.

Risikobewertungen für Entitäten können verwendet werden, um risikobasierte Benachrichtigungen nahezu in Echtzeit zu generieren. Weitere Informationen finden Sie unter Übersicht über Risk Analytics.

Datentypen von Ergebnisvariablen

Jede Ergebnisvariable kann einen anderen Datentyp haben, der durch den Ausdruck bestimmt wird, mit dem sie berechnet wird. Die folgenden Ergebnisdatentypen werden in Google SecOps unterstützt:

  • integer
  • Floats
  • String
  • Listen mit Ganzzahlen
  • Listen mit Floats
  • Listen mit Strings

Bedingte Logik

Mit bedingter Logik können Sie den Wert eines Ergebnisses berechnen. Bedingungen werden mit dem folgenden Syntaxmuster angegeben:

if(BOOL_CLAUSE, THEN_CLAUSE)
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)

Ein bedingter Ausdruck kann so gelesen werden: „Wenn BOOL_CLAUSE wahr ist, gib THEN_CLAUSE zurück, andernfalls gib ELSE_CLAUSE zurück.“

BOOL_CLAUSE muss in einen booleschen Wert aufgelöst werden. Ein BOOL_CLAUSE-Ausdruck hat eine ähnliche Form wie Ausdrücke im events-Abschnitt. Sie kann beispielsweise Folgendes enthalten:

  • UDM-Feldnamen mit Vergleichsoperator:

    if($context.graph.entity.user.title = "Vendor", 100, 0)

  • Platzhaltervariable, die im Abschnitt events definiert wurde:

    if($severity = "HIGH", 100, 0)

  • Eine weitere Ergebnisvariable, die im Abschnitt outcome definiert ist:

    if($risk_score > 20, "HIGH", "LOW")

  • Funktionen, die einen booleschen Wert zurückgeben:

    if(re.regex($e.network.email.from, `.*altostrat.com`), 100, 0)

  • In einer Referenzliste nachschlagen:

    if($u.principal.hostname in %my_reference_list_name, 100, 0)

  • Vergleich der Aggregation:

    if(count($login.metadata.event_timestamp.seconds) > 5, 100, 0)

THEN_CLAUSE und ELSE_CLAUSE müssen denselben Datentyp haben. Wir unterstützen Ganzzahlen, Gleitkommazahlen und Strings.

Sie können die ELSE_CLAUSE weglassen, wenn der Datentyp „integer“ oder „float“ ist. Wird sie weggelassen, wird ELSE_CLAUSE als 0 ausgewertet. Beispiel:

`if($e.field = "a", 5)` is equivalent to `if($e.field = "a", 5, 0)`

Sie müssen ELSE_CLAUSE angeben, wenn der Datentyp „String“ ist oder wenn THEN_CLAUSE eine Platzhaltervariable oder Ergebnisvariable ist.

Mathematische Operationen

Sie können mathematische Operationen verwenden, um Daten vom Typ „Ganzzahl“ oder „Gleitkommazahl“ in den Abschnitten outcome und events einer Abfrage zu berechnen. Google Security Operations unterstützt Addition, Subtraktion, Multiplikation, Division und Modulo als Operatoren der obersten Ebene in einer Berechnung.

Das folgende Snippet ist ein Beispiel für eine Berechnung im Abschnitt outcome:

outcome:
  $risk_score = max(100 + if($severity = "HIGH", 10, 5) - if($severity = "LOW", 20, 0))

Mathematische Operationen sind für die folgenden Operandentypen zulässig, sofern jeder Operand und der gesamte arithmetische Ausdruck richtig aggregiert sind (siehe Aggregationen):

  • Numerische Ereignisfelder
  • Numerische Platzhaltervariablen, die im Abschnitt events definiert sind
  • Numerische Ergebnisvariablen, die im Abschnitt outcome definiert sind
  • Funktionen, die Ganzzahlen oder Gleitkommazahlen zurückgeben
  • Aggregationen, die Ganzzahlen oder Gleitkommazahlen zurückgeben

Der Modulo-Operator ist für Gleitkommazahlen nicht zulässig.

Platzhaltervariablen in Ergebnissen

Beim Berechnen von Ergebnisvariablen können Sie Platzhaltervariablen verwenden, die im Abschnitt „Ereignisse“ Ihrer Abfrage definiert wurden. In diesem Beispiel wird davon ausgegangen, dass $email_sent_bytes im Abschnitt „Ereignisse“ der Regel definiert wurde:

Beispiel: Einzelnes Ereignis ohne Match-Abschnitt

// No match section, so this is a single-event query.

outcome:
  // Use placeholder directly as an outcome value.
  $my_outcome = $email_sent_bytes

  // Use placeholder in a conditional.
  $other_outcome = if($file_size > 1024, "SEVERE", "MODERATE")

condition:
  $e

Beispiel: Multi-Event mit Match-Abschnitt

match:
  // This is a multi event query with a match section.
  $hostname over 5m

outcome:
  // Use placeholder directly in an aggregation function.
  $max_email_size = max($email_sent_bytes)

  // Use placeholder in a mathematical computation.
  $total_bytes_exfiltrated = sum(
    1024
    + $email_sent_bytes
    + $file_event.principal.file.size
  )

condition:
  $email_event and $file_event

Ergebnisvariablen in Ausdrücken für die Ergebniszuweisung

Mit Ergebnisvariablen lassen sich andere Ergebnisvariablen ableiten, ähnlich wie mit Platzhaltervariablen, die im Abschnitt events definiert sind. Sie können in der Zuweisung einer anderen Ergebnisvariablen mit einem $-Token gefolgt vom Variablennamen auf eine Ergebnisvariable verweisen. Ergebnisvariablen müssen definiert werden, bevor in der Abfrage darauf verwiesen werden kann. Wenn sie in einem Zuweisungsausdruck verwendet werden, dürfen Ergebnisvariablen nicht aggregiert werden (siehe Aggregationen).

Im folgenden Beispiel leitet die Ergebnisvariable $risk_score ihren Wert von der Ergebnisvariablen $event_count ab:

Beispiel: Ergebnisvariable, die aus einer anderen Ergebnisvariablen abgeleitet wird

match:
  // This is a multi event query with a match section.
  $hostname over 5m

outcome:
  // Aggregates all timestamp on login events in the 5 minute match window.
  $event_count = count($login.metadata.event_timestamp.seconds)

  // $event_count cannot be aggregated again.
  $risk_score = if($event_count > 5, "SEVERE", "MODERATE")

  // This is the equivalent of the 2 outcomes combined.
  $risk_score2 = if(count($login.metadata.event_timestamp.seconds) > 5, "SEVERE", "MODERATE")

condition:
  $e

Ergebnisvariablen können in jeder Art von Ausdruck auf der rechten Seite einer Ergebniszuweisung verwendet werden, mit Ausnahme der folgenden Ausdrücke:

  • Zusammenfassungen
  • Arrays.length()-Funktionsaufrufe
  • Mit den Modifikatoren any oder all

Zusammenfassungen

Wiederholte Ereignisfelder sind nicht skalare Werte. Das bedeutet, dass eine einzelne Variable auf mehrere Werte verweist. Die Ereignisfeldvariable $e.target.ip ist beispielsweise ein wiederkehrendes Feld und kann null, einen oder mehrere IP-Werte haben. Es handelt sich um einen nicht skalaren Wert. Die Ereignisfeldvariable $e.principal.hostname ist kein wiederholtes Feld und hat nur einen Wert (einen skalaren Wert).

Sowohl nicht wiederholte als auch wiederholte Ereignisfelder, die im outcome-Abschnitt einer Abfrage mit einem Abgleichszeitraum verwendet werden, sind nicht skalare Werte.

Beispiel: Ereignisse mit dem Abschnitt „match“ und einem nicht wiederholten Feld gruppieren

In der folgenden Abfrage werden Ereignisse mit einem `match`-Abschnitt gruppiert und im `outcome`-Abschnitt wird auf ein nicht wiederholtes Ereignisfeld verwiesen:

rule OutcomeAndMatchWindow{
  ...
  match:
    $userid over 5m
  outcome:
    $hostnames = array($e.principal.hostname)
  ...
}

Ein beliebiges 5‑Minuten-Zeitfenster, in dem die Abfrage ausgeführt wird, kann null, ein oder viele Ereignisse enthalten. Der Ergebnisbereich wird für alle Ereignisse in einem Match-Zeitraum berechnet. Jede Ereignisfeldvariable, auf die im Ergebnisabschnitt verwiesen wird, kann für jedes Ereignis im Abgleichszeitraum auf null, einen oder mehrere Werte des Felds verweisen. Wenn ein 5-Minuten-Zeitfenster beispielsweise 5 $e-Ereignisse enthält, verweist $e.principal.hostname im Ergebnisbereich auf fünf verschiedene Hostnamen. Die Variable für das Ereignisfeld $e.principal.hostname wird im Abschnitt outcome dieser Abfrage als nicht skalarer Wert behandelt.

Da Ergebnisvariablen immer einen einzelnen skalaren Wert ergeben müssen, muss jeder nicht skalare Wert, von dem eine Ergebniszuweisung abhängt, aggregiert werden, um einen einzelnen skalaren Wert zu erhalten. Im Ergebnisbereich sind die folgenden Werte nicht skalar und müssen aggregiert werden:

  • Ereignisfelder (wiederholt oder nicht wiederholt), wenn in der Abfrage ein match-Abschnitt verwendet wird
  • Platzhalter für Ereignisse (wiederholt oder nicht wiederholt), wenn in der Anfrage ein match-Abschnitt verwendet wird
  • Wiederholte Ereignisfelder, wenn in der Abfrage kein match-Abschnitt verwendet wird
  • Wiederholte Ereignis-Platzhalter, wenn in der Anfrage kein match-Abschnitt verwendet wird

Skalare Ereignisfelder, skalare Ereignisplatzhalter und Konstanten können in Abfragen, die keinen match-Abschnitt enthalten, in Summenfunktionen eingeschlossen werden. In den meisten Fällen geben diese Aggregationen jedoch den umschlossenen Wert zurück, sodass sie nicht erforderlich sind. Eine Ausnahme ist die Aggregation array(), mit der Sie einen skalaren Wert explizit in ein Array konvertieren können.

Ergebnisvariablen werden wie Aggregationen behandelt: Sie dürfen nicht neu aggregiert werden, wenn in einer anderen Ergebniszuweisung auf sie verwiesen wird.

Sie können die folgenden Aggregationsfunktionen verwenden:

Aggregatfunktion Beschreibung
max() Gibt das Maximum aller möglichen Werte aus. Funktioniert nur mit Ganzzahlen und Gleitkommazahlen.
min() Gibt das Minimum aller möglichen Werte aus. Funktioniert nur mit Ganzzahlen und Gleitkommazahlen.
sum() Gibt die Summe aller möglichen Werte aus. Funktioniert nur mit Ganzzahlen und Gleitkommazahlen.
count_distinct() Erfasst alle möglichen Werte und gibt dann die Anzahl der eindeutigen möglichen Werte aus.
count() Verhält sich wie „count_distinct()“, gibt aber eine nicht eindeutige Anzahl möglicher Werte zurück.
array_distinct() Erfasst alle möglichen eindeutigen Werte und gibt dann eine Liste dieser Werte aus. Die Liste der eindeutigen Werte wird auf 1.000 zufällige Elemente gekürzt. Zuerst wird die Deduplizierung angewendet, um eine Liste mit eindeutigen Werten zu erhalten, und dann die Kürzung.
array() Verhält sich wie „array_distinct()“, gibt aber eine nicht eindeutige Liste von Werten zurück. Außerdem wird die Liste der Werte auf 1.000 zufällige Elemente gekürzt.

Die Aggregatfunktion ist wichtig, wenn eine Regel einen condition-Abschnitt enthält, in dem angegeben wird, dass mehrere Ereignisse vorhanden sein müssen. Die Aggregatfunktion wird auf alle Ereignisse angewendet, die die Erkennung ausgelöst haben.

Beispiel: Bedingung für mehrere Ereignisse

Unten sehen Sie ein Beispiel für eine Bedingung für mehrere Ereignisse. Wenn Ihr Abschnitt zu Ergebnissen und Bedingungen Folgendes enthält:

outcome:
  $asset_id_count = count($event.principal.asset_id)
  $asset_id_distinct_count = count_distinct($event.principal.asset_id)

  $asset_id_list = array($event.principal.asset_id)
  $asset_id_distinct_list = array_distinct($event.principal.asset_id)

condition:
  #event > 1

Da im Abschnitt „condition“ mehr als ein „event“ für jede Erkennung vorhanden sein muss, werden die Aggregatfunktionen für mehrere Ereignisse ausgeführt. Angenommen, die folgenden Ereignisse haben eine Erkennung ausgelöst:

event:
  // UDM event 1
  asset_id="asset-a"

event:
  // UDM event 2
  asset_id="asset-b"

event:
  // UDM event 3
  asset_id="asset-b"

Die Werte Ihrer Ergebnisse sind dann:

    $asset_id_count = 3
    $asset_id_distinct_count = 2
    $asset_id_list = `["asset-a", "asset-b", "asset-b"]
    $asset_id_distinct_list = `["asset-a", "asset-b"]

Beschränkungen

  • Im Abschnitt outcome darf nicht auf eine neue Platzhaltervariable verwiesen werden, die nicht bereits im Abschnitt events oder im Abschnitt outcome definiert wurde.

  • Im Abschnitt outcome können keine Ereignisvariablen verwendet werden, die nicht im Abschnitt events definiert wurden.

  • Im Abschnitt outcome kann ein Ereignisfeld verwendet werden, das nicht im Abschnitt events verwendet wurde, sofern die Ereignisvariable, zu der das Ereignisfeld gehört, bereits im Abschnitt events definiert wurde.

  • Im Bereich outcome können nur Ereignisvariablen in Beziehung gesetzt werden, die bereits im Bereich events in Beziehung gesetzt wurden. Korrelationen treten auf, wenn zwei Ereignisfelder aus verschiedenen Ereignisvariablen gleichgesetzt werden.

Beispiele für den Abschnitt outcome finden Sie unter Übersicht über YARA-L 2.0.

Weitere Informationen zum Deduplizieren von Erkennungen mit dem Abschnitt outcome finden Sie unter Kontextsensitive Analysen erstellen.

Nächste Schritte

Weitere Informationen

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