Joins in der Suche verwenden

Unterstützt in:

Mit Joins lassen sich Daten aus mehreren Quellen in Beziehung setzen, um mehr Kontext für eine Untersuchung zu erhalten. Durch die Verknüpfung von zugehörigen Ereignissen, Entitäten und anderen Daten können Sie komplexe Angriffsszenarien untersuchen.

In diesem Dokument wird beschrieben, wie Sie den Join-Vorgang in Google Security Operations verwenden. Außerdem werden unterstützte Join-Typen, Anwendungsfälle und Best Practices behandelt.

Join erstellen

Es werden nur statistikbasierte Joins unterstützt. Sie müssen sie im Abschnitt „match“ einer Abfrage mit einem Korrelationszeitfenster von bis zu 48 Stunden definieren. Sie können einen Join erstellen, indem Sie Felder direkt verbinden (z. B. $e1.hostname = $e2.hostname) oder Platzhaltervariablen verwenden. Wenn Sie einen Join im Abschnitt match definieren, müssen Sie Platzhaltervariablen verwenden.

Im folgenden Beispiel werden zwei Felder mit einem Gleichheitszeichen (=) und einer gemeinsamen Platzhaltervariablen verknüpft:

Beispiel 1:


events:

  // Assign a value from the first event to the placeholder variable $user

  $user = $e1.principal.user.userid

  // The second assignment creates an implicit join, linking $e2 to $e1

  // where the user ID is the same.

  $user = $e2.principal.user.userid

match:

  $user over 1h

condition:

  $e1 and $e2

Beispiel 2:


$e1.principal.ip = $ip

$e1.metadata.event_type = "USER_LOGIN"

$e1.principal.hostname = $host

$e2.target.ip = $ip

$e2.principal.hostname = "altostrat"

$e2.target.hostname = $host

match:
  $ip, $host over 5m

Unterstützte Join-Typen

In diesem Abschnitt werden die verschiedenen Arten von Joins beschrieben, die Sie verwenden können.

Join zwischen Ereignissen

Bei einem Event-Event-Join werden zwei verschiedene UDM-Ereignisse (Universal Data Model) verknüpft. Im folgenden Beispiel wird ein USER_LOGIN-Ereignis mit einem anderen Ereignis verknüpft, um den Hostnamen (altostrat) zu ermitteln, mit dem der Nutzer interagiert hat. Grundlage dafür ist eine gemeinsame IP-Adresse:


$e1.principal.ip = $ip

$e1.metadata.event_type = "USER_LOGIN"

$e2.target.ip = $ip

$e2.principal.hostname = "altostrat"

match:

  $ip over 5m

Event-EKG-Join

Durch die Verknüpfung von Ereignissen und EKG wird ein UDM-Ereignis mit einer Entität aus dem Entity Context Graph (ECG) verknüpft. Mit der folgenden Beispielabfrage wird ein NETWORK_CONNECTION-Ereignis und ein ASSET aus dem Entity-Diagramm gefunden, die innerhalb eines Zeitfensters von einer Stunde denselben Hostnamen haben:


events:

   $e1.metadata.event_type = "NETWORK_CONNECTION"

   $g1.graph.metadata.entity_type = "ASSET"

   $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname

   $x = $g1.graph.entity.asset.hostname

match:

   $x over 1h

condition:

   $e1 and $g1

Verknüpfung von Datentabellenereignissen

Bei einem Datentabellen-Ereignis-Join werden UDM-Ereignisse mit Einträgen in einer benutzerdefinierten Datentabelle verknüpft. Das ist nützlich, um Live-Ereignisdaten mit einer benutzerdefinierten Liste abzugleichen, z. B. mit bekannten schädlichen IP-Adressen oder Bedrohungsakteuren. Im folgenden Beispiel werden NETWORK_CONNECTION-Ereignisse mit einer Datentabelle verknüpft, um Verbindungen mit bestimmten IP-Adressen aus dieser Liste zu finden:


$ip = %DATATABLE_NAME.COLUMN_NAME

$ip = $e1.principal.ip

$e1.metadata.event_type = "NETWORK_CONNECTION"

match:

   $ip over 1h

Best Practices

Join-Abfragen können ressourcenintensiv sein, da sie viele Ergebnisse kombinieren. Breite, allgemeine Filter können dazu führen, dass Abfragen fehlschlagen, manchmal nach langer Verzögerung, z. B.:

  • target.ip != null

  • metadata.event_type = "NETWORK_CONNECTION" (wenn dieser Ereignistyp in Ihrer Umgebung sehr häufig vorkommt)

Wir empfehlen, allgemeine Filter mit spezifischeren zu kombinieren, um die Gesamtzahl der Ereignisse zu reduzieren, die von der Abfrage verarbeitet werden müssen. Ein allgemeiner Filter wie target.ip != null sollte mit spezifischeren Filtern kombiniert werden, um die Leistung der Abfrage zu verbessern, z. B.:

$e1.metadata.log_type = $log
$e1.metadata.event_type = "USER_LOGIN"
$e1.target.ip != ""

