Suchsyntax verstehen

Unterstützt in:

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:

  • additional Felder: Können mehrere Schlüssel/Wert-Paare pro Ereignis (additional.fields["key"] = "value") enthalten.

  • labels fields: 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_.*/ nocase
    
  • Boolesche oder numerische Werte in benutzerdefinierten Feldern abgleichen:

    additional.fields.value.bool_value = true additional.fields.value.number_value > 500
    
  • Suche 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 nocase direkt mit der Klammersyntax:

    additional.fields["pod_name"] = /br/
    additional.fields["pod_name"] = bar nocase
    
  • Kombinieren Sie mehrere additional.fields-Schlüssel/Wert-Paare mit AND:

    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_domain
about.asset.network_domain
network.dns.questions.name
network.dns_domain
principal.administrative_domain
principal.asset.network_domain
target.administrative_domain
target.asset.hostname
target.asset.network_domain
target.hostname
email intermediary.user.email_addresses
network.email.from
network.email.to
principal.user.email_addresses
security_result.about.user.email_addresses
target.user.email_addresses
file_path principal.file.full_path
principal.process.file.full_path
principal.process.parent_process.file.full_path
target.file.full_path
target.process.file.full_path
target.process.parent_process.file.full_path
hash about.file.md5
about.file.sha1
about.file.sha256
principal.process.file.md5
principal.process.file.sha1
principal.process.file.sha256
security_result.about.file.sha256
target.file.md5
target.file.sha1
target.file.sha256
target.process.file.md5
target.process.file.sha1
target.process.file.sha256
hostname intermediary.hostname
observer.hostname
principal.asset.hostname
principal.hostname
src.asset.hostname
src.hostname
target.asset.hostname
target.hostname
ip intermediary.ip
observer.ip
principal.artifact.ip
principal.asset.ip
principal.ip
src.artifact.ip
src.asset.ip
src.ip
target.artifact.ip
target.asset.ip
target.ip
namespace principal.namespace
src.namespace
target.namespace
process_id principal.process.parent_process.pid
principal.process.parent_process.product_specific_process_id
principal.process.pid
principal.process.product_specific_process_id
target.process.parent_process.pid
target.process.parent_process.product_specific_process_id
target.process.pid
target.process.product_specific_process_id
user about.user.userid
observer.user.userid
principal.user.user_display_name
principal.user.userid
principal.user.windows_sid
src.user.userid
target.user.user_display_name
target.user.userid
target.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