Memahami sintaksis penelusuran

Didukung di:

Panduan ini ditujukan bagi analis keamanan yang ingin mengonfigurasi ekspresi penelusuran (nilai data, escape, operator, dan sebagainya) di editor kueri halaman Penelusuran SIEM.

Saat menulis ekspresi penelusuran YARA-L 2.0 atau SQL di editor kueri Google Security Operations, Anda harus memformat nilai data, operator, dan urutan escape string sesuai dengan jenis data yang tepat dari kolom UDM target. Kondisi penelusuran terdiri dari nama kolom UDM, operator perbandingan (=, !=, >, <, <=, >=), dan nilai data yang diformat.

Memformat nilai data menurut jenis data

Bagian ini menjelaskan hal berikut:

Nilai yang di-enum (enum)

Enum harus ditulis sebagai string teks huruf besar yang sama persis dengan definisi kamus UDM yang valid, yang diapit dalam tanda petik ganda ("), seperti dalam contoh berikut:

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

Nilai boolean

Kolom boolean menerima nilai benar atau salah (tidak peka huruf besar/kecil, tidak memerlukan tanda petik), seperti dalam contoh berikut:

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

Bilangan bulat dan nilai numerik

Bilangan bulat dan nomor port ditulis sebagai digit literal tanpa tanda kutip ganda, seperti dalam contoh berikut:

target.port = 443 network.sent_bytes > 10485760

Nilai float dan desimal

Untuk kolom UDM jenis float atau double, masukkan angka desimal atau bilangan bulat tanpa tanda kutip ganda, seperti dalam contoh berikut:

security_result.about.asset.vulnerabilities.cvss_base_score = 9.8

String teks

Nilai teks standar harus diapit dalam tanda kutip ganda ("), seperti dalam contoh berikut:

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

Pencocokan yang tidak peka huruf besar/kecil (nocase)

Secara default, perbandingan string di YARA-L 2.0 peka huruf besar/kecil. Untuk mencocokkan kombinasi karakter huruf besar dan huruf kecil, tambahkan operator nocase langsung di akhir kondisi, seperti dalam contoh berikut:

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

Pelepasan string (\ dan ")

Jika literal string berisi garis miring terbalik atau tanda kutip ganda, Anda harus meng-escape karakter tersebut menggunakan garis miring terbalik di awal (\\), seperti dalam contoh berikut:

  • Gunakan \\ untuk mencocokkan garis miring terbalik literal (\\).
  • Gunakan \" untuk mencocokkan tanda petik ganda literal (").

  • Menelusuri jalur file Windows dengan garis miring terbalik yang di-escape:

    principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
    
  • Telusuri command line yang berisi tanda petik ganda tersemat:

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

Ekspresi reguler (sintaksis RE2)

Untuk menelusuri menggunakan ekspresi reguler, sertakan pola ekspresi reguler di antara garis miring (/ /) dan bukan tanda petik ganda. Google SecOps menggunakan mesin ekspresi reguler RE2 standar:

  • Mencocokkan IP utama apa pun dalam rentang 10.x.x.x, seperti ini:

    principal.ip = /10\..*/
    
  • Cari eksekusi PsExec dengan ekstensi .exe opsional, yang tidak peka huruf besar/kecil, seperti dalam contoh berikut:

    target.process.command_line = /\bpsexec(\.exe)?\b/ nocase
    
  • Mencocokkan nama host DNS dinamis yang mengikuti pola bernomor, seperti dalam contoh berikut:

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

Logika Boolean dan prioritas operator

Gabungkan beberapa kondisi penelusuran menggunakan operator AND, OR, dan NOT. Anda dapat menggunakan tanda kurung () untuk mengelompokkan ekspresi secara eksplisit dan mengontrol prioritas evaluasi, seperti yang ditunjukkan dalam contoh berikut:

  • Telusuri peristiwa login pengguna tertentu di host sensitif, seperti dalam contoh berikut:

    metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"
    
    
  • Gunakan tanda kurung untuk mengisolasi kondisi OR dari rantai AND, seperti dalam contoh berikut:

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

Menelusuri key-value pair di kolom additional dan labels

Kolom additional dan labels berfungsi sebagai penampung fleksibel untuk data peristiwa kustom dan atribut vendor pihak ketiga yang tidak dipetakan ke kolom UDM standar. Setiap entri menyimpan key-value pair:

  • additional fields: Dapat berisi beberapa key-value pair per peristiwa (additional.fields["key"] = "value").

  • Kolom labels: Hanya dapat berisi satu pasangan nilai kunci per peristiwa (labels["key"] = "value").

Pencocokan nilai kunci persis (field["key"] = "value")

Gunakan sintaksis tanda kurung untuk membuat kueri kunci tertentu dan nilai string yang sesuai secara langsung, seperti dalam contoh berikut:

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

Pencocokan ekspresi reguler lanjutan dan nilai non-string di kolom additional

Jika Anda perlu membuat kueri nilai numerik/boolean di dalam kolom additional, atau mencocokkan kunci dan nilai menggunakan ekspresi reguler, gunakan jalur kolom protobuf yang sepenuhnya memenuhi syarat:

  • Mencocokkan string nilai apa pun di dalam penampung tambahan dengan ekspresi reguler:

    additional.fields.value.string_value = /suspicious_payload_.*/ nocase
    
  • Mencocokkan nilai boolean atau numerik di dalam kolom kustom:

    additional.fields.value.bool_value = true additional.fields.value.number_value > 500
    
  • Menelusuri beberapa kunci dinamis yang cocok dengan awalan regex:

    additional.fields.key = /^myKeyNumber_.*/
    
  • Periksa apakah kunci ada, terlepas dari nilainya:

    additional.fields["pod_name"] != ""
    
  • Gunakan ekspresi reguler dan nocase secara langsung dengan sintaksis tanda kurung:

    additional.fields["pod_name"] = /br/
    additional.fields["pod_name"] = bar nocase
    
  • Gabungkan beberapa pasangan nilai kunci additional.fields menggunakan AND:

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

Menelusuri kolom yang dikelompokkan

Kolom yang dikelompokkan adalah alias untuk grup kolom UDM terkait. Anda dapat menggunakannya untuk membuat kueri beberapa kolom UDM secara bersamaan tanpa mengetik setiap kolom satu per satu.

Contoh berikut menunjukkan cara memasukkan kueri untuk mencocokkan kolom UDM umum yang mungkin berisi alamat IP yang ditentukan:

ip = "1.2.3.4"

Anda dapat mencocokkan kolom yang dikelompokkan menggunakan ekspresi reguler dan operator nocase. Daftar referensi juga didukung. Kolom yang dikelompokkan juga dapat digunakan bersama dengan kolom UDM reguler seperti yang ditunjukkan pada contoh berikut:

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

Jenis kolom UDM yang dikelompokkan

Anda dapat menelusuri semua kolom UDM yang dikelompokkan berikut:

Nama kolom yang dikelompokkan Kolom UDM terkait
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

Menambahkan komentar dalam kueri

Anda dapat menambahkan komentar di dalam editor penelusuran untuk mendokumentasikan logika penelusuran yang kompleks atau menonaktifkan kondisi sementara selama pengujian:

  • Komentar satu baris: Awali teks komentar dengan dua garis miring (//). Semua yang ada setelah garis miring di baris tersebut akan diabaikan.
  • Komentar blok multibaris: Sertakan teks komentar di dalam /* dan */. Komentar blok dapat mencakup beberapa baris.

Contoh:

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

Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.