$e2.metadata.log_type = $log
$e2.principal.ip = "10.0.0.76"
$e2.target.hostname != "altostrat"

match:
$log over 5m

Wenn die Abfrage immer noch langsam ist, können Sie auch den gesamten Zeitraum der Abfrage verkürzen (z. B. von 30 Tagen auf eine Woche).

Weitere Informationen finden Sie unter Best Practices für YARA-L.

Beschränkungen

Bei der Verwendung von Joins gelten die folgenden Einschränkungen:

  • Pro Anfrage können Sie maximal zwei UDM-Ereignisse verwenden.

  • Pro Anfrage kann maximal ein EKG-Ereignis verwendet werden.

  • Pro Abfrage können maximal zwei Datatables verwendet werden.

  • Sie können Datentabellen-, UDM- und EKG-Ereignisse nicht in einer einzigen Abfrage zusammenführen.

  • Der maximale Zeitraum für Abfragen beträgt 90 Tage.

  • Das maximale Zeitfenster für match beträgt 48 Stunden.

  • Joins werden in der Benutzeroberfläche und in der EventService.UDMSearch API, aber nicht in der SearchService.UDMSearch API unterstützt.

Gängige Anwendungsfälle

In diesem Abschnitt werden einige gängige Möglichkeiten zur Verwendung von Joins aufgeführt.

Diebstahl und Verwendung von Anmeldedaten erkennen

Ziel: Instanzen finden, in denen sich ein Nutzer erfolgreich anmeldet und dann schnell eine wichtige Systemdatei löscht. Das könnte auf eine Kontoübernahme oder böswillige Insideraktivitäten hindeuten.

Join-Typ: Event-Event-Join

Beschreibung: Bei dieser Abfrage werden zwei unterschiedliche Ereignisse verknüpft, die für sich genommen nicht verdächtig sind, aber in Kombination sehr verdächtig werden. Zuerst wird nach einem USER_LOGIN-Ereignis und dann nach einem FILE_DELETION-Ereignis gesucht. Diese werden durch die gemeinsame user.userid mit einem kurzen Zeitfenster ergänzt.

Beispielabfrage:


// Event 1: A user successfully logs in

$e1.metadata.event_type = "USER_LOGIN"

$e1.security_result.action = "ALLOW"

$e1.principal.user.userid = $user

// Event 2: The same user deletes a critical file

$e2.metadata.event_type = "FILE_DELETION"

$e2.target.file.full_path = /etc\/passwd|C:\\Windows\\System32\\/

$e2.principal.user.userid = $user

match:
  $user over 10m

condition:
  $e1 and $e2

Riskante Verbindungen von kritischen Assets identifizieren

Ziel: Live-Netzwerkdaten mit Asset-Informationen anreichern, um ausgehende Verbindungen von Servern zu finden, die nicht mit externen Domänen mit geringer Prävalenz kommunizieren sollten (z. B. ein Produktionsdatenbankserver).

Join-Typ: Event-EKG-Join

Beschreibung: Eine einzelne Netzwerkverbindung zu einer seltenen Domain hat möglicherweise keine hohe Priorität. Durch die Verknüpfung mit dem Entity Context Graph (ECG) wird die Bedeutung dieses Ereignisses jedoch erhöht. Es wird speziell nach NETWORK_CONNECTION-Ereignissen gesucht, die von Assets stammen, die im Entitätsdiagramm als „Critical Database Server“ (Kritischer Datenbankserver) gekennzeichnet sind.

Beispielabfrage:


events:
  $e.metadata.event_type = "NETWORK_CONNECTION"

  $e.target.domain.prevalence.day_count <= 5

  $asset.graph.metadata.entity_type = "ASSET"

  $asset.graph.entity.asset.labels.value = "Critical Database Server"

  $e.principal.asset.hostname = $asset.graph.entity.asset.hostname

  $host = $e.principal.asset.hostname

match:
  $host over 1h

condition:
  $e and $asset

Nach IOCs von Angreifern suchen

Ziel: Aktiv nach Indicators of Compromise (IoCs) suchen, indem alle aktiven DNS-Abfragen mit einer Liste von Domains abgeglichen werden, die bekanntermaßen von einem bestimmten Bedrohungsakteur verwendet werden.

Join-Typ: Datatable-Event-Join

Beschreibung: Ihr Threat Intelligence-Team verwaltet eine Datentabelle mit dem Namen ThreatActor_Domains, in der schädliche Domains aufgeführt sind. In dieser Abfrage werden alle NETWORK_DNS_QUERY-Ereignisse in Echtzeit mit dieser Datentabelle verknüpft. Es wird sofort angezeigt, wenn ein Host in Ihrem Netzwerk versucht, eine Domain aus Ihrer Liste mit Informationen zu Bedrohungen aufzulösen.

Beispielabfrage:


// Datatable: Get the list of malicious domains

$domain = $ip = %DATATABLE_NAME.COLUMN_NAME

// Event: A DNS query is made

$e.metadata.event_type = "NETWORK_DNS"

$e.network.dns.questions.name = $domain

match:
  $domain over 5m

condition:
  $e

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