Zusammengesetzte Erkennungsregeln erstellen

Unterstützt in:

Dieses Dokument enthält eine technische Anleitung zum Erstellen einer zusammengesetzten Regel in der Google Security Operations-Plattform. Dabei werden mehrere YARA-L 2.0-Regeln verknüpft, um komplexe Angriffsmuster zu erkennen. Zusammengesetzte Erkennungen sind als Mehrfachereignisregeln strukturiert und haben dieselbe grundlegende Syntax wie Standardregeln für einzelne Ereignisse. Weitere Informationen finden Sie unter Übersicht über zusammengesetzte Erkennungen.

Regelstruktur

Zusammengesetzte Erkennungsregeln sind immer Mehrfachereignisregeln und folgen derselben Struktur und Syntax wie eine Einzelereignisregel.

Eine zusammengesetzte Regel besteht aus den folgenden wesentlichen Komponenten:

  • Abschnitt events: Definiert die Eingaben, d. h. die spezifischen Erkennungen oder Ereignisse, die von der Regel analysiert werden.

  • Abschnitt match: Gibt an, wie die Eingaben über ein definiertes Zeitfenster hinweg verbunden werden sollen.

  • Abschnitt condition: Enthält die endgültige Logik, mit der bestimmt wird, ob die verknüpften Ereignisse die Kriterien zum Auslösen einer Benachrichtigung erfüllen.

Eingaben im Abschnitt events definieren

Der erste Schritt beim Erstellen einer zusammengesetzten Erkennungsregel besteht darin, die Eingaben der Regel im Abschnitt events zu definieren. Die Eingaben für zusammengesetzte Regeln stammen aus Sammlungen, in denen die von anderen Abfragen generierten Erkennungen gespeichert werden. Google SecOps bietet die folgenden zwei Methoden für den Zugriff auf Daten aus Sammlungen.

Inhaltsreferenzierung mit Variablen oder Meta-Labels

Wenn Sie auf Daten aus einer Erkennung zugreifen möchten, ohne auf die ursprünglichen UDM-Ereignisse zu verweisen, können Sie outcome-Variablen, match-Variablen oder meta-Labels verwenden. Wir empfehlen diesen Ansatz, da er mehr Flexibilität und eine bessere Kompatibilität mit verschiedenen Regeltypen bietet.

Beispielsweise können mit mehreren Regeln ein String (z. B. eine URL, ein Dateiname oder ein Registrierungsschlüssel) in einer gemeinsamen outcome-Variablen gespeichert werden, wenn Sie in verschiedenen Kontexten nach diesem String suchen. Wenn Sie über eine zusammengesetzte Regel auf diesen String zugreifen möchten, beginnen Sie mit detection und suchen Sie die relevanten Informationen mithilfe von Elementen aus der Sammlungsressource.

Beispiel:Angenommen, eine Erkennungsregel liefert die folgenden Informationen:

  • Ergebnisvariable: dest_domain = "cymbal.com"

  • UDM-Feld: target.hostname = "cymbal.com"

In der zusammengesetzten Regel können Sie über die folgenden Pfade auf diese Daten zugreifen:

  • detection.detection.outcomes["dest_domain"], um auf die Ergebnisvariable dest_domain zuzugreifen.

  • detection.collection_elements.references.event.target.hostname, um auf das UDM-Feld target.hostname zuzugreifen.

  • detection.time_window.start_time.seconds, um auf den Startzeitstempel der Erkennung zuzugreifen.

Die Collection API und die SecurityResult API bieten Zugriff auf beides:

  • Metadaten und Ergebniswerte für die Erkennung (detection.detection)
  • Zugrunde liegende UDM-Ereignisse aus referenzierten Regeln (collection_elements)

Erkennungsinhalte mit Regel-ID oder -Name referenzieren

Sie können auf eine Regel entweder über ihren Namen oder ihre ID verweisen. Wir empfehlen diesen Ansatz, wenn Ihre Erkennungslogik von bestimmten Regeln abhängt und Sie die analysierten Daten auf diese Regelergebnisse beschränken möchten. Wenn Sie anhand des Namens oder der ID auf relevante Regeln verweisen, wird die Leistung verbessert und es werden Zeitüberschreitungen verhindert, da weniger Daten analysiert werden. Sie können beispielsweise Felder wie target.url oder principal.ip direkt aus einer bekannten vorherigen Erkennung abfragen.

  • Auf eine Regel anhand der Regel-ID verweisen (empfohlen): Verwenden Sie das Feld detection.detection.rule_id, um anhand der ID auf eine Regel zu verweisen. Die Regel-ID finden Sie in der URL der Regel in Google SecOps. Nutzergenerierte Regeln haben IDs im Format ru_UUID, während ausgewählte Erkennungen IDs im Format ur_UUID haben. Beispiel:

    detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"

  • Auf eine Regel anhand des Namens verweisen:Verwenden Sie das Feld detection.detection.rule_name, um anhand des Namens auf eine Regel zu verweisen. Sie können den genauen Namen der Regel angeben oder einen regulären Ausdruck verwenden, um eine Übereinstimmung zu erzielen. Beispiel:

    • detection.detection.rule_name = "My Rule Name"
    • detection.detection.rule_name = "/PartOfName/"

Eingaben im Abschnitt match zusammenführen

Wenn Sie zusammengehörige Erkennungen, Ereignisse oder Entitäten in einer zusammengesetzten Regel verknüpfen möchten, definieren Sie den Abschnitt match mit Variablen, die im Abschnitt events definiert sind. Diese Variablen können Regellabels, Ergebnisvariablen, Abgleichsvariablen, Erkennungsfelder oder Sammlungselemente umfassen.

Informationen zur Syntax finden Sie unter Syntax für den Abgleichabschnitt.

Zusammengesetzte Regeln: Zeitintervalle und Hop-Fenster

Bei zusammengesetzten Regeln werden Erkennungen und Ereignisse mit einem Zeitintervall statt mit einem einzelnen Zeitpunkt abgeglichen. Sie stimmen mit einem zusammengesetzten Hop-Zeitfenster überein, wenn sich das Eingabe-Erkennungszeitfenster mit diesem Hop-Zeitfenster überschneidet (z. B. wenn die Aktivität während dieses Zeitblocks aktiv war).

Eine einzelne Erkennung kann mehrere Benachrichtigungen auslösen, wenn sie sich über die Grenze zwischen benachbarten Hop-Fenstern erstreckt. Aufgrund von Pipeline-Verzögerungen werden diese historischen Übereinstimmungen später angezeigt. Genauer gesagt wird durch ein zusammengesetztes Regel-Hop-Fenster eine Übereinstimmung ausgelöst, wenn sich das Eingabeerkennungszeitfenster (WindowStart bis WindowEnd) mit dem Hop-Fenster überschneidet.

Beispiel:

  1. Eine zusammengesetzte Regel hat 60-Minuten-Hop-Fenster: Hop 1 (18:58–19:58) und Hop 2 (19:58–20:58).
  2. Die Erkennung eines Upstream-Produzenten hat ein Fenster von 19:57:54 bis 20:56:54 (59 Minuten).
  3. Da das Erstellerfenster um 19:57:54 Uhr begann (6 Sekunden vor dem Ende von Hop 1) und um 20:56:54 Uhr endete (während Hop 2), überschneidet es sich mit beiden Hop-Fenstern.
  4. Dadurch werden zwei zusammengesetzte Erkennungen ausgelöst (eine für Hop 1 und eine für Hop 2), was dazu beiträgt, Falsch-Negativ-Ergebnisse zu vermeiden. Wenn die Producer-Regel nicht mit der Überschneidung übereinstimmt, wird die teilweise Überschneidung weder für Hop 1 noch für Hop 2 berücksichtigt und die Korrelation zwischen der Erkennung und anderen Ereignissen wird nicht erfasst.

Weitere Informationen und Beispiele zum Angeben von Hop-Fenstern finden Sie unter Hop-Fenster.

condition-Abschnitt definieren

Definieren Sie den Abschnitt condition, um die Ergebnisse des Abschnitts match auszuwerten. Wenn die Bedingung true ist, wird eine Benachrichtigung generiert. Informationen zur Syntax finden Sie unter Syntax des Bedingungsabschnitts.

Erweiterte Techniken auf zusammengesetzte Regeln anwenden

In diesem Abschnitt wird beschrieben, wie Sie beim Erstellen zusammengesetzter Regeln erweiterte Techniken anwenden.

Ereignisse und Erkennungen kombinieren

In zusammengesetzten Regeln können mehrere Datenquellen kombiniert werden, darunter UDM-Ereignisse, Daten aus dem Entity-Diagramm und Erkennungsfelder. Hierfür gelten folgende Richtlinien:

  • Unterschiedliche Variablen pro Quelle verwenden: Weisen Sie jeder Datenquelle eindeutige Ereignisvariablen zu (z. B. $e für Ereignisse, $d für Erkennungen), wobei die Datenquelle Ereignisse, Entitäten und Erkennungen umfasst.

  • Quellen anhand von gemeinsamem Kontext verknüpfen: Verknüpfen Sie Datenquellen mit gemeinsamen Werten wie Nutzer-IDs, IP-Adressen oder Domainnamen in den Bedingungen Ihrer Regel.

  • Zeitfenster für den Abgleich definieren: Fügen Sie immer eine match-Klausel mit einem Zeitfenster von höchstens 48 Stunden ein.

Beispiel: Ereignisse und Erkennungen kombinieren

rule CheckCuratedDetection_with_EDR_and_EG {
  meta:
    author = "noone@cymbal.com"
  events:
    $d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
    $d.detection.collection_elements.references.event.network.dns.questions.name = $domain
    $d.detection.collection_elements.references.event.principal.asset.hostname = $hostname

    $e.metadata.log_type = "LIMACHARLIE_EDR"
    $e.metadata.product_event_type = "NETWORK_CONNECTIONS"
    $domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
    $hostname = re.capture($e.principal.hostname, "([^.]*)")

    $prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
    $prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
    $prevalence.graph.entity.hostname = $domain
    $prevalence.graph.entity.domain.prevalence.day_count = 10
    $prevalence.graph.entity.domain.prevalence.rolling_max <= 5
    $prevalence.graph.entity.domain.prevalence.rolling_max > 0

  match:
    $hostname over 1h

  outcome:
    $risk_score = 80
    $CL_target = array($domain)

  condition:
    $e and $d and $prevalence
}

Sequenzielle zusammengesetzte Erkennungen erstellen

Bei sequenziellen zusammengesetzten Erkennungen werden Muster von zusammenhängenden Ereignissen erkannt, bei denen die Reihenfolge der Erkennungen wichtig ist, z. B. die Erkennung eines Brute-Force-Anmeldeversuchs, gefolgt von einer erfolgreichen Anmeldung. Diese Muster können mehrere Basis-Erkennungen, UDM-Rohereignisse oder beides kombinieren.

Wenn Sie eine sequenzielle zusammengesetzte Erkennung erstellen möchten, müssen Sie diese Reihenfolge in Ihrer Regel erzwingen. Um die erwartete Reihenfolge zu erzwingen, haben Sie folgende Möglichkeiten:

  • Gleitende Fenster:Definieren Sie die Reihenfolge der Erkennungen mit gleitenden Fenstern in Ihren match-Bedingungen.

  • Zeitstempelvergleiche:Vergleichen Sie die Zeitstempel von Erkennungen in Ihrer Regel-Logik, um zu prüfen, ob sie in der ausgewählten Reihenfolge erfolgen.

Beispiel: Sequenzielle zusammengesetzte Erkennungen

events:
    $d1.detection.detection.rule_name = "fileEvent_rule"
    $userid = $d1.detection.detection.outcomes["user"]
    $hostname = $d1.detection.detection.outcomes["hostname"]

    $d2.detection.detection.rule_name = "processExecution_rule"
    $userid = $d2.detection.detection.outcomes["user"]
    $hostname = $d2.detection.detection.outcomes["hostname"]

    $d3.detection.detection.rule_name = "networkEvent_rule"
    $userid = $d3.detection.detection.outcomes["user"]
    $hostname = $d3.detection.detection.outcomes["hostname"]

$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds

  match:
    $userid over 24h after $d1

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