Suchsyntax verstehen
Diese Anleitung richtet sich an Sicherheitsanalysten, die Suchausdrücke (Datenwerte, Escapes, Operatoren usw.) im Abfrageeditor der Seite SIEM-Suche konfigurieren möchten.
Wenn Sie YARA-L 2.0- oder SQL-Suchausdrücke im Google Security Operations-Abfrageeditor schreiben, müssen Sie Ihre Datenwerte, Operatoren und String-Escape-Sequenzen entsprechend dem genauen 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:
Aufgezählte Werte (Enums)
Enums müssen als Textstrings in Großbuchstaben geschrieben werden, die genau mit gültigen UDM-Wörterbuchdefinitionen übereinstimmen und in doppelten Anführungszeichen (") stehen, wie im folgenden Beispiel:
metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"
Boolesche Werte
Für boolesche Felder sind „true“ oder „false“ zulässig (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 an das 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 Backslash (\\) abzugleichen. Verwenden Sie
\", um ein wörtliches doppeltes Anführungszeichen (") abzugleichen.Suchen Sie nach Windows-Dateipfaden mit Escapezeichen für Backslashes:
principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"Nach Befehlszeilen mit eingebetteten doppelten Anführungszeichen suchen:
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 zwischen Schrägstriche (/ /) anstelle von doppelten Anführungszeichen. Google SecOps verwendet die Standard-Engine für reguläre RE2-Ausdrücke:
Alle Haupt-IP-Adressen im Bereich 10.x.x.x abgleichen:
principal.ip = /10\..*/Suchen Sie nach der Ausführung von PsExec mit der optionalen Erweiterung
.exe(Groß-/Kleinschreibung wird nicht beachtet), wie im folgenden Beispiel:target.process.command_line = /\bpsexec(\.exe)?\b/ nocaseDynamische DNS-Hostnamen, die einem nummerierten Muster folgen, wie im folgenden Beispiel:
principal.hostname = /dns-server-[0-9]+/ nocase
Boolesche Logik und Operatorvorrang
Kombinieren Sie mehrere Suchbedingungen mit den Operatoren AND, OR und NOT. Sie können Ausdrücke explizit mit Klammern () gruppieren und die Auswertungsreihenfolge festlegen, 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 OR-Bedingungen von AND-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/)
Nach Schlüssel/Wert-Paaren in den Feldern additional und labels 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. In jedem Eintrag wird ein Schlüssel/Wert-Paar gespeichert:
additionalfields: Kann 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“)
Mit der Klammersyntax können Sie einen bestimmten Schlüssel und den entsprechenden Stringwert direkt abfragen, wie im folgenden Beispiel:
additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"
Erweiterter Regex-Abgleich und Abgleich von Nicht-String-Werten in additional-Feldern
Wenn Sie numerische/boolesche Werte in additional-Feldern abfragen oder Schlüssel und Werte mit regulären Ausdrücken abgleichen müssen, verwenden Sie den vollständig qualifizierten Protobuf-Feldpfad:
Beliebigen Wertstring im zusätzlichen Container mit einem regulären Ausdruck abgleichen:
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 > 500Über mehrere dynamische Schlüssel suchen, die mit einem regulären Ausdruck übereinstimmen:
additional.fields.key = /^myKeyNumber_.*/Prüfen, ob ein Schlüssel unabhängig vom Wert vorhanden ist:
additional.fields["pod_name"] != ""Sie können reguläre Ausdrücke und
nocasedirekt mit der Klammersyntax verwenden: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"
Nach gruppierten Feldern suchen
Gruppierte Felder sind Aliase 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, um die gängigen UDM-Felder zu finden, 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 gruppierter UDM-Felder
Sie können in allen folgenden gruppierten UDM-Feldern suchen:
| Name des gruppierten Felds | Zugeordnete 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 Sucheditor Kommentare hinzufügen, um komplexe Suchlogik 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