Syntax des Abschnitts zum Abgleich
In YARA-L 2.0 bietet der Abschnitt match den Mechanismus für die Korrelation mehrerer Ereignisse. Sie definiert die Logik für die Gruppierung von Ereignissen in einem einzelnen Fund, indem gemeinsame Attribute wie Nutzer, IP-Adressen oder Dateihashes innerhalb einer bestimmten zeitlichen Begrenzung verknüpft werden.
Sie verwenden den Abschnitt match für die folgenden Anwendungsfälle:
- Verknüpfen Sie zwei oder mehr unterschiedliche Ereignisse in einer Regel.
- Aggregieren von Daten in der Suche und in Dashboards, z. B. Zählen fehlgeschlagener Anmeldeversuche über einen bestimmten Zeitraum hinweg.
Korrelationskriterien definieren
Damit können Sie die Kriterien für diese Korrelation festlegen, indem Sie Folgendes angeben:
Gruppierungsfelder (Schlüssel): Variablen (z. B.
$useroder$ip), die für alle Ereignisse (definiert im Abschnittevents) identische Werte haben müssen, damit eine Übereinstimmung ausgelöst wird.Zeitbeschränkung: Der Zeitraum, in dem gruppierte Ereignisse auftreten müssen, damit die Regel oder Aggregation erfüllt wird. In Regeln wird damit das Erkennungsfenster definiert, in Suche und Dashboards das Aggregations- oder Korrelationsfenster.
Funktionsanforderungen vergleichen
In der folgenden Tabelle finden Sie einen detaillierten Vergleich von Regeln für die Suche und Dashboards.
| Funktion | Regelanforderung | Unterstützung für Suche und Dashboards |
|---|---|---|
| Variablentypen | Es müssen Platzhalter verwendet werden, die im Abschnitt events definiert sind. |
Unterstützt sowohl Platzhalter als auch direkte UDM-Felder. |
| Zeitfenster | Definiert die Erkennungsgrenze. | Definiert den Bucket für die Aggregation oder Korrelation. |
| Syntax | over <number><m/h/d> (z. B. 10m, 2h, 1d) |
over <number><m/h/d> |
| Limits | Min.: 1m / Max.: 48h |
Min.: 1m / Max.: 48h |
Unterstützte Fenstertypen
In YARA-L 2.0 werden verschiedene Windowing-Verhaltensweisen verwendet, um zu bestimmen, wie die Zeit unterteilt und wie Ereignisse gruppiert werden. Sie können Ereignisfelder und Platzhalter im Abschnitt match nach einer angegebenen Zeitgranularität gruppieren. Dazu verwenden Sie eines der folgenden unterstützten Zeitfenster.
| Unterstützter Fenstertyp | Syntax | Beschreibung | Gängige Anwendungsfälle |
|---|---|---|---|
| Hop | $key over <duration> |
Sich überschneidende Zeiträume (Standardverhalten). | Allgemeine Korrelation mehrerer Ereignisse. |
| Tumbling | $key by <duration> tumbling |
Nicht überlappende, kontinuierliche Zeitintervalle mit fester Größe. | Aktivitäten in Blöcken von bis zu einer Stunde quantifizieren (z. B. $user by 30m). |
| Gleiten | $key over <duration> [before|after] $pivot |
Zeitintervalle, die an einem bestimmten „Pivot“-Ereignis verankert sind. | Strikte Sequenzierung (z. B. File Download after Login). |
Beispielsyntax:
match:
$user, $source_ip over 5m // Groups events by user and IP within a 5-minute window
Hop-Fenster
Ein Hop-Fenster ist das Standardverhalten für Regeln mit mehreren Ereignissen. Es werden sich überschneidende Zeitintervalle erstellt, damit Ereignisse, die in der Nähe der Grenzen eines Zeitraums stattfinden, nicht übersehen werden.
- Syntax:
$key over <duration>(z. B.$user over 30m) - Anwendungsfall: Am besten geeignet für die Erkennung, bei der ein bestimmtes Szenario unabhängig davon erfasst werden muss, wann genau das Zeitfenster beginnt oder endet.
- Unterstützung: Wird für die Aggregation in der Suche und in Dashboards unterstützt (z. B.
count).
Standardmäßig werden in YARA-L-Abfragen mit einem match-Abschnitt Hop-Fenster verwendet, um mehrere Ereignisse im Zeitverlauf zu korrelieren. Der Zeitraum der Abfrageausführung wird in eine Reihe fester, sich überschneidender Hop-Fenster unterteilt. Die Dauer dieser Zeiträume wird im Abschnitt match angegeben. Das Überschneidungsintervall und die Ausrichtung der Zeiträume werden jedoch vom System definiert und können nicht vom Nutzer konfiguriert werden. Ereignisse werden dann innerhalb der einzelnen vordefinierten Zeiträume in Beziehung gesetzt.
Beispiel: Überlappende Hop-Windows für kontinuierliche Korrelation
Im folgenden Beispiel wird eine Abfrage für den Zeitraum [1:00, 2:00] mit dem match-Abschnitt $user over 30m ausgeführt. Eine mögliche Gruppe von sich überschneidenden Hop-Fenstern, die generiert werden könnten, ist [1:00, 1:30], [1:03, 1:33] und [1:06, 1:36].
rule hop_window_brute_force_example {
meta:
description = "Detects multiple failed logins within a shifting 30-minute window."
severity = "Medium"
events:
$login.metadata.event_type = "USER_LOGIN"
$login.extensions.auth.auth_status = "FAILURE"
$login.principal.user.userid = $user
match:
// This creates the overlapping windows (e.g., 1:00-1:30, 1:03-1:33)
$user over 30m
condition:
// This will trigger if 10 or more failures fall into any single 30m hop
#login >= 10
}
Beispiel: Korrelation mehrerer Ereignisse mit einem Hop-Fenster
Das folgende Beispiel stellt die Standardeinstellung für die meisten Regeln mit mehreren Ereignissen dar. Damit werden Ereignisse erfasst, die im selben allgemeinen Zeitraum auftreten.
rule hop_window_example {
meta:
description = "Detect a user with a failed login followed by a success within 30m"
events:
$e1.metadata.event_type = "USER_LOGIN"
$e1.extensions.auth.auth_status = "FAILURE"
$e1.principal.user.userid = $user
$e2.metadata.event_type = "USER_LOGIN"
$e2.extensions.auth.auth_status = "SUCCESS"
$e2.principal.user.userid = $user
match:
$user over 30m // This is a hop window
condition:
$e1 and $e2
}
Beispiel: Vergleich von Hop-Windows
Um einen Brute-Force-Angriff zu erkennen, werden alle USER_LOGIN-Fehler in einem 10m-Zeitfenster gruppiert. Anschließend wird mit condition geprüft, ob die Anzahl (#e) innerhalb dieses 10‑Minuten-Buckets Ihren Grenzwert überschreitet.
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
condition:
#e >= 5
}
Im Abschnitt match werden Nutzer mit einem fehlgeschlagenen Log-in an einem neuen Standort innerhalb eines 10‑Minuten-Intervalls (10m) ermittelt:
match:
$user over 10m
Rollierendes Fenster
Bei einem rollierenden Fenster wird ein Datenstrom in nicht überlappende, kontinuierliche Zeitintervalle fester Größe segmentiert. Jedes Datenereignis wird nur einem Fenster zugewiesen. Im Gegensatz dazu können sich Zeitintervalle bei einem gleitenden oder springenden Fenster überlappen.
- Syntax: Verwenden Sie den Operator
by($key by <duration>), z. B.$user by 30m. - Anwendungsfall: Am besten geeignet für Berichte und Dashboards, in denen Sie Ereignisse in separaten Blöcken zählen möchten (z. B.
"How many alerts per hour?"). - Suche und Dashboards: Werden häufig verwendet, um übersichtliche Balkendiagramme zu erstellen, ohne Ereignisse zu deduplizieren.
Beispiel: Zählen mit festen Intervallen und gleitenden Fenstern
Das folgende Beispiel zeigt ein 30‑minütiges gleitendes Fenster, in dem Ereignisse, die zwischen 1:00:00 und 1:29:59 Uhr auftreten, gemeinsam verarbeitet werden. Anschließend wird die nächste Gruppe von Ereignissen (von 1:30:00 bis 1:59:59) separat verarbeitet.
rule tumbling_window_threshold_example {
meta:
description = "Detect more than 50 failed logins from a single IP within a fixed 1-hour block."
severity = "Medium"
events:
$login.metadata.event_type = "USER_LOGIN"
$login.extensions.auth.auth_status = "FAILURE"
$login.principal.ip = $ip
match:
// This creates distinct, 1-hour blocks (e.g., 1:00-1:59, 2:00-2:59)
$ip by 1h
condition:
#login > 50
}
Schiebefenster
Verwenden Sie ein gleitendes Fenster, wenn Sie nach Ereignissen suchen müssen, die in einer strengen, relativen Reihenfolge auftreten (z. B. e1 tritt bis zu zwei Minuten nach e2 auf). Im Gegensatz zu festen Fenstern wird ein gleitendes Fenster durch jedes Vorkommen des angegebenen $pivot_event ausgelöst. Verwenden Sie dazu die folgende Syntax:
after: Das Fenster beginnt mit dem Zeitstempel des Pivot-Ereignisses und wird nach vorn erweitert.before: Das Fenster endet am Zeitstempel des Pivot-Ereignisses und wird rückwärts erweitert.
Geben Sie gleitende Fenster im match-Abschnitt einer Abfrage so an:
<match-var-1>, <match-var-2>, ... over <duration> [before|after] <pivot-event-var>
- Syntax:
$key over <duration> before|after $<pivot_event> - Gruppierungsschlüssel: Gemeinsame Felder (z. B.
$user,$ip), die zum Verknüpfen von Ereignissen verwendet werden. - Zeitraum: Zeitlicher Versatz vom Pivot-Ereignis (z. B.
5m,1h). - Anwendungsfälle:
- Strikte Sequenzierung: Erkennen einer Angriffskette, bei der eine bestimmte Reihenfolge erforderlich ist (z. B. Erstellung eines Nutzers gefolgt von einer Rechteausweitung).
- Relativer Zeitpunkt: Suchen Sie nach einem Ereignis, das innerhalb eines bestimmten Offsets eines „Triggers“ auftritt, z. B. ein
Process Start-Ereignis, gefolgt von einemNetwork Connection-Ereignis innerhalb von 30 Sekunden. - Erkennung von Abwesenheit: Ermitteln, wann ein erforderliches „Cleanup“- oder „Heartbeat“-Ereignis nach einem Start-Ereignis nicht eintritt, z. B. ein
Database Backup Startohne entsprechendesEnd-Ereignis.
Gültige Beispiele für gleitende Fenster
Die folgenden Beispiele zeigen gültige gleitende Fenster:
$var1, $var2 over 5m after $e1
$user over 1h before $e2
$host, $ip over 1h before $e2
Beispiel: Zukunftsgerichtete Korrelation mit gleitenden Fenstern (after)
Im folgenden Beispiel wird gezeigt, wie Sie eine Ereignissequenz erkennen, bei der das zweite Ereignis innerhalb eines bestimmten Zeitraums nach einem primären „Trigger“- oder Pivot-Ereignis eintreten muss. Dies ist nützlich, um schnelle laterale Bewegungen oder automatisierte Folgeaktionen zu erkennen.
rule sliding_window_after_example {
meta:
description = "Detect a network connection occurring within 1 minute after a suspicious process launch."
severity = "High"
events:
$proc.metadata.event_type = "PROCESS_LAUNCH"
$proc.principal.hostname = $host
$net.metadata.event_type = "NETWORK_HTTP"
$net.principal.hostname = $host
match:
// $proc is the pivot; the 1-minute window starts at the $proc timestamp
$host over 1m after $proc
condition:
$proc and $net
}
Beispiel: Rückblickende Korrelation mit gleitenden Fenstern (before)
Mit einem "before"-Gleitfenster können Sie die Aktivitäten untersuchen, die zu einer bestimmten Benachrichtigung geführt haben. Dies wird häufig bei der Ursachenanalyse verwendet, um zu ermitteln, was unmittelbar vor einer kritischen Erkennung passiert ist.
rule sliding_window_before_example {
meta:
description = "Identify file modifications occurring in the 5 minutes before a ransomware alert."
severity = "Critical"
events:
$file.metadata.event_type = "FILE_MODIFICATION"
$file.principal.hostname = $host
$alert.metadata.event_type = "ANTIVIRUS_DETECTION"
$alert.metadata.product_name = "Premium_AV"
$alert.principal.hostname = $host
match:
// $alert is the pivot; the 5-minute window ends at the $alert timestamp
$host over 5m before $alert
condition:
$file and $alert
}
Leistung und Best Practices
Für gleitende Fenster ist mehr Rechenleistung erforderlich als für Standardfenster (mit Sprung), da sie für jedes Auftreten des Pivot-Ereignisses berechnet werden. Dies kann zu einer langsameren Leistung führen.
Beachten Sie die folgenden Richtlinien, um eine optimale Leistung bei Regeln, Suchvorgängen und Dashboards zu erzielen:
Hop-Windows priorisieren: Verwenden Sie das Standard-Hop-Window, es sei denn, die spezifische Reihenfolge von Ereignissen (Bestellung A, dann Bestellung B) ist für die Erkennungslogik erforderlich. Verwenden Sie gleitende Fenster nur, wenn die Reihenfolge der Ereignisse wichtig ist oder wenn Sie nach fehlenden Ereignissen suchen.
Zeitstempelfilter für die Leistung verwenden: Wenn Sie nur prüfen müssen, ob ein Ereignis nach einem anderen stattgefunden hat, ist ein Zeitstempelvergleich im
events- odercondition-Abschnitt oft effizienter als ein gleitendes Fenster, z. B.:
$e1.metadata.event_timestamp.seconds <
$e2.metadata.event_timestamp.seconds
Design mit mehreren Ereignissen: Vermeiden Sie die Verwendung von gleitenden Fenstern für Abfragen mit einem einzelnen Ereignis. Gleitende Fenster sind für die Korrelation mehrerer Ereignisse konzipiert. Für die Logik für einzelne Ereignisse gelten die folgenden Richtlinien:
- Verwenden Sie mehrere Ereignisvariablen und aktualisieren Sie den Bereich
condition. - Entfernen Sie den Abschnitt
matchvollständig, wenn keine Korrelation erforderlich ist. - Optional können Sie Zeitstempelfilter anstelle eines gleitenden Fensters verwenden, z. B.
$permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds.
- Verwenden Sie mehrere Ereignisvariablen und aktualisieren Sie den Bereich
Zeitliche Grenze
Im Bereich match werden Ereignisse anhand Ihrer Gruppierungsschlüssel in Gruppen unterteilt. Die angegebene Dauer definiert die zeitliche Grenze für jede Gruppe:
- Einbeziehung: Nur Ereignisse innerhalb des Zeitfensters werden für die entsprechende Übereinstimmung an die
condition-Auswertung übergeben. - Ausschluss: Ereignisse außerhalb des Zeitraums werden für diese bestimmte Abgleichsgruppe ignoriert. So wird verhindert, dass nicht zusammenhängende Ereignisse ein fälschlicherweise positives Ergebnis auslösen.
Nullwerte im Abschnitt match
Google SecOps filtert implizit Nullwerte für alle Platzhalter heraus, die im Abschnitt match verwendet werden ("" für String, 0 für Zahlen, false für boolesche Werte, der Wert an Position 0 für aufgezählte Typen).
Beispiel: Nullwerte herausfiltern
Im folgenden Beispiel werden Abfragen veranschaulicht, mit denen die Nullwerte herausgefiltert werden.
rule ZeroValuePlaceholderExample {
events:
// Because $host is used in the match section, the query behaves
// as if the following predicate was added to the events section:
// $host != ""
$host = $e.principal.hostname
// Because $otherPlaceholder was not used in the match,
// there is no implicit filtering of zero values for $otherPlaceholder.
$otherPlaceholder = $e.principal.ip
match:
$host over 5m
condition:
$e
}Wenn einem Platzhalter jedoch eine Funktion zugewiesen ist, werden die Nullwerte von Platzhaltern, die im Abschnitt match verwendet werden, nicht implizit aus den Abfragen herausgefiltert.
Wenn Sie das implizite Filtern von Nullwerten deaktivieren möchten, können Sie die Option allow_zero_values im Abschnitt „Optionen“ verwenden. Die Option allow_zero_values ist nur in Regeln verfügbar.
Beispiel: Nullwerte zulassen
Im folgenden Beispiel werden Abfragen veranschaulicht, bei denen die Nullwerte von Platzhaltern, die im Abschnitt match verwendet werden, nicht implizit herausgefiltert werden:
rule AllowZeroValuesExample {
events:
// Because allow_zero_values is set to true, there is no implicit filtering
// of zero values for $host.
$host = $e.principal.hostname
// Because $otherPlaceholder was not used in the match,
// there is no implicit filtering of zero values for $otherPlaceholder.
$otherPlaceholder = $e.principal.ip
match:
$host over 5m
condition:
$e
options:
allow_zero_values = true
}Nächste Schritte
In den folgenden Ressourcen finden Sie weitere Informationen zur YARA-L-Logik oder zu erweiterten Abfragefunktionen:
Syntax und Logik
Referenzen und Beispiele
- Ausdrücke, Operatoren und Konstrukte in YARA-L 2.0
- Funktionen in YARA-L 2.0
- Zusammengesetzte Erkennungsregeln erstellen
- Beispiele: YARA-L 2.0-Abfragen
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten