Memahami sintaksis penelusuran
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
.exeopsional, yang tidak peka huruf besar/kecil, seperti dalam contoh berikut:target.process.command_line = /\bpsexec(\.exe)?\b/ nocaseMencocokkan 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:
additionalfields: 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_.*/ nocaseMencocokkan nilai boolean atau numerik di dalam kolom kustom:
additional.fields.value.bool_value = true additional.fields.value.number_value > 500Menelusuri 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
nocasesecara langsung dengan sintaksis tanda kurung:additional.fields["pod_name"] = /br/ additional.fields["pod_name"] = bar nocaseGabungkan beberapa pasangan nilai kunci
additional.fieldsmenggunakanAND: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_domainabout.asset.network_domainnetwork.dns.questions.namenetwork.dns_domainprincipal.administrative_domainprincipal.asset.network_domaintarget.administrative_domaintarget.asset.hostnametarget.asset.network_domaintarget.hostname |
email |
intermediary.user.email_addressesnetwork.email.fromnetwork.email.toprincipal.user.email_addressessecurity_result.about.user.email_addressestarget.user.email_addresses |
file_path |
principal.file.full_pathprincipal.process.file.full_pathprincipal.process.parent_process.file.full_pathtarget.file.full_pathtarget.process.file.full_pathtarget.process.parent_process.file.full_path |
hash |
about.file.md5about.file.sha1about.file.sha256principal.process.file.md5principal.process.file.sha1principal.process.file.sha256security_result.about.file.sha256target.file.md5target.file.sha1target.file.sha256target.process.file.md5target.process.file.sha1target.process.file.sha256 |
hostname |
intermediary.hostnameobserver.hostnameprincipal.asset.hostnameprincipal.hostnamesrc.asset.hostnamesrc.hostnametarget.asset.hostnametarget.hostname |
ip |
intermediary.ipobserver.ipprincipal.artifact.ipprincipal.asset.ipprincipal.ipsrc.artifact.ipsrc.asset.ipsrc.iptarget.artifact.iptarget.asset.iptarget.ip |
namespace |
principal.namespacesrc.namespacetarget.namespace |
process_id |
principal.process.parent_process.pidprincipal.process.parent_process.product_specific_process_idprincipal.process.pidprincipal.process.product_specific_process_idtarget.process.parent_process.pidtarget.process.parent_process.product_specific_process_idtarget.process.pidtarget.process.product_specific_process_id |
user |
about.user.useridobserver.user.useridprincipal.user.user_display_nameprincipal.user.useridprincipal.user.windows_sidsrc.user.useridtarget.user.user_display_nametarget.user.useridtarget.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.