Übersicht über die Sprache YARA-L 2.0
YARA-L 2.0 ist eine Computersprache, mit der Regeln für die Suche in den Logdaten Ihres Unternehmens bei der Aufnahme in Ihre Google Security Operations-Instanz erstellt werden. Die YARA-L-Syntax basiert auf der YARA-Sprache, die von VirusTotal entwickelt wurde. Die Sprache funktioniert in Verbindung mit der Google SecOps Detection Engine und ermöglicht es Ihnen, in großen Datenmengen nach Bedrohungen und anderen Ereignissen zu suchen.
Hier finden Sie weitere Informationen:
YARA-L 2.0 – Beispielregeln
Die folgenden Beispiele zeigen Regeln, die in YARA-L 2.0 geschrieben wurden. In jedem wird gezeigt, wie Ereignisse in der Regelsprache korreliert werden.
Regeln und Optimierung
Mit der folgenden Regel wird nach bestimmten Mustern in Ereignisdaten gesucht und eine Erkennung erstellt, wenn die Muster gefunden werden. Diese Regel enthält eine Variable $e1
für den Tracking-Ereignistyp und das UDM-Feld metadata.event_type
. Die Regel prüft auf bestimmte Vorkommen von Übereinstimmungen mit regulären Ausdrücken mit e1
. Wenn das Ereignis $e1
eintritt, wird eine Erkennung erstellt.
Die Regel enthält eine not
-Bedingung, um bestimmte nicht schädliche Pfade auszuschließen.
Sie können not
-Bedingungen hinzufügen, um falsch positive Ergebnisse zu vermeiden.
rule suspicious_unusual_location_svchost_execution
{
meta:
author = "Google Cloud Security"
description = "Windows 'svchost' executed from an unusual location"
yara_version = "YL2.0"
rule_version = "1.0"
events:
$e1.metadata.event_type = "PROCESS_LAUNCH"
re.regex($e1.principal.process.command_line, `\bsvchost(\.exe)?\b`) nocase
not re.regex($e1.principal.process.command_line, `\\Windows\\System32\\`) nocase
condition:
$e1
}
Anmeldungen aus verschiedenen Städten
Mit der folgenden Regel wird nach Nutzern gesucht, die sich innerhalb von fünf Minuten von mindestens zwei Städten aus in Ihrem Unternehmen angemeldet haben:
rule DifferentCityLogin {
meta:
events:
$udm.metadata.event_type = "USER_LOGIN"
$udm.principal.user.userid = $user
$udm.principal.location.city = $city
match:
$user over 5m
condition:
$udm and #city > 1
}
Abgleichsvariable: $user
Ereignisvariable:$udm
Platzhaltervariable: $city
und $user
So funktioniert diese Regel:
- Gruppiert Ereignisse mit dem Nutzernamen (
$user
) und gibt sie zurück ($user
), wenn eine Übereinstimmung gefunden wird. - Der Zeitraum beträgt 5 Minuten. Das bedeutet, dass nur Ereignisse korreliert werden, die weniger als 5 Minuten auseinanderliegen.
- Suche nach einer Ereignisgruppe (
$udm
), deren Ereignistyp USER_LOGIN ist. - Für diese Ereignisgruppe wird die Nutzer-ID in der Regel als
$user
und die Stadt der Anmeldung als$city.
aufgerufen. - Gibt eine Übereinstimmung zurück, wenn die Anzahl der eindeutigen
city
-Werte (angegeben durch#city
) in der Ereignisgruppe ($udm
) innerhalb des 5-Minuten-Zeitraums größer als 1 ist.
Schnelles Erstellen und Löschen von Nutzern
Mit der folgenden Regel wird nach Nutzern gesucht, die innerhalb von vier Stunden erstellt und dann gelöscht wurden:
rule UserCreationThenDeletion {
meta:
events:
$create.target.user.userid = $user
$create.metadata.event_type = "USER_CREATION"
$delete.target.user.userid = $user
$delete.metadata.event_type = "USER_DELETION"
$create.metadata.event_timestamp.seconds <=
$delete.metadata.event_timestamp.seconds
match:
$user over 4h
condition:
$create and $delete
}
Ereignisvariablen:$create
und $delete
Abgleichsvariable: $user
Platzhaltervariable: –
So funktioniert diese Regel:
- Gruppiert Ereignisse mit dem Nutzernamen (
$user
) und gibt sie zurück ($user
), wenn eine Übereinstimmung gefunden wird. - Das Zeitfenster beträgt 4 Stunden. Das bedeutet, dass nur Ereignisse korreliert werden, die weniger als 4 Stunden auseinanderliegen.
- Es wird nach zwei Ereignisgruppen gesucht (
$create
und$delete
, wobei$create
gleich#create >= 1
ist). $create
entsprichtUSER_CREATION
-Ereignissen und ruft die Nutzer-ID als$user
auf.$user
wird verwendet, um die beiden Ereignisgruppen zusammenzuführen.$delete
entsprichtUSER_DELETION
-Ereignissen und ruft die Nutzer-ID als$user
auf. Bei dieser Regel wird nach einer Übereinstimmung gesucht, bei der die Nutzer-ID in den beiden Ereignisgruppen identisch ist.- Mit dieser Regel wird nach Fällen gesucht, in denen das Ereignis aus
$delete
später als das Ereignis aus$create
eintritt. Wenn ein solcher Fall gefunden wird, wird eine Übereinstimmung zurückgegeben.
Regel für einzelne Termine
Regeln für einzelne Ereignisse korrelieren über ein einzelnes Ereignis hinweg. Eine einzelne Ereignisregel kann Folgendes sein:
- Regeln ohne „Abgleich“-Abschnitt.
- Regel mit einem
match
-Abschnitt und einemcondition
-Abschnitt, in dem nur das Vorhandensein eines Ereignisses geprüft wird (z. B. „$e“, „#e > 0“, „#e >= 1“, „1 <= #e“, „0 < #e“).
Mit der folgenden Regel wird beispielsweise nach einem Nutzeranmeldeereignis gesucht. Das erste Ereignis, das in den Unternehmensdaten in Ihrem Google SecOps-Konto gefunden wird, wird zurückgegeben:
rule SingleEventRule {
meta:
author = "noone@altostrat.com"
events:
$e.metadata.event_type = "USER_LOGIN"
condition:
$e
}
Hier ist ein weiteres Beispiel für eine Regel für ein einzelnes Ereignis mit einem Abschnitt „Übereinstimmung“. Mit dieser Regel wird nach einem Nutzer gesucht, der sich mindestens einmal innerhalb von 5 Minuten angemeldet hat. Es wird geprüft, ob ein Nutzeranmeldeereignis vorhanden ist.
rule SingleEventRule {
meta:
author = "alice@example.com"
description = "windowed single event example rule"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.principal.user.userid = $user
match:
$user over 5m
condition:
#e > 0
}
rule MultiEventRule{
meta:
author = "alice@example.com"
description = "Rule with outcome condition and simple existence condition on one event variable"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.principal.user.userid = $user
match:
$user over 10m
outcome:
$num_events_in_match_window = count($e.metadata.id)
condition:
#e > 0 and $num_events_in_match_window >= 10 // Could be rewritten as #e >= 10
}
Regel für mehrere Ereignisse
Mit mehreren Ereignisregeln können Sie viele Ereignisse über einen bestimmten Zeitraum hinweg gruppieren und versuchen, Korrelationen zwischen Ereignissen zu finden. Eine typische Regel für mehrere Ereignisse hat Folgendes:
- Ein
match
-Abschnitt, in dem der Zeitraum angegeben wird, über den Ereignisse gruppiert werden müssen. - Ein
condition
-Abschnitt, in dem angegeben wird, welche Bedingung die Erkennung auslösen soll, und in dem geprüft wird, ob mehrere Ereignisse vorhanden sind.
Die folgende Regel sucht beispielsweise nach einem Nutzer, der sich in weniger als 10 Minuten mindestens 10-mal angemeldet hat:
rule MultiEventRule {
meta:
author = "noone@altostrat.com"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.principal.user.userid = $user
match:
$user over 10m
condition:
#e >= 10
}
Einzelnes Ereignis im Bereich von IP-Adressen
Im folgenden Beispiel wird eine einzelne Ereignisregel gezeigt, die nach Übereinstimmungen zwischen zwei bestimmten Hostnamen und einem bestimmten Bereich von IP-Adressen sucht:
rule OrsAndNetworkRange {
meta:
author = "noone@altostrat.com"
events:
// Checks CIDR ranges.
net.ip_in_range_cidr($e.principal.ip, "203.0.113.0/24")
// Detection when the hostname field matches either value using or.
$e.principal.hostname = /pbateman/ or $e.principal.hostname = /sspade/
condition:
$e
}
Beispiel für eine beliebige Regel
Mit der folgenden Regel wird nach Anmeldeereignissen gesucht, bei denen alle Quell-IP-Adressen innerhalb eines Zeitraums von 5 Minuten nicht mit einer als sicher bekannten IP-Adresse übereinstimmen.
rule SuspiciousIPLogins {
meta:
author = "alice@example.com"
events:
$e.metadata.event_type = "USER_LOGIN"
// Detects if all source IP addresses in an event do not match "100.97.16.0"
// For example, if an event has source IP addresses
// ["100.97.16.1", "100.97.16.2", "100.97.16.3"],
// it will be detected since "100.97.16.1", "100.97.16.2",
// and "100.97.16.3" all do not match "100.97.16.0".
all $e.principal.ip != "100.97.16.0"
// Assigns placeholder variable $ip to the $e.principal.ip repeated field.
// There will be one detection per source IP address.
// For example, if an event has source IP addresses
// ["100.97.16.1", "100.97.16.2", "100.97.16.3"],
// there will be one detection per address.
$e.principal.ip = $ip
match:
$ip over 5m
condition:
$e
}
Reguläre Ausdrücke in einer Regel
Im folgenden Beispiel für einen regulären Ausdruck in YARA-L 2.0 wird nach Ereignissen mit E-Mails gesucht, die von der Domain „altostrat.com“ empfangen wurden. Da nocase
der Variablen $host
für den regex
-Vergleich und der regex
-Funktion hinzugefügt wurde, wird bei beiden Vergleichen die Groß- und Kleinschreibung nicht beachtet.
rule RegexRuleExample {
meta:
author = "noone@altostrat.com"
events:
$e.principal.hostname = $host
$host = /.*HoSt.*/ nocase
re.regex($e.network.email.from, `.*altostrat\.com`) nocase
match:
$host over 10m
condition:
#e > 10
}
Beispiele für zusammengesetzte Regeln
Zusammengesetzte Erkennungen verbessern die Bedrohungserkennung durch die Verwendung zusammengesetzter Regeln. Diese zusammengesetzten Regeln verwenden Erkennungen aus anderen Regeln als Eingabe. So lassen sich komplexe Bedrohungen erkennen, die mit einzelnen Regeln möglicherweise nicht erkannt werden. Weitere Informationen finden Sie unter Übersicht über zusammengesetzte Erkennungen.
Erkennung von Stolperdrähten
Zusammengesetzte Tripwire-Erkennungen sind die einfachste Form einer zusammengesetzten Erkennung, die auf Feldern innerhalb von Erkennungsergebnissen basiert, z. B. auf Ergebnisvariablen oder Regelmetadaten. Sie helfen, Erkennungen nach Bedingungen zu filtern, die auf ein höheres Risiko hinweisen können, z. B. ein Administratornutzer oder eine Produktionsumgebung.
rule composite_admin_detection {
meta:
rule_name = "Detection with Admin User"
author = "Google Cloud Security"
description = "Composite rule that looks for any detections where the actor is an admin user"
severity = "Medium"
events:
$rule_name = $d.detection.detection.rule_name
$principal_user = $d.detection.detection.outcomes["principal_users"]
$principal_user = /admin|root/ nocase
match:
$principal_user over 1h
outcome:
$risk_score = 75
$upstream_rules = array_distinct($rule_name)
condition:
$d
}
Erkennungen für Schwellenwerte und Aggregation
Mit Regeln für die Erkennung von Aggregationszusammensetzungen können Sie Erkennungsergebnisse anhand gemeinsamer Attribute wie Hostname oder Nutzername gruppieren und die aggregierten Daten analysieren. Im Folgenden sind einige gängige Anwendungsfälle aufgeführt:
- Nutzer identifizieren, die eine große Anzahl von Sicherheitswarnungen oder ein hohes aggregiertes Risiko verursachen.
- Hosts mit ungewöhnlichen Aktivitätsmustern werden erkannt, indem zugehörige Erkennungen zusammengefasst werden.
Beispiel für die Risikoaggregation:
rule composite_risk_aggregation {
meta:
rule_name = "Risk Aggregation Composite"
author = "Google Cloud Security"
description = "Composite detection that aggregates risk of a user over 48 hours"
severity = "High"
events:
$rule_name = $d.detection.detection.rule_name
$principal_user = $d.detection.detection.outcomes["principal_users"]
$risk = $d.detection.detection.risk_score
match:
$principal_user over 48h
outcome:
$risk_score = 90
$cumulative_risk = sum($risk)
$principal_users = array_distinct($principal_users)
$upstream_rules = array_distinct($rule_name)
condition:
$d and $cumulative_risk > 500
}
Beispiel für die Zusammenfassung von Taktiken:
rule composite_tactic_aggregation {
meta:
rule_name = "MITRE Tactic Aggregation Composite"
author = "Google Cloud Security"
description = "Composite detection that detects if a user has triggered detections over multiple mitre tactics."
severity = "Medium"
events:
$principal_user = $d.detection.detection.outcomes["principal_users"]
$tactic = $d.detection.detection.rule_labels["tactic"]
$rule_name = $d.detection.detection.rule_name
match:
$principal_user over 48h
outcome:
$mitre_tactics_count = count_distinct($tactic)
$mitre_tactics = array_distinct($d.detection.rule_labels["tactic"])
$risk_score = min(100, (50+15*$mitre_tactics_count))
$upstream_rules = array_distinct($rule_name)
condition:
$d and $mitre_tactics_count > 1
}
Sequenzielle zusammengesetzte Erkennungen
Bei sequenziellen zusammengesetzten Erkennungen werden Muster von zusammenhängenden Ereignissen erkannt, 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 Basis-Erkennungen oder eine Kombination aus Basis-Erkennungen und Ereignissen umfassen.
rule composite_bruteforce_login {
meta:
rule_name = "Bruteforce Login Composite"
author = "Google Cloud Security"
description = "Detects when an IP address associated with a Workspace brute force attempt successfully logs in"
severity = "High"
events:
$bruteforce_detection.detection.detection.rule_name = /Workspace Anomalous Failed Logins/
$bruteforce_ip = $d.detection.detection.outcomes["principal_ips"]
$login_event.metadata.product_name = "login"
$login_event.metadata.product_event_type = "login_success"
$login_event.metadata.vendor_name = "Google Workspace"
$login_ip = $login_event.principal.ip
// Ensure the brute force detection and successful login occurred from the same IP
$login_ip = $bruteforce_ip
$target_account = $login_event.target.user.email_addresses
// Ensure the brute force detection occurred before the successful login
$bruteforce_detection.detection.detection_time.seconds < $login_event.metadata.event_timestamp.seconds
match:
$bruteforce_ip over 24h
outcome:
$risk_score = 90
$principal_users = array_distinct($target_account)
condition:
$bruteforce_detection and $login_event
}
Kontextsensitive Erkennungen
Kontextsensitive zusammengesetzte Erkennungen werden mit zusätzlichem Kontext angereichert, z. B. mit IP-Adressen, die in Threat-Feeds gefunden wurden.
rule composite_tor_enrichment {
meta:
rule_name = "Detection with IP from TOR Feed"
author = "Google Cloud Security"
description = "Adds additional context from the TOR intel feed to detections"
severity = "High"
events:
$detection_ip = $d.detection.detection.outcomes["principal_ips"]
$gcti.graph.metadata.entity_type = "IP_ADDRESS"
$gcti.graph.metadata.vendor_name = "Google Cloud Threat Intelligence"
$gcti_feed.graph.metadata.source_type = "GLOBAL_CONTEXT"
$gcti.graph.metadata.product_name = "GCTI Feed"
$gcti.graph.metadata.threat.threat_feed_name = "Tor Exit Nodes"
$detection_ip = $gcti.graph.entity.ip
$rule_name = $d.detection.detection.rule_name
$risk = $d.detection.detection.outcomes["risk_score"]
match:
$detection_ip, $rule_name over 1h
outcome:
$risk_score = 80
$upstream_rule = array_distinct($rule_name)
condition:
$d and $gcti
}
Erkennung von gemeinsam auftretenden Begriffen
Zusammengesetzte Co-occurrence-Erkennungen sind eine Form der Aggregation, mit der eine Kombination aus zusammengehörigen Ereignissen erkannt werden kann, z. B. eine Kombination aus Erkennungen von Berechtigungseskalierung und Datenexfiltration, die von einem Nutzer ausgelöst werden.
rule composite_privesc_exfil_sequential {
meta:
rule_name = "Privilege Escalation and Exfiltration Composite"
author = "Google Cloud Security"
description = "Looks for a detection sequence of privilege escalation followed by exfiltration."
severity = "High"
events:
$privilege_escalation.detection.detection.rule_labels["tactic"] = "TA0004"
$exfiltration.detection.detection.rule_labels["tactic"] = "TA0010"
$pe_user = $privilege_escalation.detection.detection.outcomes["principal_users"]
$ex_user = $exfiltration.detection.detection.outcomes["principal_users"]
$pe_user = $ex_user
match:
$pe_user over 48h
outcome:
$risk_score = 75
$privesc_rules = array_distinct($privilege_escalation.detection.detection.rule_name)
$exfil_rules = array_distinct($exfiltration.detection.detection.rule_name)
condition:
$privilege_escalation and $exfiltration
}
Beispiel für eine Regel für ein gleitendes Fenster
Im folgenden YARA-L 2.0-Beispiel für ein Fenster mit Text wird nach dem Fehlen von firewall_2
-Ereignissen nach firewall_1
-Ereignissen gesucht. Das Keyword after
wird mit der Pivot-Ereignisvariablen $e1
verwendet, um anzugeben, dass bei der Korrelation von Ereignissen nur 10-Minuten-Zeiträume nach jedem firewall_1
-Ereignis berücksichtigt werden sollen.
rule SlidingWindowRuleExample {
meta:
author = "alice@example.com"
events:
$e1.metadata.product_name = "firewall_1"
$e1.principal.hostname = $host
$e2.metadata.product_name = "firewall_2"
$e2.principal.hostname = $host
match:
$host over 10m after $e1
condition:
$e1 and !$e2
}
Beispiel für den Ausschluss von Nullwerten
Die Rules Engine filtert die Nullwerte für alle Platzhalter, die im Abschnitt match
verwendet werden, implizit heraus.
Weitere Informationen finden Sie im Abschnitt Umgang mit Nullwerten.match
Dies kann mit der Option allow_zero_values
deaktiviert werden, wie unter allow_zero_values beschrieben.
Bei anderen referenzierten Ereignisfeldern werden Nullwerte jedoch nicht ausgeschlossen, sofern Sie solche Bedingungen nicht explizit angeben.
rule ExcludeZeroValues {
meta:
author = "alice@example.com"
events:
$e1.metadata.event_type = "NETWORK_DNS"
$e1.principal.hostname = $hostname
// $e1.principal.user.userid may be empty string.
$e1.principal.user.userid != "Guest"
$e2.metadata.event_type = "NETWORK_HTTP"
$e2.principal.hostname = $hostname
// $e2.target.asset_id cannot be empty string as explicitly specified.
$e2.target.asset_id != ""
match:
// $hostname cannot be empty string. The rule behaves as if the
// predicate, `$hostname != ""` was added to the events section, because
// `$hostname` is used in the match section.
$hostname over 1h
condition:
$e1 and $e2
}
Beispiel für eine Regel mit dem Abschnitt outcome
Sie können den optionalen Abschnitt outcome
in einer YARA-L 2.0-Regel hinzufügen, um zusätzliche Informationen zu den einzelnen Erkennungen zu extrahieren. Im Abschnitt „Bedingung“ können Sie auch Bedingungen für Ergebnisvariablen angeben. Im Abschnitt outcome
einer Erkennungsregel können Sie Variablen für die nachgelagerte Verwendung festlegen. Sie können beispielsweise einen Schweregrad auf Grundlage der Daten aus den analysierten Ereignissen festlegen.
Hier finden Sie weitere Informationen:
Regel mit mehreren Ereignissen und Ergebnisabschnitt:
In der folgenden Regel werden zwei Ereignisse berücksichtigt, um den Wert von $hostname
zu ermitteln. Wenn der Wert von $hostname
über einen Zeitraum von 5 Minuten übereinstimmt, wird eine Schweregradbewertung angewendet. Wenn Sie im Abschnitt match
einen Zeitraum angeben, wird die Regel innerhalb des angegebenen Zeitraums geprüft.
rule OutcomeRuleMultiEvent {
meta:
author = "Google Cloud Security"
events:
$u.udm.principal.hostname = $hostname
$asset_context.graph.entity.hostname = $hostname
$severity = $asset_context.graph.entity.asset.vulnerabilities.severity
match:
$hostname over 5m
outcome:
$risk_score =
max(
100
+ if($hostname = "my-hostname", 100, 50)
+ if($severity = "HIGH", 10)
+ if($severity = "MEDIUM", 5)
+ if($severity = "LOW", 1)
)
$asset_id_list =
array(
if($u.principal.asset_id = "",
"Empty asset id",
$u.principal.asset_id
)
)
$asset_id_distinct_list = array_distinct($u.principal.asset_id)
$asset_id_count = count($u.principal.asset_id)
$asset_id_distinct_count = count_distinct($u.principal.asset_id)
condition:
$u and $asset_context and $risk_score > 50 and not arrays.contains($asset_id_list, "id_1234")
}
rule OutcomeRuleMultiEvent {
meta:
author = "alice@example.com"
events:
$u.udm.principal.hostname = $hostname
$asset_context.graph.entity.hostname = $hostname
$severity = $asset_context.graph.entity.asset.vulnerabilities.severity
match:
$hostname over 5m
outcome:
$total_network_bytes = sum($u.network.sent_bytes) + sum($u.network.received_bytes)
$risk_score = if(total_network_bytes > 1024, 100, 50) +
max(
if($severity = "HIGH", 10)
+ if($severity = "MEDIUM", 5)
+ if($severity = "LOW", 1)
)
$asset_id_list =
array(
if($u.principal.asset_id = "",
"Empty asset id",
$u.principal.asset_id
)
)
$asset_id_distinct_list = array_distinct($u.principal.asset_id)
$asset_id_count = count($u.principal.asset_id)
$asset_id_distinct_count = count_distinct($u.principal.asset_id)
condition:
$u and $asset_context and $risk_score > 50 and not arrays.contains($asset_id_list, "id_1234")
}
Regel für ein einzelnes Ereignis mit Ergebnisbereich:
rule OutcomeRuleSingleEvent {
meta:
author = "alice@example.com"
events:
$u.metadata.event_type = "FILE_COPY"
$u.principal.file.size = $file_size
$u.principal.hostname = $hostname
outcome:
$suspicious_host = $hostname
$admin_severity = if($u.principal.userid in %admin_users, "SEVERE", "MODERATE")
$severity_tag = if($file_size > 1024, $admin_severity, "LOW")
condition:
$u
}
Umgestaltung einer Regel für mehrere Ereignisse in eine Regel für ein einzelnes Ereignis.
Sie können den Bereich outcome
sowohl für Einzelereignisregeln (Regeln ohne match
-Bereich) als auch für Mehrfachereignisregeln (Regeln mit match
-Bereich) verwenden.
Wenn Sie zuvor eine Regel für mehrere Ereignisse erstellt haben, nur um den Ergebnisbereich verwenden zu können, können Sie diese Regeln optional umgestalten, indem Sie den Abschnitt match
löschen, um die Leistung zu verbessern. Da Ihre Regel keinen match
-Abschnitt mehr enthält, in dem die Gruppierung angewendet wird, erhalten Sie möglicherweise mehr Erkennungen. Diese Umgestaltung ist nur für Regeln möglich, die eine Ereignisvariable verwenden, wie im folgenden Beispiel gezeigt.
Regel für mehrere Ereignisse, in der nur eine Ereignisvariable verwendet wird (gute Kandidatin für eine Umgestaltung):
rule OutcomeMultiEventPreRefactor {
meta:
author = "alice@example.com"
description = "Outcome refactor rule, before the refactor"
events:
$u.udm.principal.hostname = $hostname
match:
$hostname over 5m
outcome:
$risk_score = max(if($hostname = "my-hostname", 100, 50))
condition:
$u
}
Sie können die Regel umgestalten, indem Sie den Abschnitt match
löschen. Sie müssen das Aggregat auch im Bereich outcome
entfernen, da die Regel jetzt ein einzelnes Ereignis ist. Weitere Informationen zu Aggregationen finden Sie unter Ergebnisaggregationen.
rule OutcomeSingleEventPostRefactor {
meta:
author = "alice@example.com"
description = "Outcome refactor rule, after the refactor"
events:
$u.udm.principal.hostname = $hostname
// We deleted the match section.
outcome:
// We removed the max() aggregate.
$risk_score = if($hostname = "my-hostname", 100, 50)
condition:
$u
}
Beispiel für eine Regel für die Funktion zum Platzhalter
Sie können dem Ergebnis eines Funktionsaufrufs eine Platzhaltervariable zuweisen und diese in anderen Abschnitten der Regel verwenden, z. B. im Abschnitt match
, outcome
oder condition
. Sehen Sie sich folgendes Beispiel an:
rule FunctionToPlaceholderRule {
meta:
author = "alice@example.com"
description = "Rule that uses function to placeholder assignments"
events:
$u.metadata.event_type = "EMAIL_TRANSACTION"
// Use function-placeholder assignment to extract the
// address from an email.
// address@website.com -> address
$email_to_address_only = re.capture($u.network.email.from , "(.*)@")
// Use function-placeholder assignment to normalize an email:
// uid@??? -> uid@company.com
$email_from_normalized = strings.concat(
re.capture($u.network.email.from , "(.*)@"),
"@company.com"
)
// Use function-placeholder assignment to get the day of the week of the event.
// 1 = Sunday, 7 = Saturday.
$dayofweek = timestamp.get_day_of_week($u.metadata.event_timestamp.seconds)
match:
// Use placeholder (from function-placeholder assignment) in match section.
// Group by the normalized from email, and expose it in the detection.
$email_from_normalized over 5m
outcome:
// Use placeholder (from function-placeholder assignment) in outcome section.
// Assign more risk if the event happened on weekend.
$risk_score = max(
if($dayofweek = 1, 10, 0) +
if($dayofweek = 7, 10, 0)
)
condition:
// Use placeholder (from function-placeholder assignment) in condition section.
// Match if an email was sent to multiple addresses.
#email_to_address_only > 1
}
Beispielregel für Ergebnisbedingungen
Im Abschnitt condition
können Sie Ergebnisvariablen verwenden, die im Abschnitt outcome
definiert wurden. Im folgenden Beispiel wird gezeigt, wie Sie mithilfe von Ergebnisbedingungen nach Risikobewertungen filtern, um das Rauschen bei Erkennungen zu reduzieren.
rule OutcomeConditionalRule {
meta:
author = "alice@example.com"
description = "Rule that uses outcome conditionals"
events:
$u.metadata.event_type = "FILE_COPY"
$u.principal.file.size = $file_size
$u.principal.hostname = $hostname
// 1 = Sunday, 7 = Saturday.
$dayofweek = timestamp.get_day_of_week($u.metadata.collected_timestamp.seconds)
outcome:
$risk_score =
if($file_size > 500*1024*1024, 2) + // Files 500MB are moderately risky
if($file_size > 1024*1024*1024, 3) + // Files over 1G get assigned extra risk
if($dayofweek=1 or $dayofweek=7, 4) + // Events from the weekend are suspicious
if($hostname = /highly-privileged/, 5) // Check for files from highly privileged devices
condition:
$u and $risk_score >= 10
}
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten