Suchsyntax verstehen
Dieser Leitfaden richtet sich an Sicherheitsanalysten, die Suchausdrücke (Datenwerte, Escapes, Operatoren usw.) im Abfrageeditor der SIEM-Suchseite konfigurieren möchten.
Wenn Sie YARA-L 2.0- oder SQL-Suchausdrücke im Abfrageeditor von Google Security Operations schreiben, müssen Sie Ihre Datenwerte, Operatoren und String-Escape-Sequenzen genau nach dem Datentyp des Ziel-UDM-Felds formatieren. Eine Suchbedingung besteht aus einem UDM-Feldnamen, einem Vergleichsoperator (=, !=, >, <, <=, >=) und einem formatierten Datenwert.
Datenwerte nach Datentyp formatieren
In diesem Abschnitt wird Folgendes beschrieben:
Aufzählungswerte (Enums)
Enums müssen als Textstrings in Großbuchstaben geschrieben werden, die genau mit gültigen UDM-Wörterbuchdefinitionen übereinstimmen und in doppelte Anführungszeichen (") gesetzt sind, wie im folgenden Beispiel:
metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"
Boolesche Werte
Boolesche Felder akzeptieren „true“ oder „false“ (Groß-/Kleinschreibung wird nicht berücksichtigt, keine Anführungszeichen erforderlich), wie im folgenden Beispiel:
network.dns.response = true target.user.is_admin = false
Ganzzahlen und numerische Werte
Ganzzahlen und Portnummern werden als Literalziffern ohne doppelte Anführungszeichen geschrieben, wie im folgenden Beispiel:
target.port = 443 network.sent_bytes > 10485760
Gleitkomma- und Dezimalwerte
Geben Sie für UDM-Felder vom Typ „Float“ oder „Double“ eine Dezimalzahl oder Ganzzahl ohne doppelte Anführungszeichen ein, wie im folgenden Beispiel:
security_result.about.asset.vulnerabilities.cvss_base_score = 9.8
Text strings
Standardtextwerte müssen in doppelte Anführungszeichen (") gesetzt werden, wie im folgenden Beispiel:
metadata.product_name = "Google Cloud VPC Flow Logs" target.asset.asset_id = "srv-prod-us-central1-a"
Übereinstimmungen ohne Beachtung der Groß-/Kleinschreibung (nocase)
Standardmäßig wird bei Stringvergleichen in YARA-L 2.0 die Groß-/Kleinschreibung beachtet. Wenn Sie eine beliebige Kombination aus Groß- und Kleinbuchstaben abgleichen möchten, hängen Sie den Operator nocase direkt am Ende der Bedingung an, wie im folgenden Beispiel:
principal.hostname != "http-server" nocase principal.user.userid = "jdoe" nocase
String-Escaping (\ und ")
Wenn ein Stringliteral Backslashes oder doppelte Anführungszeichen enthält, müssen Sie diese Zeichen mit einem vorangestellten Backslash (\\) maskieren, wie im folgenden Beispiel:
- Verwenden Sie
\\, um einen literalen Backslash (\\) abzugleichen. Verwenden Sie
\", um ein literales doppeltes Anführungszeichen (") abzugleichen.Suchen Sie nach Windows-Dateipfaden mit maskierten Backslashes:
principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"Suchen Sie nach Befehlszeilen, die eingebettete doppelte Anführungszeichen enthalten:
target.process.command_line = "cmd.exe /c \"c:\\program files\\malicious.exe\""
Reguläre Ausdrücke (RE2-Syntax)
Wenn Sie mit regulären Ausdrücken suchen möchten, setzen Sie das Regex-Muster in Schrägstriche (/ /) statt in doppelte Anführungszeichen. Google SecOps verwendet die standardmäßige RE2-Engine für reguläre Ausdrücke:
Alle Hauptkonto-IP-Adressen im Bereich 10.x.x.x abgleichen, z. B.:
principal.ip = /10\..*/Suchen Sie nach der Ausführung von PsExec mit der optionalen Erweiterung
.exe, wobei die Groß-/Kleinschreibung nicht berücksichtigt wird, wie im folgenden Beispiel:target.process.command_line = /\bpsexec(\.exe)?\b/ nocaseÜbereinstimmung mit dynamischen DNS-Hostnamen nach einem nummerierten Muster, wie im folgenden Beispiel:
principal.hostname = /dns-server-[0-9]+/ nocase
Boolesche Logik und Operatorrangfolge
Kombinieren Sie mehrere Suchbedingungen mit den Operatoren AND, OR und NOT. Sie können Klammern () verwenden, um Ausdrücke explizit zu gruppieren und die Auswertungsreihenfolge zu steuern, wie in den folgenden Beispielen gezeigt:
Suchen Sie nach bestimmten Nutzeranmeldeereignissen auf einem sensiblen Host, wie im folgenden Beispiel:
metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"Verwenden Sie Klammern, um ODER-Bedingungen von UND-Ketten zu trennen, wie im folgenden Beispiel:
metadata.event_type = "PROCESS_LAUNCH" AND principal.process.file.full_path = /winword.exe/ nocase AND (target.process.file.full_path = /cmd.exe/ OR target.process.file.full_path = /powershell.exe/)
In den Feldern additional und labels nach Schlüssel/Wert-Paaren suchen
Die Felder additional und labels dienen als flexible Container für benutzerdefinierte Ereignisdaten und Attribute von Drittanbietern, die nicht den Standard-UDM-Feldern zugeordnet werden können. In jedem Eintrag wird ein Schlüssel/Wert-Paar gespeichert:
additionalFelder: Können mehrere Schlüssel/Wert-Paare pro Ereignis (additional.fields["key"] = "value") enthalten.labelsfields: Kann nur ein Schlüssel/Wert-Paar pro Ereignis (labels["key"] = "value") enthalten.
Genaue Schlüssel/Wert-Übereinstimmung (field["key"] = "value")
Verwenden Sie die Klammersyntax, um einen bestimmten Schlüssel und den entsprechenden Stringwert direkt abzufragen, wie im folgenden Beispiel:
additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"
Erweiterter Abgleich von regulären Ausdrücken und Nicht-String-Werten in additional-Feldern
Wenn Sie numerische/boolesche Werte in additional-Feldern abfragen oder Schlüssel und Werte mithilfe von regulären Ausdrücken abgleichen müssen, verwenden Sie den voll qualifizierten Protobuf-Feldpfad:
Übereinstimmung mit einem beliebigen Wertstring im zusätzlichen Container per Regex:
additional.fields.value.string_value = /suspicious_payload_.*/ nocaseBoolesche oder numerische Werte in benutzerdefinierten Feldern abgleichen:
additional.fields.value.bool_value = true additional.fields.value.number_value > 500Suche nach mehreren dynamischen Schlüsseln, die mit einem Regex-Präfix übereinstimmen:
additional.fields.key = /^myKeyNumber_.*/Prüfen Sie, ob ein Schlüssel unabhängig vom Wert vorhanden ist:
additional.fields["pod_name"] != ""Verwenden Sie reguläre Ausdrücke und
nocasedirekt mit der Klammersyntax:additional.fields["pod_name"] = /br/ additional.fields["pod_name"] = bar nocaseKombinieren Sie mehrere
additional.fields-Schlüssel/Wert-Paare mitAND:additional.fields["pod_name"] = "kube-scheduler" AND additional.fields["namespace"] = "kube-system"
Gruppierte Felder durchsuchen
Gruppierte Felder sind Aliasse für Gruppen verwandter UDM-Felder. Sie können damit mehrere UDM-Felder gleichzeitig abfragen, ohne jedes Feld einzeln eingeben zu müssen.
Das folgende Beispiel zeigt, wie Sie eine Abfrage eingeben, die mit den gängigen UDM-Feldern übereinstimmt, die die angegebene IP-Adresse enthalten könnten:
ip = "1.2.3.4"
Sie können ein gruppiertes Feld mit einem regulären Ausdruck und dem Operator nocase abgleichen. Referenzlisten werden ebenfalls unterstützt. Gruppierte Felder können auch in Kombination mit regulären UDM-Feldern verwendet werden, wie im folgenden Beispiel gezeigt:
ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"
Typen von gruppierten UDM-Feldern
Sie können in allen folgenden gruppierten UDM-Feldern suchen:
| Name des gruppierten Felds | Zugehörige UDM-Felder |
|---|---|
domain |
about.administrative_domainabout.asset.network_domainnetwork.dns.questions.namenetwork.dns_domainprincipal.administrative_domainprincipal.asset.network_domaintarget.administrative_domaintarget.asset.hostnametarget.asset.network_domaintarget.hostname |
email |
intermediary.user.email_addressesnetwork.email.fromnetwork.email.toprincipal.user.email_addressessecurity_result.about.user.email_addressestarget.user.email_addresses |
file_path |
principal.file.full_pathprincipal.process.file.full_pathprincipal.process.parent_process.file.full_pathtarget.file.full_pathtarget.process.file.full_pathtarget.process.parent_process.file.full_path |
hash |
about.file.md5about.file.sha1about.file.sha256principal.process.file.md5principal.process.file.sha1principal.process.file.sha256security_result.about.file.sha256target.file.md5target.file.sha1target.file.sha256target.process.file.md5target.process.file.sha1target.process.file.sha256 |
hostname |
intermediary.hostnameobserver.hostnameprincipal.asset.hostnameprincipal.hostnamesrc.asset.hostnamesrc.hostnametarget.asset.hostnametarget.hostname |
ip |
intermediary.ipobserver.ipprincipal.artifact.ipprincipal.asset.ipprincipal.ipsrc.artifact.ipsrc.asset.ipsrc.iptarget.artifact.iptarget.asset.iptarget.ip |
namespace |
principal.namespacesrc.namespacetarget.namespace |
process_id |
principal.process.parent_process.pidprincipal.process.parent_process.product_specific_process_idprincipal.process.pidprincipal.process.product_specific_process_idtarget.process.parent_process.pidtarget.process.parent_process.product_specific_process_idtarget.process.pidtarget.process.product_specific_process_id |
user |
about.user.useridobserver.user.useridprincipal.user.user_display_nameprincipal.user.useridprincipal.user.windows_sidsrc.user.useridtarget.user.user_display_nametarget.user.useridtarget.user.windows_sid |
Kommentare in einer Abfrage hinzufügen
Sie können im Such-Editor Kommentare hinzufügen, um komplexe Hunting-Logik zu dokumentieren oder Bedingungen während des Tests vorübergehend zu deaktivieren:
- Einzeilige Kommentare: Stellen Sie dem Kommentartext zwei Schrägstriche (
//) voran. Alles, was in dieser Zeile nach den Schrägstrichen steht, wird ignoriert. - Mehrzeilige Blockkommentare: Setzen Sie den Kommentartext zwischen
/*und*/. Blockkommentare können sich über mehrere Zeilen erstrecken.
Beispiel:
metadata.event_type = "NETWORK_CONNECTION" AND
// Exclude approved corporate proxy traffic
target.ip != "192.0.2.100" AND
/* Uncomment the lines below when investigating specific lateral
movement across subnet 10.240.0.0/16 */
// principal.ip = /10.240\..*/ AND
// network.sent_bytes > 5000000
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten