Zusammengesetzte Erkennungsregeln erstellen

Unterstützt in:

In diesem Dokument finden Sie 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 identifizieren. Zusammengesetzte Erkennungen sind als Regeln für mehrere Ereignisse strukturiert und verwenden dieselbe grundlegende Syntax wie Standardregeln für einzelne Ereignisse. Weitere Informationen finden Sie in der Übersicht zu zusammengesetzten Erkennungen.

Regelstruktur

Zusammengesetzte Erkennungsregeln sind immer Regeln für mehrere Ereignisse und folgen derselben Struktur und Syntax wie eine Regel für ein einzelnes Ereignis.

Eine zusammengesetzte Regel hat die folgenden wesentlichen Komponenten:

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

  • Abschnitt match: Gibt an, wie die Eingaben in einem definierten Zeitfenster verknüpft werden sollen.

  • Abschnitt condition: Enthält die endgültige Logik, die bestimmt, 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. Eingaben für zusammengesetzte Regeln stammen aus Sammlungen, in denen die von anderen Abfragen generierten Erkennungen gespeichert sind. Google SecOps bietet die folgenden beiden Methoden für den Zugriff auf Daten aus Sammlungen.

Mit Variablen oder Meta-Labels auf Erkennungsinhalte verweisen

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 mehrere Regeln einen String (z. B. eine URL, einen Dateinamen oder einen Registrierungsschlüssel) in einer gemeinsamen outcome-Variablen speichern, wenn Sie diesen String in verschiedenen Kontexten 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 Sammlung.

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 mit den folgenden Pfaden auf diese Daten zugreifen:

  • detection.detection.variables["dest_domain"].string_val für den Zugriff auf die dest_domain-Ergebnisvariable.

  • detection.collection_elements.references.event.target.hostname für den Zugriff auf das UDM-Feld target.hostname.

  • detection.time_window.start_time.seconds für den Zugriff auf den Startzeitstempel der Erkennung.

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

  • Metadaten und Ergebniswerte der Erkennung (detection.detection)
  • Zugrunde liegende UDM-Ereignisse aus referenzierten Regeln (collection_elements)

Mit Regel-ID oder -Name auf Erkennungsinhalte verweisen

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 die Ergebnisse dieser Regeln beschränken möchten. Wenn Sie relevante Regeln nach Name oder ID referenzieren, 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 über die Regel-ID verweisen (empfohlen) : Verwenden Sie das Feld detection.detection.rule_id, um über die ID auf eine Regel zu verweisen. Sie finden die Regel-ID in der URL der Regel in Google SecOps. Von Nutzern erstellte 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 über den Regelnamen verweisen:Verwenden Sie das Feld detection.detection.rule_name, um über den Namen auf eine Regel zu verweisen. Sie können den genauen Regelnamen angeben oder einen regulären Ausdruck verwenden, um ihn abzugleichen. Beispiel:

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

Eingaben im Abschnitt match verknüpfen

Wenn Sie in einer zusammengesetzten Regel verknüpfte Erkennungen, Ereignisse oder Entitäten verknüpfen möchten, definieren Sie den Abschnitt match mit Variablen, die im Abschnitt events definiert sind. Diese Variablen können Regel-Labels, Ergebnisvariablen, Übereinstimmungsvariablen, Erkennungsfelder oder Sammlungselemente enthalten.

Informationen zur Syntax finden Sie unter Syntax des Abschnitts „match“.

Zusammengesetzte Regeln: Zeitintervalle und Hop-Fenster

Zusammengesetzte Regeln vergleichen Erkennungen und Ereignisse mit einem Zeitintervall und nicht mit einem einzelnen Zeitpunkt. Sie stimmen mit einem zusammengesetzten Hop-Fenster überein, wenn sich das Zeitfenster der Eingabeerkennung mit diesem Hop-Fenster überschneidet (z. B. wenn die Aktivität während dieses Zeitraums aktiv war).

Eine einzelne Erkennung kann mehrere Benachrichtigungen auslösen, wenn sie die Grenze zwischen benachbarten Hop-Fenstern überschreitet. Aufgrund von Pipelineverzögerungen werden diese historischen Übereinstimmungen später angezeigt. Insbesondere löst ein Hop-Fenster einer zusammengesetzten Regel eine Übereinstimmung aus, wenn sich das Zeitfenster der Eingabeerkennung (WindowStart bis WindowEnd) mit dem Hop-Fenster überschneidet.

Beispiel:

  1. Eine zusammengesetzte Regel hat 60-minütige Hop-Fenster: Hop 1 (18:58–19:58) und Hop 2 (19:58–20:58).
  2. Eine Erkennung eines Upstream-Producers hat ein Zeitfenster von 19:57:54 bis 20:56:54 (59 Minuten).
  3. Da das Zeitfenster des Producers 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 negative Ergebnisse zu vermeiden. Wenn die Producer-Regel keine Übereinstimmung bei Überschneidungen findet, wird die teilweise überlappende Erkennung weder für Hop 1 noch für Hop 2 berücksichtigt und die Korrelation zwischen der Erkennung und anderen Ereignissen wird nicht erkannt.

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

Abschnitt condition 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 Abschnitts „condition“.

Erweiterte Techniken auf zusammengesetzte Regeln anwenden

In diesem Abschnitt wird erläutert, wie Sie beim Erstellen zusammengesetzter Regeln erweiterte Techniken anwenden.

Ereignisse und Erkennungen kombinieren

Zusammengesetzte Regeln können mehrere Datenquellen kombinieren, darunter UDM-Ereignisse, Entitätsdiagrammdaten 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). Die Daten quelle umfasst Ereignisse, Entitäten und Erkennungen.

  • Quellen anhand eines gemeinsamen Kontexts 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 Anweisung 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

Sequenzielle zusammengesetzte Erkennungen identifizieren Muster verknüpfter Ereignisse, bei denen die Reihenfolge der Erkennungen wichtig ist, z. B. eine Erkennung eines Brute-Force-Anmeldeversuchs, gefolgt von einer erfolgreichen Anmeldung. Diese Muster können mehrere grundlegende Erkennungen, unaufbereitete UDM-Ereignisse oder beides kombinieren.

Wenn Sie eine sequenzielle zusammengesetzte Erkennung erstellen möchten, müssen Sie diese Reihenfolge in Ihrer Regel erzwingen. Verwenden Sie eine der folgenden Methoden, um die erwartete Reihenfolge zu erzwingen:

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

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

Beispiel: Sequenzielle zusammengesetzte Erkennungen

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

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

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

$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