Umstellung von SPL auf YARA-L 2.0

Unterstützt in:

Dieser Leitfaden richtet sich an Nutzer, die bereits mit der Splunk Search Processing Language (SPL) vertraut sind. Hier finden Sie eine kurze Einführung in YARA-L 2.0, die Kernsprache zum Erstellen von Suchvorgängen, Dashboards und Erkennungsregeln in Google Security Operations.

YARA-L 2.0-Struktur

YARA-L 2.0 ist die einheitliche Abfragesprache, die in Google SecOps verwendet wird, um leistungsstarke Bedrohungssuchen durchzuführen, Echtzeit-Dashboards zu erstellen und Erkennungsregeln mit hoher Genauigkeit für alle Ihre Unternehmenslogdaten zu erstellen, sobald sie aufgenommen werden.

Die Sprache funktioniert in Verbindung mit der Google SecOps Detection Engine und ermöglicht es Ihnen, in großen Datenmengen nach Bedrohungen und anderen Ereignissen zu suchen.

Grundlegende strukturelle Unterschiede zwischen SPL und YARA-L

In SPL werden eine Reihe von Befehlen verwendet, die mit Pipe-Zeichen (|) verkettet sind, während YARA-L abschnittsbasiert ist. Sie definieren eine Abfrage mit verschiedenen Abschnitten wie events, outcome und condition, um ein Muster zu beschreiben, nach dem Sie suchen, das Sie erkennen oder visualisieren möchten.

In der folgenden Tabelle wird die grundlegende Struktur zwischen SPL und YARA-L verglichen:

Funktion SPL (prozedural) YARA-L (deklarativ)
Kernkonzept Datenstream Schritt für Schritt mit einer Pipeline von Befehlen transformieren. Analysiert und wendet eine mehrteilige Struktur von Bedingungen und Transformationen auf einen Stream von Sicherheits- und Betriebsdaten an, um Bedrohungen zu erkennen und wertvolle Informationen zu extrahieren.
Datenfluss Prozedural. Die Ergebnisse eines Befehls werden als Eingabe für den nächsten Befehl verwendet. Deklarative Struktur zur optimalen Verarbeitung und Korrelation von Mustern in großem Umfang. Sie müssen sich keine Gedanken mehr über die Effizienz machen.
Ereigniskorrelation Die Funktion basiert auf expliziten Befehlen wie join, transaction und stats. Sie können mehrere Ereignisse definieren und sie anhand eines gemeinsamen Felds in der Logik der Abfrage korrelieren.
Zeitfensterung Wird als statisches Suchzeitfenster behandelt (z. B. last 60m). Jede neue Suche ist eine neue Anfrage. Wird als kontinuierliches, gleitendes Zeitfenster behandelt, das in der Abfrage definiert ist (z. B. over 5m).
Syntax Befehlsgesteuert (z. B. index=web). Prägnant und logikorientiert (z. B. metadata.event_type= "USER_LOGIN").

Spezifische Struktur von Anfragen

YARA-L erzwingt eine bestimmte Struktur für Abfragen, die sich von den sequenziellen, per Pipe verbundenen Befehlen von SPL unterscheidet. Während SPL Ergebnisse durch Verketten von Befehlen erstellt, werden in YARA-L verschiedene Aspekte der Abfrage in separaten Abschnitten definiert.

Befehl Aktion Erforderlich | Optional
meta Legt beschreibende Metadaten für die Regel fest, z. B. Autor, Beschreibung und Schweregrad. Nur für Regeln erforderlich.
events Definiert und filtert Ereignisse. Erforderlich (Kernlogik der Abfrage).
match Gruppiert nach Ereignissen und ermöglicht es Ihnen, den Zeitraum anzugeben (z. B. by 5m). Optional. Nur für Anfragen zur Korrelation mehrerer Ereignisse erforderlich.
outcome Wichtige Messwerte berechnen und Statistiken abrufen Optional.
condition Wertet die Kriterien der Abfragevariablen aus, um festzustellen, ob ein Ergebnis zutrifft (z. B. #event >5). Nur für Regeln erforderlich. Optional in der Suche und in Dashboards.
dedup Entfernt doppelte Ereignisse, indem sie anhand von Schlüsselvariablen (z. B. target.user.userid, target.ip>, principal.hostname) gruppiert werden. Optional.
order Sortiert die Ergebnisse der erfassten Ereignisse nach bestimmten Feldern (z. B. asc). Optional.
limit Beschränkt die maximale Anzahl der von der Abfrage zurückgegebenen Ereignisse. Optional.

Häufig verwendete Befehle in SPL und YARA-L

Dank der YARA-L-Abschnittsstruktur können Sie dieselben gängigen Befehle wie in SP verwenden. In diesem Abschnitt werden die Ähnlichkeiten und Unterschiede beschrieben.

SPL-Befehl search = YARA-L-Abschnitt events

Der Befehl search in SPL entspricht dem Abschnitt events in YARA-L. Im Abschnitt events werden die Ereignisse und die Art und Weise definiert, wie sie anfangs gefiltert werden. Andere Abschnitte wie match oder outcome sind optional, der Abschnitt events ist jedoch für jede Regel unerlässlich.

Beispiel:

metadata.event_type = "USER_LOGIN"

oder:

principal.hostname != "" AND metadata.event_type = "NETWORK_CONNECTION"

Im Abschnitt events von Regeln (und erweiterten Abfragen) verwenden Sie Ereignisvariablen, um die Logik zu vereinfachen.

Eine Ereignisvariable fungiert als logische Gruppierung von Filtern, die ein bestimmtes Ereignis oder eine Gruppe von Ereignissen darstellt, die bestimmten Kriterien entsprechen.

Wenn Sie beispielsweise eine Ereignisvariable wie $e definieren möchten, verwenden Sie sie als Präfix für alle zugehörigen Ereignisse und Filter im events-Abschnitt Ihrer Abfrage. Sie können diese Variable dann in anderen Abschnitten der Abfrage (z. B. match oder outcome) verwenden, um auf diese bestimmte Gruppe von Ereignissen und ihre Datenfelder zu verweisen.

Ereignisvariablen werden am häufigsten in Erkennungsregeln verwendet. Im folgenden Beispiel wird gezeigt, wie Sie die Ereignisvariable ($e) in einer Regel verwenden, um Ereignisse zu gruppieren und die Anzahl der fehlgeschlagenen Anmeldungen für einen Nutzer innerhalb eines Tages zu ermitteln. Die Regel wird dann ausgelöst, wenn ein definierter Schwellenwert überschritten wird.

Im Beispiel für die Regel wird jedes Ereignis mit der Ereignisvariablen ($e) definiert. Die Variable $e wird auch in metadata.id referenziert, um die Regelmetadaten mit den definierten Ereignissen zu verknüpfen.

rule DailyFailedLoginAttempts {
 meta:
   author = "Alex"
   description = "Detects a high number of failed login attempts for a single user within a day."

events:
   // Alias for each event
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $e.principal.user.userid != ""
   $userid = $e.principal.user.userid

match:
   // Group events by principal.user.userid within a 24-hour window
   $userid over 1d

outcome:
   // Count the number of unique event IDs for each user per day
   $daily_failed_login_count = count($e.metadata.id)

condition:
   // Trigger a detection if the daily failed login count exceeds a threshold
   // You should adjust this threshold based on your environment's baseline.
   #e > 0
}

Damit die Regel ausgelöst wird, müssen Sie häufig die Anzahl der gruppierten Ereignisse prüfen. Sie können im Abschnitt condition mit der Ereignisvariablen eine Mindestanzahl angeben. Mit der Bedingung (#e > 0) wird beispielsweise geprüft, ob mindestens ein Ereignis vorhanden ist, das den Kriterien entspricht.

SPL-Befehl eval = YARA-L-Abschnitt outcome

Der Befehl eval ist eine grundlegende SPL-Funktion, mit der Feldwerte in Suchergebnissen bearbeitet und definiert werden.

  • Zweck: Berechnet und definiert neue Feldwerte.
  • Funktionalität: Sie wertet mathematische, String- oder boolesche Ausdrücke aus.
  • Ergebnis: Das Ergebnis der Auswertung erstellt entweder ein neues Feld oder überschreibt den Wert eines vorhandenen Felds.
  • Verketten: Mehrere Ausdrücke können durch ein Komma verkettet werden (z. B. | eval A=1, B=A+1).
  • Sequenzielle Verarbeitung: Ausdrücke in einer Kette werden sequenziell verarbeitet. Bei späteren Berechnungen kann auf Felder verwiesen werden, die durch frühere Ausdrücke erstellt oder geändert wurden.

Die Beispiele in der folgenden Tabelle (und danach) veranschaulichen diese Befehlsstruktur:

Funktion Beschreibung YARA-L-Beispiel
Boolesche Operatoren Wird in events und condition verwendet. Weitere Informationen finden Sie unter OR in der Bedingung verwenden.

metadata.log_type != "" or
metadata.event_type = "NETWORK_DNS"
      
Berechnete Felder Wird im Abschnitt outcome verwendet.

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = cast.as_int(network.sent_bytes)
  
Dynamische Feldnamenerstellung Wird im Abschnitt outcome verwendet. Beispiele finden Sie unter SPL mit YARA-L vergleichen.

Beispiel: Neues Feld mit dem Ergebnis einer Berechnung erstellen

Erstellen Sie mit YARA-L in jedem Ereignis ein neues Feld, bytes. Berechnen Sie die Byte, indem Sie die Werte im Feld „Gesendet“ (bytes) mit den Werten im Feld „Empfangen“ (bytes) addieren.

 metadata.event_type = "SCAN_NETWORK"
 principal.hostname != ""
 $host = principal.hostname

match:
   $host

outcome:
   $bytes = cast.as_int(sum(network.sent_bytes))

Beispiel: Werte aus zwei Feldern verketten

Verwenden Sie den Punkt (.), um die Werte im Feld first_name mit den Werten im Feld last_name zu verketten. Verwenden Sie Anführungszeichen („“), um ein Leerzeichen zwischen den beiden Feldern einzufügen. Beim Verketten werden die Werte unabhängig vom tatsächlichen Wert als Strings gelesen.

In SPL sieht die Abfrage in etwa so aus:

| eval full_name = first_name+" "+last_name

In YARA-L würde die Suchanfrage so aussehen:

principal.user.first_name = $first_name
principal.user.last_name = $last_name

outcome:
  $full_name = strings.concat(principal.user.first_name = $first_name
  principal.user.last_name = $last_name

outcome:
   $full_name = strings.concat($first_name, " ", $last_name))

Im folgenden Beispiel wird die Abfrage für fehlgeschlagene Anmeldungen verwendet, um Nutzer zu finden, bei denen innerhalb von 10 Minuten (10m) fünf oder mehr fehlgeschlagene Anmeldungen aufgetreten sind (mit Ereignis- und Platzhaltervariablen):

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

match:
  $userid by 10m

outcome:
   $login_count= count(metadata.id)

condition:
   $login_count > 5

SPL-Befehl where = YARA-L-Abschnitt condition

Der SPL-Befehl where entspricht einer Kombination aus den Abschnitten events, outcome oder condition in YARA-L. Im Abschnitt events können Sie Ereignisse deklarieren und bestimmte Attribute dafür angeben, z. B. priniciapal.hostname = "xyz". Nachdem Sie Ihre Ereignisse deklariert haben, können Sie boolesche Operatoren, Vergleichsoperatoren und Ergebnisse von Aggregationsfunktionen (aus dem Abschnitt outcome) verwenden, um die Parameter zu definieren, die die Ereignisse erfüllen müssen, damit die Abfrage ein Ergebnis zurückgibt.

Im folgenden Beispiel wird gezeigt, wie eine Schwellenwertbedingung für eine aggregierte Anzahl festgelegt wird. Die Abfrage ist so strukturiert, dass die Gesamtzahl der fehlgeschlagenen Anmeldeereignisse pro Nutzer-ID gezählt wird. Im Abschnitt condition werden dann nur Ergebnisse für Nutzer ausgegeben, für die mindestens fünf fehlgeschlagene Anmeldungen erfasst wurden.

metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"

match:
  target.user.userid

outcome:
  // metadata.id counts all unique events associated with failed logins.
  $count = count(metadata.id)
  //metadata.id counts all unique events associated with blocked logins.

condition:
  $count > 5

SPL-Befehl dedup = YARA-L-Abschnitt dedup

Der SPL-Befehl dedup entspricht dem Abschnitt dedup in YARA-L. Verwenden Sie den Abschnitt dedup, um doppelte Ergebnisse zu deduplizieren, die durch ein Ereignis im Abschnitt events angegeben werden.

Beispiel:

principal.hostname = "foo"

dedup:
   target.ip

SPL-Befehl stats = YARA-L-Abschnitt match oder outcome (oder beides)

In SPL wird die Aggregation in der Regel durch die Befehlsfamilie stats verarbeitet. Damit wird der Aggregationstyp (z. B. count, distinct count, max, min) und das Feld "group by" angegeben.

In YARA-L bieten die Abschnitte match und outcome gemeinsam diese Möglichkeit:

  • Aggregationslogik: Im Abschnitt match werden Aggregationen erstellt, indem die Gruppe der zu berücksichtigenden Ereignisse (match: $grouping_field by time) definiert wird. Im Abschnitt outcome werden dann die spezifischen Aggregatfunktionen definiert, die für diese Gruppe berechnet werden sollen (z. B. count(), min(), max()).

  • Zeitfenster: Im Abschnitt match können Sie ein Zeitfenster angeben, um Ereignisse zu gruppieren. Verwenden Sie das Keyword over (für Regeln) oder by (für die Suche und Dashboards), z. B. match: $userid by 1h. Diese Funktion ähnelt SPL, z. B. "timechart", "streamstats" und "eventstats". Weitere Informationen finden Sie unter Zeitfensterung.

Beispiel: Summe der Byte berechnen, gruppiert nach Prinzipal-Hostname und Ziel-IP

Im folgenden Beispiel wird der Abschnitt match verwendet, um eine Aggregationsgruppe basierend auf dem Prinzipal-Hostname und der Ziel-IP-Adresse über einen Zeitraum von einem Tag zu definieren. Die resultierende Summe der gesendeten Byte wird dann im Abschnitt outcome berechnet.

metadata.event_type = "NETWORK_CONNECTION"
network.sent_bytes > 0
principal.hostname != ""
target.ip != ""

// Define placeholder variables for grouping
$principal_hostname = principal.hostname
$target_ip = target.ip

// Group events by principal hostname, target IP, and day
match:
  $principal_hostname, $target_ip by day

// Calculate the sum of sent bytes for each group
outcome:
  $daily_bytes_sent = sum(network.sent_bytes)

SPL YARA-L zuordnen

In SPL werden Daten schrittweise durch verkettete Befehle verarbeitet, während in YARA-L eine deklarative, abschnittsbasierte Struktur verwendet wird, um Muster und Aktionen zu definieren. Trotz dieser grundlegenden Unterschiede im Ansatz können Sie mit der Ausdrucksstärke von YARA-L viele der Aufgaben ausführen, die Sie von SPL gewohnt sind, von der einfachen Filterung bis hin zu komplexen Aggregationen und Korrelationen.

In diesem Abschnitt werden die Unterschiede erläutert, indem bekannte SPL-Funktionen ihren Entsprechungen im YARA-L-Framework zugeordnet werden.

SPL mit YARA-L vergleichen

In dieser Tabelle werden gängige Funktionen und Konzepte in der SPL-Sprache mit ihren Entsprechungen in YARA-L 2.0 verglichen. Außerdem wird beschrieben, wie das Konzept in einer YARA-L-Abfragestruktur behandelt wird.

SPL-Befehl oder -Konzept Zweck YARA-L-Entsprechung Beschreibung und YARA-L-Zuordnung Beispiel für die YARA-L-Implementierung
search Erste Datenfilterung events-Abschnitt Definieren Sie Ereignisfelder und ‑bedingungen. Für die Suche oder Dashboards ist kein events:-Präfix erforderlich. Beispiel ansehen

events:
  metadata.event_type = "USER_LOGIN"
  security_result.action = "FAIL"

        
where Ergebnisse weiter filtern Abschnitte events und condition Boolesche Logik anwenden, häufig auf aggregierte Ergebnisse. Beispiel ansehen

events:
  metadata.event_type = "USER_LOGIN"
  security_result.action = "FAIL"

outcome:
  $failed_count = count(metadata.id)

condition:
  $failed_count > 5
        
eval Berechnet neue Werte aus vorhandenen Feldern, Aggregationen und Daten-Lookups Abschnitt „outcome“ oder „ events Beispiel für SPL eval

metadata.event_type = "USER_LOGIN"

outcome:
  $login_count = count(metadata.id)
        
stats Zusammenfassungen (count, sum, avg) match oder outcome Nach Feldern in match gruppieren. Berechne Aggregate in outcome. Beispiele finden Sie unter Aggregationen und statistische Abfragen und SPL-Befehl stats.

metadata.event_type = "USER_LOGIN"

outcome:
  $login_count = count(metadata.id)
        
dedup Entfernt doppelte Ereignisse basierend auf einem oder mehreren Feldern dedup-Abschnitt Geben Sie die Felder an, anhand derer die Deduplizierung erfolgen soll.

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

dedup:
  $user
        
table Definiert die Ausgabe der Tabellenspalte select oder unselect Wird in Dashboards verwendet. Zeigt in der Suche outcome-Variablen an.

metadata.event_type = "USER_LOGIN"

select:
  principal.hostname
        
sort Listet Ergebnisse in aufsteigender oder absteigender Reihenfolge auf. order-Abschnitt Ein Beispiel finden Sie in der nächsten Tabellenzelle.
metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""

outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = uint64(network.sent_bytes)

order:
  $bytes desc
limit Beschränkt die Anzahl der zurückgegebenen Ergebnisse limit-Abschnitt Ein Beispiel finden Sie in der nächsten Zelle.

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""

outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = cast.as_int(network.sent_bytes)

order:
  $bytes desc

limit:
  3
  
Funktionen mit mehreren Werten Mit mv*-Funktionen verarbeitet (mvexpand, mvfilter) Integrierter Support In YARA-L werden Arrays im Abschnitt „Ereignisse“ automatisch entnestet.
Arrayfunktionen sind bei Bedarf in outcome verfügbar.
Beispiele für Funktionen mit mehreren Werten
Zeitfensterung earliest=-5m, latest=now Abschnitt „match“, over, by Verwenden Sie für kontinuierliche Erkennungen match: $field over 5m or by 5m. Verwenden Sie für Dashboards in der Such-UI match: $field by 5m. Beispiele finden Sie unter Zeitfensterung.

Aggregations- und statistische Abfragen

In YARA-L werden Aggregations- und statistische Funktionen in der Regel im Abschnitt outcome platziert und die Aggregation basiert auf dem Abschnitt match.

Der Befehl stats ist der primäre Mechanismus zum Implementieren der Datenaggregation in YARA-L-Abfragen. Sie wandelt Rohdaten zu Ereignissen in zusammengefasste Sicherheitsmesswerte um. Während mit dem Befehl eval Transformationen auf Feldebene und zeilenweise (ähnlich einem SELECT-Ausdruck) ausgeführt werden, führt stats Aggregationen auf Set-Ebene (ähnlich GROUP BY in SQL) durch.

Die folgende Tabelle enthält die grundlegende Syntax und Verwendung und zeigt, wie Sie Statistiken effektiv nutzen können, um eine ausgefeilte Sicherheitslogik basierend auf Datenmustern und statistischen Ausreißern zu implementieren.

SPL-Funktion Beschreibung YARA-L-Entsprechung Beispiel für die YARA-L-Implementierung
count Zählt die Anzahl der Ereignisse. count()

metadata.event_type= "USER_LOGIN"
security_result.action= "FAIL"

outcome:
  $event_count = count(metadata.id)

condition:
  $event_count > 2
  
dc (count_distinct) Zählt die Anzahl der eindeutigen Werte für ein Feld. count_distinct()

metadata.event_type = "USER_LOGIN"

outcome:
  $unique_users=count_distinct(principal.user.userid)
  
sum Berechnet die Summe der Werte für ein Feld.
sum()

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host

outcome:
  $bytes = sum(network.sent_bytes)
  
avg Berechnet den Durchschnittswert für ein Feld.
avg()

$host = principal.hostname

match:
  $host by day

outcome:
  $avg_bytes_sent = avg(network.sent_bytes)
  
min/max Ermittelt den Mindest- oder Höchstwert für ein Feld. min() oder max()

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host

outcome:
  $bytes = max(network.sent_bytes)- min(network.sent_bytes)
  
median() Ermittelt den Medianwert. window.median

target.file.mime_type = "PDF"

outcome:
  $median_file_size = window.median(target.file.size, false)
  
first() and last() Gibt Werte basierend auf der Reihenfolge der Ereignisse in den Suchergebnissen zurück. window.first/window.last

metadata.event_type = "NETWORK_CONNECTION"
principal.ip != ""

match:
  principal.ip

outcome:
  $event_count = count(metadata.id)
  $first_seen = window.first(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  $last_seen = window.last(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  
STDDEV() Berechnet die Standardabweichung, die die Streuung eines Datensatzes misst. window.stddv

principal.hostname= $host

match:
  $host over 5m

outcome:
  $stddev = window.stddev(network.sent_bytes)

Weitere Informationen finden Sie unter Zusätzliche Funktionen.

Mit einer mehrstufigen Abfrage können beispielsweise mehrere fehlgeschlagene Anmeldungen über geschichtete Aggregationen hinweg nachverfolgt werden. Weitere Informationen finden Sie im Beispiel für mehrstufige Zusammenfassung und unter Mehrstufige Abfragen in YARA-L erstellen.

Mehrstufige Aggregation (Stunden- bis Wochenmittelwert)

In diesem mehrstufigen Beispiel werden die Daten zuerst aggregiert, um die pro Host und Stunde übertragenen Byte zu ermitteln. Anschließend wird diese Aggregation verwendet, um den Gesamtdurchschnitt für die letzten sieben Tage über diese stündlichen Gruppen hinweg zu berechnen.

stage bytes_per_host {
metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host by hour

outcome:
  $bytes = cast.as_int(sum(network.sent_bytes))
}

$host = $bytes_per_host.host

match:
  $host

outcome:
  $hour_buckets = array_distinct(timestamp.get_timestamp($bytes_per_host.window_start))
  $num_hour_buckets = count_distinct($bytes_per_host.window_start)
  $avg_hourly_bytes = avg($bytes_per_host.bytes)

Funktionen mit mehreren Werten (Array lesen)

Die Syntax von YARA-L ist so konzipiert, dass ein Feld mehrere Werte haben kann. Wenn Sie eine Abfrage schreiben, die ein Ereignis mit einem mehrwertigen Feld im Abschnitt events enthält, wird automatisch jeder Wert im Array geprüft. Sie müssen keine spezielle Funktion verwenden, um das Array zu filtern. Geben Sie einfach die Bedingung an, die erfüllt werden soll. Wenn das Feld principal.ip des Logereignisses beispielsweise Folgendes enthält, prüft die YARA-L-Engine automatisch jeden Wert im Array principal.ip. Wenn einer der Werte "10.1.1.5" ist, ist die Bedingung erfüllt.

["10.1.1.5", "10.2.2.6", "10.3.3.7"]

In der folgenden Tabelle wird verglichen, wie mehrwertige Felder in Protokolldaten mit YARA-L und SPL verwaltet werden. Felder mit mehreren Werten, z. B. ein Array von IP-Adressen oder eine Liste von Nutzergruppen, sind ein häufiges Merkmal strukturierter Logs.

SPL-Funktion Purpose YARA-L-Entsprechung Beispiel für die YARA-L-Implementierung
mvfilter() Filtert ein Feld mit mehreren Werten, sodass nur übereinstimmende Werte beibehalten werden. Wenn Sie in der YARA-L-Abfrage im Abschnitt events verwendet wird, listen Sie das Feld auf, das abgeglichen werden soll. YARA-L prüft automatisch, ob ein Wert im Gruppenarray mit „`admin`“ übereinstimmt.

principal.user.group_identifiers = "admin"
        
mvcount() Zählt die Anzahl der Werte in einem Feld mit mehreren Werten. count() auf ein Feld im Abfrageabschnitt outcome angewendet. Sie müssen keine Werte entnesten. Beispiel: Anzahl der Nutzer in der Gruppe „IT-Mitarbeiter“ zählen
mvexpand Erstellt für jeden Wert in einem Feld mit mehreren Werten ein neues Ereignis. Mehrwertige Felder werden nativ und implizit verarbeitet. Das Aufheben der Verschachtelung erfolgt automatisch. Beispiel: Anzahl der Nutzer in der Gruppe „IT-Mitarbeiter“ zählen
mvjoin Führt alle Werte aus einem Feld mit mehreren Werten zu einem einzelnen String zusammen, um die Daten zu formatieren. Die Werte werden automatisch als Array in den Ergebnissen gespeichert. Die Ausgabe von YARA-L ist strukturiert und kein einfacher String. Das Feld wird als Array angezeigt, wenn eine weitere Bearbeitung des Arrays erforderlich ist. Weitere Informationen finden Sie unter Array-Funktionen.

Beispiel: Anzahl der admin-Anmeldungen zählen

Im folgenden Beispiel filtert die Bedingung $metadata.event_type = "USER_LOGIN" nach Ereignissen, bei denen „event_type“ gleich "USER_LOGIN" ist:

events:
 metadata.event_type = "USER_LOGIN" // Changed to a more appropriate event type for login
 principal.user.group_identifiers = "admin"

outcome:
 // This counts each unique event ID where the principal user is in the `"admin"` group.
 $admin_login_count = count(metadata.id)

Das Feld $principal.user.group_identifiers= "admin" ist ein wiederholtes Feld (ein Array).

  • Implizites Aufheben der Verschachtelung: YARA-L hebt die Verschachtelung dieses Felds intern automatisch bei der Abfrageauswertung auf.
  • Bedingungsprüfung: Ein Ereignis erfüllt die Bedingung, wenn einer der Werte im Array $principal.user.group_identifiers gleich "admin" ist.
  • Kein expliziter Befehl erforderlich: Im Gegensatz zu SPL benötigen Sie keinen bestimmten Befehl zum Aufheben der Verschachtelung wie mvexpand.

Der Abschnitt „Auswirkung auf die Aggregation“ (outcome) bedeutet, dass das implizite Aufheben der Verschachtelung im Abschnitt outcome entscheidend ist (z. B. outcome: $admin_login_count = count(metadata.id))). Beachten Sie die folgenden Auswirkungen:

  • Ein einzelnes UDM-Ereignis, das mehrere übereinstimmende Werte in einem wiederkehrenden Feld enthält, kann für die Abfrageauswertung mehrere interne Zeilen generieren.
  • Da im Abschnitt events die Ereignisse bereits effektiv entnestet wurden, basierend auf jedem übereinstimmenden Wert in $principal.user.group_identifiers, wird mit der Aggregation count(metadata.id) jede dieser entnesteten Instanzen gezählt.

Beispiel: Anzahl der Nutzer in der Gruppe „IT-Mitarbeiter“ zählen

SPL:

index=<your_index_name> user_id="jsmith" 
| where match(memberOf, "Domain Admins|IT Staff|HR") 
| mvexpand memberOf 
| stats count by memberOf 
| mvexpand actions 
| table memberOf, count, actions

YARA-L (Suche):

 principal.user.userid = "jsmith"
 additional.fields["memberOf"] = $group
   $group = /Domain Admins|IT Staff|HR/ nocase
 
 match:
   $group by 1h
 
 outcome:
   $group_count = count_distinct(metadata.id)
   $memberOf = array_distinct($group)
   $risk_score = max(50)

Beispiel: Regel erstellen, um eine Benachrichtigung zu erhalten, wenn ein bestimmter Dateihash vorhanden ist

SPL:

| eval file_hashes="hash12345,hash67890,hashABCDE" 
| makemv delim="," file_hashes 
| mvexpand file_hashes 
| search file_hashes="hash67890" 
| table _time, file_hashes

YARA-L (Regel):

    rule specific_file_hash_detected {
    
    meta:
      rule_name = "Specific File Hash Detected"
      description = "Detects events where a specific file hash is present."
      severity = "Medium"
    
    events:
      $e.target.file.sha256 == "hash67890"
    
    outcome:
      $time = array_distinct($e.metadata.event_timestamp)
      $file_hashes = array_distinct($e.target.file.sha256)
    
    condition:
      $e
    }

Zeitfensterung

In YARA-L ist Zeitfensterung eine Methode zum Korrelieren von Ereignissen über einen bestimmten, fortlaufenden Zeitraum. Wenn es in Regeln verwendet wird, verschiebt sich dieses Fenster kontinuierlich mit eingehenden Daten. So können Muster, die sich im Laufe der Zeit entwickeln, kontinuierlich in Echtzeit erkannt werden.

Dieser Prozess ist ein wichtiger Bestandteil des Designs für die automatische Erkennung und einer der Vorteile der Verwendung von YARA-L. Wenn Sie das Zeitfenster angeben, werden Ihre Erkennungen und Dashboards kontinuierlich mit Echtzeitdaten aktualisiert.

Feature SPL YARA-L
Hauptziel Statische Suche, Ad-hoc-Analyse Kontinuierliche Erkennung, automatisierte Korrelation
Primäre Funktionen earliest, latest, span, transaction over, by
5-Minuten-Beispiel earliest=-5m (statische Suche)
oder
transaction maxspan=5m
match:
[event] over 5m (kontinuierliche Erkennung in Regeln)
oder
[event] by 5m (Suche und Dashboards)

Die Beispiele in diesem Abschnitt veranschaulichen den Unterschied zwischen einem gleitenden Zeitfenster (mit by) und einem gleitenden Zeitfenster (mit over) in YARA-L.

Rollierendes Zeitfenster (by <time_unit>)

  • Konzept: Bei der YARA-L-Suche werden mit rollierenden Fenstern feste, nicht überlappende Zeitintervalle mit fester Größe erstellt. Das System verarbeitet jedes Ereignis, indem es anhand des Zeitstempels genau einem bestimmten Zeitintervall zugewiesen wird. Diese festen Intervalle sind absolut und richten sich streng nach Standardzeitmarkierungen wie Tagen, Stunden oder Minuten.

  • Verwendung: Wird häufig in Google SecOps-Suchanfragen und ‑Dashboards verwendet, um Daten in diskrete Zeitsegmente zu aggregieren.

Beispiel: Tägliche Anzahl erfolgreicher Anmeldungen pro Nutzer

Mit dieser Suchanfrage werden erfolgreiche Anmeldeereignisse nach eindeutigen Nutzern innerhalb jedes Kalendertags gruppiert. Im folgenden Beispiel sehen Sie ein YARA-L-Suchfenster mit Text (by day):

events:
  //Filter for successful login events
  metadata.event_type = "USER_LOGIN"
  principal.user.userid != ""

match:
  //Group by each unique user ID, aggregated over a calendar day.
  principal.user.userid by day

outcome:
  //Count how many successful logins occurred for this user on this specific day.
  $daily_success_count = count(metadata.id)
  
  //Get the timestamp of the FIRST event within this daily group.
  $first_event_time = window.first(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  
  //Get the timestamp of the LAST event within this daily group.
  $last_event_time = window.last(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))

Funktionsweise: Wenn Nutzer jdoe 10 erfolgreiche Anmeldungen auf Nov 17 und 15 auf Nov 18 hat, werden in dieser Abfrage zwei separate Zeilen für jdoe generiert, eine für jeden Tag, mit den entsprechenden Zählungen. Der Bucket Nov 17 enthält Ereignisse aus 2025-11-17 00:00:00 to 23:59:59 UTC.

Fließendes Zeitfenster (over <duration>)

  • Konzept: Gleitende Fenster werden in YARA-L-Regeln verwendet und sind bewegliche, möglicherweise sich überschneidende Zeitfenster mit einer bestimmten Dauer. Sie eignen sich ideal, um Ereignisse zu korrelieren, die in einer bestimmten Nähe zueinander stattfinden.

  • Verwendung: Wird hauptsächlich in YARA-L-Regeln verwendet, um Muster oder Abfolgen von Ereignissen innerhalb eines fortlaufenden Zeitrahmens zu erkennen.

Beispiel: Mehrere fehlgeschlagene Anmeldungen innerhalb von 5 Minuten erkennen

In diesem YARA-L-Regelbeispiel wird eine Erkennung generiert, wenn ein einzelner Nutzer innerhalb eines beliebigen gleitenden Zeitraums von 5-minute mehr als 5 failed logins Versuche unternimmt:

rule TooManyFailedLogins_SlidingWindow {
 meta:
   author = "Alex"
   description = "Detects when a user has more than 5 failed logins within a 5-minute sliding window."
   severity = "Medium"

events:
   // Define an event variable $e for failed login attempts
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $e.principal.user.userid != ""
   $userid = $e.principal.user.userid

match:
   // Group events by userid over a continuous 5-minute sliding window.
   // Any events for the same $userid within 5 minutes of each other are grouped.
   $userid over 5m

outcome:
   // Count the number of failed login events within each 5-minute window for the grouped userid.
   $failed_count = count($e.metadata.id)

condition:
   // Trigger a detection if the count of failed logins in ANY 5-minute window is greater than 5.
   #e > 5
}

Funktionsweise: Das System überwacht kontinuierlich fehlgeschlagene Anmeldeversuche. Dabei werden jeweils die Ereignisse der letzten 5 Minuten für jeden Nutzer berücksichtigt. Wenn Nutzer jdoe beispielsweise zwischen 10:02:30 und 10:07:30 sechs fehlgeschlagene Anmeldeversuche hat, wird eine Erkennung ausgelöst. Dieses Fenster wird ständig nach vorn verschoben, sodass Muster unabhängig von Kalendergrenzen in Echtzeit erkannt werden können.

Nächste Schritte

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