Daten mit Outer Joins in Beziehung setzen

Unterstützt in:

In diesem Dokument werden Outer Joins (Left Join und Right Join) beschrieben. Mit Join-Vorgängen werden Daten aus mehreren Quellen auf Grundlage gemeinsamer Feldwerte in Beziehung gesetzt und kombiniert. Durch die Kombination von zugehörigen Sicherheitsereignissen und ‑entitäten in einer einzigen, umfassenden Ansicht können Sie eine effektive Bedrohungserkennung und ‑untersuchung ermöglichen.

Im Gegensatz zu Standard-Joins (Inner Joins), für die übereinstimmende Einträge in beiden Datenquellen erforderlich sind, werden bei einem Outer Join alle Datensätze von einer Seite des Joins abgerufen, auch wenn in der anderen keine übereinstimmenden Einträge vorhanden sind. Nicht übereinstimmende Felder von der anderen Seite werden in der Regel mit null gefüllt. So wird verhindert, dass Daten ohne Entsprechung verloren gehen.

So funktionieren Outer Joins

Das Konzept von Outer Joins in YARA-L 2.0 ist identisch mit Standard-SQL-Outer Joins:

  • Beim Left Outer Join bleiben alle Datensätze von der linken Seite des Joins erhalten.

  • Beim Right Outer Join werden alle Datensätze von der rechten Seite des Joins beibehalten.

Die Outer Join-Syntax (Left Join und Right Join) wird für alle Abfragen unterstützt, sowohl mit als auch ohne match-Bedingung.

Left Outer Join

Bei einem Left Outer Join (oder Left Join) bleiben alle Datensätze aus der Datenquelle auf der linken Seite des left join-Schlüsselworts erhalten.

  • Wenn ein Datensatz von der linken Seite keine Entsprechung im rechten-Ereignis hat, werden die Felder aus dem rechten Ereignis als null zurückgegeben.

  • Implikation von Platzhaltern: Für jede Platzhaltervariable, die im Abschnitt match verwendet wird, muss auf ein Feld aus dem linken Ereignis verwiesen werden, damit die Daten im gesamten Ergebnissatz richtig zusammengefasst werden.

Beispiel für einen Left Join von Ereignis zu Ereignis

Im folgenden Beispiel wird ein Left Outer Join verwendet, um Nutzeranmeldeereignisse mit nachfolgenden Netzwerkverbindungsereignissen zu korrelieren, die auf demselben Host auftreten. Durch den Left Join bleiben alle USER_LOGIN-Ereignisse im Ergebnissatz erhalten. Wenn ein übereinstimmendes NETWORK_CONNECTION-Ereignis ($e2) gefunden wird, werden die zugehörigen Daten zusammengeführt. Wenn keine Übereinstimmung gefunden wird, sind die Felder für $e2 null.


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname

Linkes Ereignis definieren

Im folgenden Beispiel wird die linke Seite des Joins ($e1) definiert. Das ist die Ereignismenge, die im Endergebnis beibehalten wird:

$e1.metadata.event_type = "USER_LOGIN"

Die folgende Tabelle zeigt das Abfrageergebnis mit der ursprünglichen Gruppe von Nutzeranmeldeereignissen:

Ereignistyp Principal-Hostname IP-Adresse
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50
USER_LOGIN kiosk-4 192.168.1.104

Das richtige Ereignis definieren

Im folgenden Beispiel wird die rechte Seite des Joins ($e2) definiert. Das ist die Ereignismenge, die mit den linken Ereignissen abgeglichen wird:

$e2.metadata.event_type = "NETWORK_CONNECTION"

In der folgenden Tabelle sind die Ereignisse für Netzwerkverbindungen aufgeführt, die für den Abgleich verfügbar sind:

Ereignistyp Principal-Hostname IP-Adresse
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION kiosk-4 203.0.113.3

An Events teilnehmen

mit einem Bereich für Übereinstimmungen

Das folgende Beispiel zeigt eine Abgleichsabfrage mit einem Left Outer Join für das Feld principal.hostname:


  $e1.metadata.event_type = "USER_LOGIN"

  $e2.metadata.event_type = "NETWORK_CONNECTION"

  left join $e1.principal.hostname = $e2.principal.hostname

  $host = $e1.principal.hostname

  match:
    $host over 5m

  • Der Left Outer Join sorgt dafür, dass jedes USER_LOGIN-Ereignis ($e1) im endgültigen Ergebnis enthalten ist.

  • Dem Platzhalter $host wird der Wert aus $e1.principal.hostname zugewiesen. Der Left Outer Join sorgt dafür, dass das Ereignis $e1 vorhanden ist, sodass die Variable „$host“ immer für die Aggregation verwendet wird.

  • Die Regel aggregiert die Ergebnisse nach Host für ein 5‑Minuten-Zeitfenster.

Beitrittsergebnis

Die resultierenden Daten zeigen die Kombination der beiden Ereignisse. Alle Datensätze aus der linken Tabelle ($e1) werden beibehalten und Felder aus der rechten Tabelle ($e2) werden auf null gesetzt, wenn kein übereinstimmender Hostname gefunden wird (z. B. für server-db-03).

Ereignistyp ($e1) Haupt-Hostname ($host) IP-Adresse ($e1) Ereignistyp ($e2) IP-Adresse ($e2) Zuordnungsstatus
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION 192.168.1.101 Treffer gefunden
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION 192.168.1.101 Treffer gefunden
USER_LOGIN server-db-03 10.0.0.50 null null Keine Übereinstimmung
USER_LOGIN kiosk-4 192.168.1.104 NETWORK_CONNECTION 203.0.113.3 Treffer gefunden

Beispiele für LEFT JOIN-Abfragen

Dieser Abschnitt enthält Beispiele für LEFT JOIN-Abfragen.

Joins mit einer Übereinstimmungsbedingung

  • Event-Entität

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Ereignisdatentabelle

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    match:
      $host by 5m
    

Joins ohne Übereinstimmungsbedingung

  • Event-Event

    
    $e1.metadata.event_type = "USER_LOGIN"
    $e1.principal.ip = "114.241.96.87"
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    left join $e1.principal.hostname = $e2.principal.hostname
    
    
  • Event-Entität

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    
  • Ereignisdatentabelle

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    

Right Outer Join

Bei einem Right Outer Join (oder Right Join) bleiben alle Datensätze aus der Datenquelle auf der rechten Seite des right join-Schlüsselworts erhalten.

  • Wenn ein Datensatz aus dem rechten Ereignis keine Entsprechung im linken Ereignis hat, werden die Felder aus dem linken Ereignis als null zurückgegeben.

  • Implikation von Platzhaltern:Für jede Platzhaltervariable, die im match-Abschnitt verwendet wird, muss auf ein Feld aus dem richtigen Ereignis verwiesen werden, damit die Daten im gesamten Ergebnissatz korrekt zusammengefasst werden.

Beispiel für einen Event-to-Event-Right-Join

Im folgenden Beispiel wird ein right outer join verwendet, um Nutzeranmeldeereignisse mit nachfolgenden Netzwerkverbindungsereignissen zu korrelieren, die auf demselben Host auftreten. Mit right joinwird dafür gesorgt, dass alle NETWORK_CONNECTION-Ereignisse im Ergebnisset beibehalten werden. Wenn ein übereinstimmendes USER_LOGIN-Ereignis gefunden wird, werden die zugehörigen Daten zusammengeführt. Wenn keine Übereinstimmung gefunden wird, sind die Felder für $e1 null.


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

Linkes Ereignis definieren

Mit der folgenden Abfrage wird die linke Seite des Joins ($e1) definiert, die die optionale Ereignismenge im Endergebnis ist:


$e1.metadata.event_type = "USER_LOGIN"

Die folgende Tabelle zeigt das Ergebnis der Abfrage, in der die erste Gruppe von Nutzeranmeldeereignissen ermittelt wird:

Ereignistyp Principal-Hostname IP-Adresse
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50

Das richtige Ereignis definieren

Mit der folgenden Abfrage wird die rechte Seite des Joins ($e2) definiert, also die Ereignismenge, die im Endergebnis beibehalten wird.


$e2.metadata.event_type = "NETWORK_CONNECTION"

In der folgenden Tabelle sind die Ereignisse für Netzwerkverbindungen aufgeführt, die für den Abgleich verfügbar sind.

