Suchsyntax verstehen

Unterstützt in:

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/ nocase
    
  • Dynamische 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:

  • additional fields: Kann 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“)

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_.*/ nocase
    
  • Boolesche 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 nocase direkt mit der Klammersyntax verwenden:

    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"
    

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_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 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