Comprendere la sintassi di ricerca

Supportato in:

Questa guida è rivolta agli analisti della sicurezza che vogliono configurare le espressioni di ricerca (valori dei dati, caratteri di 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 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.

Formattare 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 valide del dizionario UDM, racchiuse tra virgolette doppie ("), come nel seguente esempio:

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 nel seguente esempio:

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 nel seguente esempio:

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 nel seguente esempio:

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 tra 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 nel seguente esempio:

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

Escape delle stringhe (\ e ")

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

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

  • Cerca i percorsi dei file Windows con barre rovesciate di 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 la 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 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 nel seguente esempio:

    target.process.command_line = /\bpsexec(\.exe)?\b/ nocase
    
  • Corrispondono ai 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 negli esempi seguenti:

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

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

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

Cercare 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 coppia chiave-valore (field["key"] = "value")

Utilizza la sintassi delle parentesi per eseguire query su una chiave specifica e sul relativo valore stringa direttamente, come nel seguente esempio:

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

Corrispondenza avanzata di espressioni regolari e valori non stringa nei campi additional

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

  • Corrispondenza di qualsiasi stringa di valori all'interno del contenitore aggiuntivo tramite espressione regolare:

    additional.fields.value.string_value = /suspicious_payload_.*/ nocase
    
  • Corrispondenza di 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 che corrispondono a un prefisso regex:

    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 delle 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 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 corrispondenze con i campi UDM comuni che potrebbero contenere l'indirizzo IP specificato:

ip = "1.2.3.4"

Puoi trovare una corrispondenza con un campo raggruppato utilizzando un'espressione regolare e l'operatore nocase. Sono supportati anche gli elenchi di riferimenti. I campi raggruppati possono essere utilizzati anche in combinazione con i normali campi UDM, 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

Aggiungere commenti in una query

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

  • Commenti su una sola riga: aggiungi due barre oblique (//) prima del testo del commento. Tutto ciò che segue le barre oblique sulla riga viene ignorato.
  • Commenti a blocchi su più righe: racchiudi il testo del commento tra /* e */. I commenti a blocchi 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.