Ereignistyp Principal-Hostname IP-Adresse
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION vm-unauth-05 203.0.113.3

An Events teilnehmen

Das folgende Beispiel zeigt eine Abgleichsabfrage mit einem Right Outer Join für das Feld principal.hostname:


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

$host = $e1.principal.hostname

match:
  $host over 5m

  • Der Right Outer Join sorgt dafür, dass jedes NETWORK_CONNECTION-Ereignis ($e2) im endgültigen Ergebnis enthalten ist.

  • Dem Platzhalter $host wird der Wert aus $e2.principal.hostname zugewiesen. Der Right Outer Join sorgt dafür, dass das Ereignis $e2 vorhanden ist. So wird sichergestellt, dass die Variable $host immer für die Aggregation verwendet wird.

  • Die Regel aggregiert die Ergebnisse nach Host für ein 5‑Minuten-Zeitfenster.

Beitrittsergebnis

Das resultierende Dataset enthält die Kombination der beiden Ereignisse. Alle Datensätze aus der rechten Tabelle ($e2) werden beibehalten und Felder aus der linken Tabelle ($e1) werden auf „null“ gesetzt, wenn kein übereinstimmender Hostname gefunden wird (z. B. vm-unauth-05).

Ereignistyp ($e1) Haupt-Hostname ($e1) IP-Adresse ($e1) Ereignistyp ($e2) Principal-Hostname ($host) IP-Adresse ($e2) Zuordnungsstatus
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION workstation-01 192.168.1.101 Treffer gefunden
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION laptop-hr-02 192.168.1.101 Treffer gefunden
null null null NETWORK_CONNECTION vm-unauth-05 203.0.113.4 Keine Übereinstimmung

Beispiele für RIGHT JOIN-Abfragen

Dieser Abschnitt enthält Beispielabfragen für RIGHT JOIN.

Joins mit einer Übereinstimmungsbedingung

  • Event-Event

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    $host = $e2.principal.hostname
    
    match:
      $host over 5m
    
    
  • Entitätsereignis

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    match:
      $host by 5m
    
    

Joins ohne Übereinstimmungsbedingung

  • Event-Event

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e1.principal.ip = "114.241.96.87"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    
  • Entitätsereignis

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    

Beschränkungen

Beachten Sie beim Erstellen von Outer Joins die folgenden Einschränkungen:

  • Ein Full Outer Join (Left Join und Right Join zusammen) wird nicht unterstützt.

  • Der Zeitraum für Abfragen für Join-Vorgänge ohne Abgleich ist auf maximal 14 Tage begrenzt.

  • Sie können zwei Kontextquellen nicht direkt verknüpfen, z. B. eine Entität direkt mit einer Datentabelle.

  • Das primäre UDM-Ereignis muss die beibehaltene Seite des Outer Joins sein. Die Abfrage ist ungültig, wenn sich das primäre Ereignis auf der „nullable“-Seite befindet.

    • Ein Join zwischen Ereignis und Einheit muss ein Left Join sein. So wird das Ereignis ($e1) korrekt beibehalten.

    • Ein Join von Entität und Ereignis muss ein Right Join sein. So wird das Ereignis ($e1) korrekt beibehalten.

    Das folgende Beispiel ist ungültig, weil sich das UDM-Ereignis ($e1) auf der linken Seite befindet, aber durch den RIGHT JOIN die rechte Seite ($g1) beibehalten wird. Das verstößt gegen die Regel, dass das UDM-Ereignis beibehalten werden muss:

    
    // Invalid query
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    right join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    
    

Best Practices

Um langsame Leistung und Zeitüberschreitungen bei Outer-Join-Abfragen zu vermeiden, verwenden Sie spezifische und enge Filter.

Zum Beispiel eine allgemeine Anfrage wie die folgende:


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname

Kann durch Hinzufügen bestimmter Kriterien optimiert werden:


$e1.metadata.event_type = "USER_LOGIN"
$e1.principal.ip = "121.121.121.121"
$e1.principal.user.userid = "alex"
$e2.metadata.event_type = "NETWORK_CONNECTION"
$e2.src.hostname = "altostrat.com"
$e1.principal.hostname = $e2.principal.hostname

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