Informazioni sulla sintassi di ricerca

Supportata in:

Questa guida è rivolta agli analisti della sicurezza che vogliono configurare espressioni di ricerca (valori dei dati, escape, operatori e così via) nell'editor di query della pagina di ricerca SIEM.

Quando scrivi espressioni di ricerca YARA-L 2.0 o SQL nell'editor di query di Google Security Operations, devi formattare i valori dei dati, gli operatori e le sequenze di escape delle stringhe in base al tipo di dati esatto del campo UDM di destinazione. Una condizione di ricerca è costituita da un nome di campo UDM, un operatore di confronto (=, !=, >, <, <=, >=) e un valore di dati formattato.

Formatta i valori dei dati in base al tipo di dati

Questa sezione descrive quanto segue:

Valori enumerati (enum)

Gli enum devono essere scritti come stringhe di testo in maiuscolo che corrispondono esattamente alle definizioni del dizionario UDM valide, racchiuse tra virgolette doppie ("), come nell'esempio seguente:

metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"

Valori booleani

I campi booleani accettano true o false (senza distinzione tra maiuscole e minuscole, non sono necessarie virgolette), come nell'esempio seguente:

network.dns.response = true target.user.is_admin = false

Numeri interi e valori numerici

I numeri interi e i numeri di porta vengono scritti come cifre letterali senza virgolette doppie, come nell'esempio seguente:

target.port = 443 network.sent_bytes > 10485760

Valori in virgola mobile e decimali

Per i campi UDM di tipo float o double, inserisci un numero decimale o un numero intero senza virgolette doppie, come nell'esempio seguente:

security_result.about.asset.vulnerabilities.cvss_base_score = 9.8

Stringhe di testo

I valori di testo standard devono essere racchiusi tra virgolette doppie ("), come nell'esempio seguente:

metadata.product_name = "Google Cloud VPC Flow Logs" target.asset.asset_id = "srv-prod-us-central1-a"

Corrispondenza senza distinzione tra maiuscole e minuscole (nocase)

Per impostazione predefinita, i confronti delle stringhe in YARA-L 2.0 sono sensibili alle maiuscole. Per trovare una corrispondenza con qualsiasi combinazione di caratteri maiuscoli e minuscoli, aggiungi l'operatore nocase direttamente alla fine della condizione, come nell'esempio seguente:

principal.hostname != "http-server" nocase principal.user.userid = "jdoe" nocase

Escape di stringhe (\ e ")

Se una stringa letterale contiene barre rovesciate o virgolette doppie, devi eseguire l'escape di questi caratteri utilizzando una barra rovesciata iniziale (\\), come nell'esempio seguente:

  • Utilizza \\ per trovare una barra rovesciata letterale (\\).
  • Utilizza \" per trovare una virgoletta doppia letterale (").

  • Cerca i percorsi dei file Windows con barre rovesciate con escape:

    principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
    
  • Cerca righe di comando contenenti virgolette doppie incorporate:

    target.process.command_line = "cmd.exe /c \"c:\\program files\\malicious.exe\""
    

Espressioni regolari (sintassi RE2)

Per eseguire una ricerca utilizzando le espressioni regolari, racchiudi il pattern regex tra barre (/ /) anziché tra virgolette doppie. Google SecOps utilizza il motore di espressioni regolari RE2 standard:

  • Trova qualsiasi IP principale compreso nell'intervallo 10.x.x.x, ad esempio:

    principal.ip = /10\..*/
    
  • Cerca l'esecuzione di PsExec con l'estensione .exe facoltativa, senza distinzione tra maiuscole e minuscole, come nell'esempio seguente:

    target.process.command_line = /\bpsexec(\.exe)?\b/ nocase
    
  • Trova i nomi host DNS dinamici che seguono un pattern numerato, come nell'esempio seguente:

    principal.hostname = /dns-server-[0-9]+/ nocase
    

Logica booleana e precedenza degli operatori

Combina più condizioni di ricerca utilizzando gli operatori AND, OR e NOT. Puoi utilizzare le parentesi () per raggruppare esplicitamente le espressioni e controllare la precedenza di valutazione, come mostrato nei seguenti esempi:

  • Cerca eventi di accesso utente specifici su un host sensibile, come nell'esempio seguente:

    metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"
    
    
  • Utilizza le parentesi per isolare le condizioni OR dalle catene AND, come nell'esempio seguente:

    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/)
    

Cerca coppie chiave-valore nei campi additional e labels

I campi additional e labels fungono da contenitori flessibili per i dati sugli eventi personalizzati e gli attributi dei fornitori di terze parti che non vengono mappati ai campi UDM standard. Ogni voce memorizza una coppia chiave-valore:

  • additional fields: può contenere più coppie chiave-valore per evento (additional.fields["key"] = "value").

  • labels fields: può contenere una sola coppia chiave-valore per evento (labels["key"] = "value").

Corrispondenza esatta della coppia chiave-valore (field["key"] = "value")

Utilizza la sintassi tra parentesi per eseguire query direttamente su una chiave specifica e sul valore della stringa corrispondente, come nell'esempio seguente:

additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"

Regex avanzate e corrispondenza di valori non stringa nei campi additional

Se devi eseguire query su valori numerici/booleani all'interno dei campi additional o trovare corrispondenze di chiavi e valori utilizzando espressioni regolari, utilizza il percorso completo del campo protobuf:

  • Trova qualsiasi stringa di valore all'interno del contenitore aggiuntivo tramite regex:

    additional.fields.value.string_value = /suspicious_payload_.*/ nocase
    
  • Trova valori booleani o numerici all'interno di campi personalizzati:

    additional.fields.value.bool_value = true additional.fields.value.number_value > 500
    
  • Cerca in più chiavi dinamiche corrispondenti a un prefisso di espressione regolare:

    additional.fields.key = /^myKeyNumber_.*/
    
  • Controlla se esiste una chiave indipendentemente dal valore:

    additional.fields["pod_name"] != ""
    
  • Utilizza le espressioni regolari e nocase direttamente con la sintassi tra parentesi:

    additional.fields["pod_name"] = /br/
    additional.fields["pod_name"] = bar nocase
    
  • Combina più coppie chiave-valore additional.fields utilizzando AND:

    additional.fields["pod_name"] = "kube-scheduler" AND additional.fields["namespace"] = "kube-system"
    

Cerca nei campi raggruppati

I campi raggruppati sono alias per gruppi di campi UDM correlati. Puoi utilizzarli per eseguire query su più campi UDM contemporaneamente senza digitare ogni campo singolarmente.

L'esempio seguente mostra come inserire una query per trovare i campi UDM comuni che potrebbero contenere l'indirizzo IP specificato:

ip = "1.2.3.4"

Puoi trovare una corrispondenza per un campo raggruppato utilizzando un'espressione regolare e l'operatore nocase. Sono supportati anche gli elenchi di riferimento. I campi raggruppati possono essere utilizzati anche in combinazione con i campi UDM normali, come mostrato nell'esempio seguente:

ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"

Tipi di campi UDM raggruppati

Puoi eseguire ricerche in tutti i seguenti campi UDM raggruppati:

Nome del campo raggruppato Campi UDM associati
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

Aggiungi commenti in una query

Puoi aggiungere commenti all'interno dell'editor di ricerca per documentare una logica di ricerca complessa o disattivare temporaneamente le condizioni durante i test:

  • Commenti su una sola riga: anteponi al testo del commento due barre (//). Tutto ciò che segue le barre su quella riga viene ignorato.
  • Commenti in blocco su più righe: racchiudi il testo del commento tra /* e */. I commenti di blocco possono estendersi su più righe.

Esempio:

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

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.