Daten mit Outer Joins in Beziehung setzen
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
nullzurückgegeben.Implikation von Platzhaltern: Für jede Platzhaltervariable, die im Abschnitt
matchverwendet 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.hostnamezugewiesen. Der Left Outer Join sorgt dafür, dass das Ereignis$e1vorhanden 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 5mEreignisdatentabelle
$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.hostnameEvent-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.hostnameEreignisdatentabelle
$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
nullzurü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
$hostwird der Wert aus$e2.principal.hostnamezugewiesen. Der Right Outer Join sorgt dafür, dass das Ereignis$e2vorhanden ist. So wird sichergestellt, dass die Variable$hostimmer 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 5mEntitä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 5mDatatable-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.hostnameEntitä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.hostnameDatatable-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