Statistiken und Aggregationen in der UDM-Suche mit YARA-L 2.0
Auf dieser Seite wird beschrieben, wie Sie statistische Abfragen für UDM-Ereignisse ausführen und die Ergebnisse mit YARA-L 2.0 für die Analyse gruppieren.
Wenn Sie mit einer großen Anzahl von UDM-Ereignissen arbeiten, die in Ihrer Umgebung generiert werden, ist es wichtig, die Trends in Ihren UDM-Suchdaten zu kennen. Mithilfe von Statistiken und Aggregationsfunktionen können Sie aus Ihren UDM-Logs umsetzbare Informationen gewinnen. Die UDM-Suche unterstützt alle Aggregatfunktionen in YARA-L 2.0.
Anwendungsfälle für statistische Abfragen
Sie können statistische Abfragen für die folgenden Anwendungsfälle verwenden:
Wichtige Messwerte erfassen: Sie können die Verteilung und Häufigkeit von UDM-Ereignissen und zugehörigen Assets erfassen, z. B. von Hosts, die mit bekannten schädlichen IP-Adressen kommunizieren.
Anomales Verhalten erkennen: Sie können Aktivitätsspitzen erkennen, die auf Sicherheitsvorfälle hinweisen, z. B. unerwartete Netzwerkverkehrsspitzen oder Anmeldungen außerhalb der Geschäftszeiten.
Trends im Zeitverlauf analysieren: Sie können Änderungen des Sicherheitsstatus bewerten, um die Wirksamkeit der Kontrollen zu prüfen oder Verbesserungsmöglichkeiten zu identifizieren, z. B. durch die Überwachung von Schwankungen bei der Anzahl der Sicherheitslücken im Zeitverlauf.
YARA-L 2.0-Abfragestruktur in der Suche
Sie können Ergebnisse von UDM-Suchanfragen mit einer Syntax gruppieren und sortieren, die der YARA-L-Syntax ähnelt, die in den Regeln der Erkennungs-Engine verwendet wird. Weitere Informationen finden Sie unter YARA-L 2.0-Sprachsyntax.
Die YARA-L 2.0-Abfragestruktur sieht so aus:
Filteranweisung: Hiermit werden die Bedingungen für das Filtern von Ereignissen angegeben.
Abgleich (optional): Hier legen Sie die Felder fest, nach denen gruppiert werden soll. Weitere Informationen finden Sie unter Syntax des Abgleichsabschnitts.
Outcome: Gibt die Ergebnisse der Abfrage an. Weitere Informationen finden Sie unter Syntax des Abschnitts „Ergebnis“.
Order: Bestimmt die Reihenfolge der Abfrageergebnisse als
asc
(aufsteigend) oderdesc
(absteigend). Wenn die Reihenfolge (asc
oderdesc
) nicht angegeben ist, wird standardmäßigasc
verwendet.Limit (optional): Legt die maximale Anzahl der Zeilen fest, die die Abfrage zurückgibt.
Hier ein Beispiel für die Verwendung von „order“ und „limit“:
metadata.log_type = "OKTA"
match:
principal.ip
Outcome:
$user_count_by_ip = count(principal.user.userid)
order:
$user_count_by_ip desc
limit:
20
Zusammenfassungen
Die UDM-Suche unterstützt die folgenden Aggregatfunktionen:
Array
array(expression)
Beschreibung
Die Funktion array
gibt alle Werte in Form einer Liste zurück. Die Liste wird auf maximal 25 beliebige Elemente gekürzt.
Param-Datentypen
STRING
Rückgabetyp
LIST
Codebeispiele
Beispiel
Gibt ein Array mit Ereignistypen zurück.
$event_type = metadata.event_type
outcome:
$event_type_array = array($event_type)
array_distinct
array_distinct(expression)
Beschreibung
Die Funktion array_distinct
gibt alle eindeutigen Werte in Form einer Liste zurück. Die Liste wird auf maximal 25 zufällige Elemente gekürzt. Die Deduplizierung, um eine eindeutige Liste zu erhalten, wird vor dem Kürzen angewendet.
Param-Datentypen
STRING
Rückgabetyp
LIST
Codebeispiele
Beispiel
Gibt ein Array mit verschiedenen Ereignistypen zurück.
$event_type = metadata.event_type
outcome:
$event_type_array = array_distinct($event_type)
durchschn.
avg(numericExpression)
Beschreibung
Die Funktion avg
gibt den Durchschnitt der Werte in einer numerischen Spalte zurück. NULL
-Werte werden bei der Berechnung ignoriert. Sie wird oft mit match
verwendet, um Mittelwerte innerhalb bestimmter Gruppen in den Daten zu berechnen.
Param-Datentypen
NUMBER
Rückgabetyp
NUMBER
Codebeispiele
Beispiel
Alle Ereignisse finden, bei denen target.ip
nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip
übereinstimmen, den Durchschnitt von metadata.event_timestamp.seconds
in einer Variablen namens avg_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$avg_seconds = avg(metadata.event_timestamp.seconds)
Anzahl
count(expression)
Beschreibung
Die Funktion count
gibt die Anzahl der Zeilen in einer Gruppe zurück. Sie wird oft mit match
verwendet, um Zählungen für bestimmte Gruppen in den Daten zu erhalten.
Param-Datentypen
STRING
Rückgabetyp
NUMBER
Codebeispiele
Beispiel
Die Anzahl der erfolgreichen Nutzeranmeldungen im Zeitverlauf zurückgeben.
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count(metadata.id)
count_distinct
count_distinct(expression)
Beschreibung
Die Funktion count_distinct
gibt die Anzahl der Zeilen zurück, die innerhalb einer Gruppe unterschiedliche Werte haben. Sie wird oft mit match
verwendet, um Zählungen für bestimmte Gruppen in den Daten zu erhalten.
Param-Datentypen
STRING
Rückgabetyp
NUMBER
Codebeispiele
Beispiel
Die Anzahl der einzelnen erfolgreichen Nutzeranmeldungen im Zeitverlauf zurückgeben.
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count_distinct(metadata.id)
max
max(numericExpression)
Beschreibung
Die Funktion max
gibt den Höchstwert der Werte in einer numerischen Spalte zurück.
Sie wird oft mit match
verwendet, um den Maximalwert innerhalb jeder Gruppe in den Daten zu ermitteln.
Param-Datentypen
NUMBER
Rückgabetyp
NUMBER
Codebeispiele
Beispiel
Alle Ereignisse finden, bei denen target.ip
nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip
übereinstimmen, das Maximum von metadata.event_timestamp.seconds
in einer Variablen namens max_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$max_seconds = max(metadata.event_timestamp.seconds)
Min.
min(numericExpression)
Beschreibung
Die Funktion min
gibt den kleinsten Wert in einer numerischen Spalte zurück. Sie wird oft mit match
verwendet, um den Mindestwert innerhalb jeder Gruppe in den Daten zu ermitteln.
Param-Datentypen
NUMBER
Rückgabetyp
NUMBER
Codebeispiele
Beispiel
Alle Ereignisse finden, bei denen target.ip
nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip
übereinstimmen, das Minimum von metadata.event_timestamp.seconds
in einer Variablen namens min_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$min_seconds = min(metadata.event_timestamp.seconds)
Summe
sum(numericExpression)
Beschreibung
Die Funktion sum
gibt die Summe der Werte in einer numerischen Spalte zurück. NULL
-Werte werden bei der Berechnung ignoriert. Sie wird oft mit match
verwendet, um Summen innerhalb verschiedener Gruppen in den Daten zu berechnen.
Param-Datentypen
NUMBER
Rückgabetyp
NUMBER
Codebeispiele
Beispiel
Alle Ereignisse finden, bei denen target.ip
nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip
übereinstimmen, die Summe von network.sent_bytes
in einer Variablen namens sent_bytes
.
target.ip != ""
match:
principal.ip
outcome:
$sent_bytes = sum(network.sent_bytes)
stddev
stddev(numericExpression)
Beschreibung
Die Funktion stddev
gibt die Standardabweichung aller möglichen Werte zurück.
Param-Datentypen
NUMBER
Rückgabetyp
NUMBER
Codebeispiele
Beispiel
Alle Ereignisse finden, bei denen target.ip
nicht leer ist Speichern Sie für alle Ereignisse, die mit principal.ip
übereinstimmen, die Standardabweichung von metadata.event_timestamp.seconds
in einer Variablen namens stddev_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$stddev_seconds = stddev(metadata.event_timestamp.seconds)
YARA-L 2.0: Suche im Vergleich zur UDM-Nutzung
Das Keyword
over
, das für Suchanfragen für Ereignisfenster verwendet wird, wird in der Suche nicht unterstützt.UDM-Suchanfragen enthalten keine Abschnitte vom Typ
condition
undoption
.
Nach Zeitgranularität gruppieren
Sie können Ereignisfelder und Platzhalter im Bereich match
nach einer bestimmten Zeitgranularität gruppieren, ähnlich wie Sie eine Spalte in SQL gruppieren.
Die Syntax lautet:
match:
... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]
Wenn Sie nach Zeitgranularität gruppieren möchten, können Sie entweder das Schlüsselwort by
oder over
every
verwenden. Folgende Zeitauflösungen sind zulässig:
MINUTE
oderm
HOUR
oderh
DAY
oderd
WEEK
oderw
MONTH
odermo
Sowohl das Schlüsselwort by
als auch das Schlüsselwort over every
sind funktional äquivalent. Sie können eine der beiden Optionen verwenden.
Beispiele
Gruppieren Sie IP-Adresse und Hostnamen nach Stunden.
$hostname = principal.hostname
match:
$hostname, target.ip by hour
Gruppieren Sie die Anzahl aller Ereignisse nach Hostnamen und nach dem Tag, an dem das Ereignis aufgetreten ist.
$hostname = target.hostname
match:
$hostname over every day
outcome:
$events_count = count($hostname)
Einige Datenquellen, z. B. der Entitätskontext, sind für einen bestimmten Zeitraum (<start_time>
, <end_time>
) gültig und haben keinen einzelnen Zeitstempel.
Das Keyword first
ist optional und gilt für einen einzelnen Zeitstempel. Das bedeutet, dass für eine Datenquelle, die über einen bestimmten Zeitraum gültig ist, beim Keyword first
nur der Beginn (<start_time>
) berücksichtigt wird.
Angenommen, Sie haben eine Entität mit dem Zeitraum (1m, 5m
) und der Zeitgranularität 1m
. Wenn die Ergebnisse nach Hosts (h1
,h2
) gruppiert werden, werden die Spalten (h1
, 1m
) und (h2
, 1m
) zurückgegeben. Der Rest des Zeitraums wird ignoriert.
Das Keyword first
kann sowohl by
als auch over every
hinzugefügt werden. Das Verhalten ist in beiden Fällen identisch. Die Verwendung von by first
entspricht over every first
.
Im folgenden Beispiel wird der Operator by
mit der Datenquelle „Entitätskontext“ verwendet, die für einen bestimmten Zeitraum gültig ist. In dieser Abfrage wird der gesamte Zeitraum berücksichtigt, da das Keyword first
weggelassen wird.
graph.entity.hostname != ""
match:
graph.entity.ip by hour
outcome:
$min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)
Visualisierungen in der Google Suche erstellen und speichern
Die Suche nach einheitlichen Datenmodellen (Unified Data Model, UDM) in Google SecOps bietet leistungsstarke Funktionen zur Datenvisualisierung. Mit diesen Funktionen können SOC-Analysten (Security Operations Center) Bedrohungen effizient erkennen, untersuchen und darauf reagieren, indem sie Visualisierungen aus Suchergebnissen erstellen und in Dashboards speichern.
Visualisierungen im nativen Dashboard erstellen und speichern
So erstellen und speichern Sie Visualisierungen, die Sie dem nativen Dashboard hinzufügen möchten:
Erstellen Sie eine YARA-L-Abfrage mit den Abschnitten
match
undoutcome
.Wählen Sie einen Zeitraum aus und klicken Sie dann auf Suche ausführen, um die Abfrage auszuführen. Die Ergebnisse finden Sie auf den Tabs Statistiken und Visualisieren.
Führen Sie auf dem Tab Visualisieren die folgenden Schritte aus: a. Wählen Sie in der Liste Diagrammtyp einen Diagrammtyp aus. b. Passen Sie die Einstellungen unter Dateneinstellungen an, um das Diagramm anzupassen.
Führen Sie auf dem Bildschirm Zum Dashboard hinzufügen die folgenden Schritte aus: a. Geben Sie einen Diagrammnamen, eine Beschreibung und einen Zeitraum ein. b. Sie können das Diagramm einem vorhandenen Dashboard hinzufügen oder ein neues Dashboard erstellen.
Klicken Sie auf Zum Dashboard hinzufügen, um das Diagramm dem Dashboard hinzuzufügen.
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten