Transisi dari SPL ke YARA-L 2.0

Didukung di:

Panduan ini ditujukan bagi pengguna yang sudah memahami Splunk Search Processing Language (SPL). Bagian ini memberikan pengantar singkat tentang YARA-L 2.0: bahasa inti untuk membuat penelusuran, dasbor, dan aturan deteksi dalam Google Security Operations.

Memahami struktur YARA-L 2.0

YARA-L 2.0 adalah bahasa kueri terpadu yang digunakan di seluruh Google SecOps untuk penelusuran ancaman yang efektif, pembuatan dasbor real-time, dan pembuatan aturan deteksi dengan fidelitas tinggi pada semua data log perusahaan Anda saat data tersebut diserap.

Bahasa ini bekerja bersama dengan Mesin Deteksi Google SecOps dan memungkinkan Anda menelusuri ancaman dan peristiwa lain di berbagai data berjumlah besar.

Perbedaan struktur dasar antara SPL dan YARA-L

SPL menggunakan serangkaian perintah yang dirangkai dengan karakter pipe (|), sedangkan YARA-L berbasis bagian. Anda menentukan kueri menggunakan bagian yang berbeda-beda—seperti events, outcome, dan condition—untuk mendeskripsikan pola yang ingin Anda telusuri, deteksi, atau visualisasikan.

Tabel berikut membandingkan struktur dasar antara SPL dan YARA-L:

Fungsi SPL (prosedural) YARA-L (deklaratif)
Konsep inti Transformasikan aliran data langkah demi langkah menggunakan pipeline perintah. Menganalisis dan menerapkan struktur kondisi dan transformasi multipart ke aliran data keamanan dan operasional, mengidentifikasi ancaman, dan mengekstrak insight berharga.
Aliran data Prosedural. Hasil dari satu perintah disalurkan sebagai input ke perintah berikutnya. Struktur deklaratif untuk memproses dan mengorelasikan pola secara optimal dalam skala besar. Menghilangkan kebutuhan untuk memikirkan efisiensi.
Korelasi peristiwa Mengandalkan perintah eksplisit seperti join, transaction, dan stats. Bawaan dengan menentukan beberapa peristiwa dan mengorelasikannya berdasarkan kolom umum dalam logika kueri.
Jendela waktu Ditangani sebagai jendela penelusuran statis (misalnya, last 60m). Setiap penelusuran baru adalah permintaan baru. Ditangani sebagai periode waktu geser berkelanjutan yang ditentukan dalam kueri (misalnya, over 5m).
Sintaksis Didorong perintah (misalnya, index=web). Singkat dan didorong oleh logika (misalnya, metadata.event_type= "USER_LOGIN").

Struktur kueri tertentu

YARA-L menerapkan struktur tertentu untuk kueri, yang berbeda dari perintah berurutan dan ber-pipe SPL. Meskipun SPL membuat hasil dengan merangkai perintah, YARA-L menentukan berbagai aspek kueri di bagian yang berbeda.

Perintah Tindakan Wajib | Opsional
meta Menetapkan metadata deskriptif untuk aturan, seperti penulis, deskripsi, dan tingkat keparahan. Hanya diperlukan untuk aturan.
events Menentukan dan memfilter peristiwa. Wajib (logika inti kueri).
match Mengelompokkan menurut peristiwa dan memungkinkan Anda menentukan jangka waktu (misalnya, by 5m). Opsional. Hanya diperlukan untuk kueri korelasi multi-peristiwa.
outcome Menghitung metrik utama dan mendapatkan insight. Opsional.
condition Mengevaluasi kriteria variabel kueri untuk menentukan apakah hasil berlaku (misalnya, #event >5). Hanya diperlukan untuk aturan. Opsional dalam penelusuran dan dasbor.
dedup Menghapus peristiwa duplikat dengan mengelompokkannya berdasarkan variabel utama (misalnya, target.user.userid, target.ip>, principal.hostname. Opsional.
order Mengurutkan hasil peristiwa yang dikumpulkan yang ditentukan oleh kolom tertentu (misalnya, asc). Opsional.
limit Membatasi jumlah maksimum peristiwa yang ditampilkan dari kueri. Opsional.

Perintah umum di SPL dan YARA-L

Struktur bagian YARA-L memungkinkan Anda menggunakan perintah umum yang sama yang ditemukan di SP. Bagian ini menguraikan persamaan dan perbedaannya.

Perintah SPL search = bagian YARA-L events

Perintah search di SPL setara dengan bagian events di YARA-L. Bagian events menentukan peristiwa dan cara pemfilteran awalnya. Meskipun bagian lain (seperti match atau outcome) bersifat opsional, bagian events sangat penting untuk setiap aturan.

Contoh:

metadata.event_type = "USER_LOGIN"

atau:

principal.hostname != "" AND metadata.event_type = "NETWORK_CONNECTION"

Di bagian events aturan (dan kueri lanjutan), Anda menggunakan variabel peristiwa untuk menyederhanakan logika.

Variabel peristiwa berfungsi sebagai pengelompokan filter logis, yang mewakili peristiwa tertentu atau sekelompok peristiwa yang cocok dengan kriteria tertentu.

Misalnya, untuk menentukan variabel peristiwa, seperti $e, gunakan sebagai awalan semua peristiwa dan filter terkait di bagian events kueri Anda. Kemudian, Anda dapat menggunakan variabel tersebut di bagian kueri lainnya (seperti match atau outcome) untuk mereferensikan grup peristiwa tertentu dan kolom datanya.

Aplikasi paling umum untuk variabel peristiwa adalah dalam aturan deteksi. Contoh berikut menunjukkan cara menggunakan variabel peristiwa ($e) dalam aturan untuk mengelompokkan peristiwa dan menemukan jumlah upaya login yang gagal untuk pengguna dalam satu hari. Aturan kemudian dipicu jika melampaui batas yang ditentukan.

Dalam contoh aturan, setiap peristiwa ditentukan dengan variabel peristiwa ($e). Variabel $e juga dirujuk dalam metadata.id untuk menautkan metadata aturan kembali ke peristiwa yang ditentukan.

rule DailyFailedLoginAttempts {
 meta:
   author = "Alex"
   description = "Detects a high number of failed login attempts for a single user within a day."

events:
   // Alias for each event
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $e.principal.user.userid != ""
   $userid = $e.principal.user.userid

match:
   // Group events by principal.user.userid within a 24-hour window
   $userid over 1d

outcome:
   // Count the number of unique event IDs for each user per day
   $daily_failed_login_count = count($e.metadata.id)

condition:
   // Trigger a detection if the daily failed login count exceeds a threshold
   // You should adjust this threshold based on your environment's baseline.
   #e > 0
}

Untuk memastikan aturan dipicu, Anda sering kali perlu memeriksa jumlah peristiwa yang dikelompokkan. Anda dapat menentukan jumlah minimum di bagian condition menggunakan variabel peristiwa. Misalnya, kondisi (#e > 0) memeriksa bahwa setidaknya ada satu peristiwa yang cocok dengan kriteria.

Perintah SPL eval = bagian YARA-L outcome

Perintah eval adalah fungsi SPL mendasar yang digunakan untuk memanipulasi dan menentukan nilai kolom dalam hasil penelusuran.

  • Tujuan: Menghitung dan menentukan nilai kolom baru.
  • Fungsi: Mengevaluasi ekspresi matematika, string, atau boolean.
  • Hasil: Hasil evaluasi akan membuat kolom baru atau menimpa nilai kolom yang ada.
  • Penggabungan: Beberapa ekspresi dapat digabungkan menggunakan koma (misalnya, | eval A=1, B=A+1).
  • Pemrosesan berurutan: Ekspresi dalam rantai diproses secara berurutan, sehingga perhitungan selanjutnya dapat mereferensikan dan dibuat berdasarkan kolom yang dibuat atau diubah oleh ekspresi sebelumnya.

Contoh dalam tabel berikut (dan setelahnya) menjelaskan struktur perintah ini:

Fungsi Deskripsi Contoh YARA-L
Operator Boolean Digunakan di events dan condition. Lihat Gunakan atau di bagian kondisi.

metadata.log_type != "" or
metadata.event_type = "NETWORK_DNS"
      
Kolom kalkulasi Digunakan di bagian outcome.

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = cast.as_int(network.sent_bytes)
  
Pembuatan nama kolom dinamis Digunakan di bagian outcome. Lihat contoh di Membandingkan SPL dengan YARA-L.

Contoh: Membuat kolom baru yang berisi hasil penghitungan

Dengan YARA-L, buat kolom baru, bytes, di setiap peristiwa. Hitung byte dengan menjumlahkan nilai di kolom bytes yang dikirim dengan kolom bytes yang diterima.

 metadata.event_type = "SCAN_NETWORK"
 principal.hostname != ""
 $host = principal.hostname

match:
   $host

outcome:
   $bytes = cast.as_int(sum(network.sent_bytes))

Contoh: Menggabungkan nilai dari dua kolom

Gunakan karakter titik (.) untuk menggabungkan nilai di kolom first_name dengan nilai di kolom last_name. Gunakan tanda petik ("") untuk menyisipkan karakter spasi di antara kedua kolom. Saat digabungkan, nilai dibaca sebagai string, terlepas dari nilai sebenarnya.

Di SPL, kueri akan terlihat seperti ini:

| eval full_name = first_name+" "+last_name

Di YARA-L, kueri penelusuran akan terlihat seperti ini:

principal.user.first_name = $first_name
principal.user.last_name = $last_name

outcome:
  $full_name = strings.concat(principal.user.first_name = $first_name
  principal.user.last_name = $last_name

outcome:
   $full_name = strings.concat($first_name, " ", $last_name))

Dengan menggunakan contoh kueri login gagal, contoh berikut memungkinkan Anda menemukan pengguna yang mengalami lima kali atau lebih login gagal dalam waktu 10 menit (10m) satu sama lain (menggunakan variabel peristiwa dan placeholder):

metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"
target.user.userid = $userid

match:
  $userid by 10m

outcome:
   $login_count= count(metadata.id)

condition:
   $login_count > 5

Perintah SPL where = bagian YARA-L condition

Perintah SPL where setara dengan campuran bagian events, outcome, atau condition di YARA-L. Dengan menggunakan bagian events, Anda dapat mendeklarasikan peristiwa dan menentukan atribut tertentu untuknya (misalnya, priniciapal.hostname = "xyz"). Setelah mendeklarasikan peristiwa, Anda dapat menggunakan operator boolean, operator perbandingan, dan hasil fungsi agregasi (dari bagian outcome) untuk menentukan parameter yang harus dipenuhi peristiwa agar kueri menampilkan hasil.

Contoh berikut menunjukkan cara menetapkan kondisi nilai minimum pada jumlah gabungan. Kueri disusun untuk menghitung total jumlah peristiwa login yang gagal per ID pengguna, lalu menggunakan bagian condition untuk menampilkan hasil hanya bagi pengguna yang telah mencatat lima atau lebih login yang gagal.

metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"

match:
  target.user.userid

outcome:
  // metadata.id counts all unique events associated with failed logins.
  $count = count(metadata.id)
  //metadata.id counts all unique events associated with blocked logins.

condition:
  $count > 5

Perintah SPL dedup = bagian YARA-L dedup

Perintah SPL dedup setara dengan bagian dedup di YARA-L. Gunakan bagian dedup untuk menghapus duplikat hasil yang ditentukan oleh peristiwa di bagian events.

Contoh:

principal.hostname = "foo"

dedup:
   target.ip

Perintah SPL stats = bagian YARA-L match atau outcome (atau keduanya)

Di SPL, agregasi biasanya ditangani oleh keluarga perintah stats, yang menentukan jenis agregasi (seperti count, distinct count, max, min) dan kolom "group by".

Di YARA-L, bagian match dan outcome bersama-sama menyediakan kemampuan ini:

  • Logika agregasi: Bagian match membuat agregasi dengan menentukan grup peristiwa yang akan dipertimbangkan (match: $grouping_field by time). Bagian outcome kemudian menentukan fungsi agregat tertentu yang akan dihitung di grup tersebut (misalnya, count(), min(), max()).

  • Pengelompokan waktu: Bagian match mendukung penentuan jangka waktu untuk mengelompokkan peristiwa. Gunakan kata kunci over (untuk aturan) atau by (untuk penelusuran dan dasbor) (misalnya, match: $userid by 1h). Fungsi ini mirip dengan SPL, seperti "timechart", "streamstats", dan "eventstats". Untuk mengetahui informasi selengkapnya, lihat Time windowing.

Contoh: Menghitung jumlah byte yang dikelompokkan menurut nama host utama dan IP target

Contoh berikut menggunakan bagian match untuk menentukan grup agregasi berdasarkan nama host utama dan alamat IP target selama jangka waktu satu hari. Jumlah byte yang dikirim kemudian dihitung dalam bagian outcome.

metadata.event_type = "NETWORK_CONNECTION"
network.sent_bytes > 0
principal.hostname != ""
target.ip != ""

// Define placeholder variables for grouping
$principal_hostname = principal.hostname
$target_ip = target.ip

// Group events by principal hostname, target IP, and day
match:
  $principal_hostname, $target_ip by day

// Calculate the sum of sent bytes for each group
outcome:
  $daily_bytes_sent = sum(network.sent_bytes)

Memetakan SPL ke YARA-L

SPL memproses data langkah demi langkah melalui perintah yang disalurkan, sedangkan YARA-L menggunakan struktur deklaratif berbasis bagian untuk menentukan pola dan tindakan. Meskipun ada perbedaan mendasar dalam pendekatan ini, kemampuan ekspresif YARA-L memungkinkan Anda melakukan banyak tugas yang sama seperti yang biasa Anda lakukan di SPL, mulai dari pemfilteran dasar hingga agregasi dan korelasi yang kompleks.

Bagian ini menjelaskan perbedaan dengan memetakan fungsi SPL yang sudah dikenal ke fungsi yang setara dalam framework YARA-L.

Membandingkan SPL dengan YARA-L

Tabel ini membandingkan fungsi dan konsep umum dalam SPL Language umum dengan fungsi dan konsep yang setara dalam YARA-L 2.0 atau cara konsep tersebut ditangani dalam struktur kueri YARA-L.

Perintah atau konsep SPL Tujuan Setara dengan YARA-L Deskripsi dan pemetaan YARA-L Contoh penerapan YARA-L
search Pemfilteran data awal Bagian events Tentukan kolom dan kondisi peristiwa. Tidak perlu awalan events: untuk penelusuran atau dasbor. Lihat contoh.

events:
  metadata.event_type = "USER_LOGIN"
  security_result.action = "FAIL"

        
where Memfilter lebih lanjut hasil Bagian events dan condition Menerapkan logika boolean, sering kali pada hasil gabungan. Lihat contoh.

events:
  metadata.event_type = "USER_LOGIN"
  security_result.action = "FAIL"

outcome:
  $failed_count = count(metadata.id)

condition:
  $failed_count > 5
        
eval Menghitung nilai baru dari kolom, agregasi, dan pencarian data yang ada Bagian outcome atau events Lihat contoh SPL eval.

metadata.event_type = "USER_LOGIN"

outcome:
  $login_count = count(metadata.id)
        
stats Agregasi (count, sum, rata-rata) match atau outcome Kelompokkan menurut kolom di match. Menghitung agregasi di outcome. Lihat contoh di Agregasi dan kueri statistik dan perintah SPL stats.

metadata.event_type = "USER_LOGIN"

outcome:
  $login_count = count(metadata.id)
        
dedup Menghapus peristiwa duplikat berdasarkan satu atau beberapa kolom Bagian dedup Tentukan kolom yang akan dihapus duplikatnya.

metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"
$user = target.user.userid

dedup:
  $user
        
table Menentukan output kolom tabel select atau unselect Digunakan dalam dasbor. Dalam penelusuran, menampilkan variabel outcome.

metadata.event_type = "USER_LOGIN"

select:
  principal.hostname
        
sort Mencantumkan hasil dalam urutan menaik atau menurun Bagian order Lihat contoh di sel tabel berikutnya.
metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""

outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = uint64(network.sent_bytes)

order:
  $bytes desc
limit Membatasi jumlah hasil yang ditampilkan Bagian limit Lihat contoh di sel berikutnya.

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""

outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = cast.as_int(network.sent_bytes)

order:
  $bytes desc

limit:
  3
  
Fungsi multi-nilai Ditangani dengan fungsi mv* (mvexpand, mvfilter) Dukungan bawaan YARA-L secara otomatis membatalkan nested array di bagian peristiwa.
Fungsi array tersedia di outcome, jika diperlukan.
Lihat contoh fungsi multi-nilai.
Jendela waktu earliest=-5m, latest=now Bagian match, over, by Untuk deteksi berkelanjutan, gunakan match: $field over 5m or by 5m. Untuk dasbor di UI Penelusuran, gunakan match: $field by 5m. Lihat contoh di Penentuan jangka waktu.

Kueri agregasi dan statistik

Di YARA-L, fungsi agregasi dan statistik biasanya ditempatkan di bagian outcome, dan agregasi didasarkan pada bagian match.

Perintah stats adalah mekanisme utama untuk menerapkan agregasi data dalam kueri YARA-L. Fitur ini mengubah data peristiwa mentah menjadi metrik keamanan yang diringkas. Meskipun perintah eval menangani transformasi tingkat kolom, baris demi baris (mirip dengan ekspresi SELECT), stats melakukan agregasi tingkat set (mirip dengan GROUP BY di SQL).

Tabel berikut memberikan sintaksis dan penggunaan inti, yang menunjukkan cara menggunakan statistik secara efektif untuk menerapkan logika keamanan canggih berdasarkan pola data dan pencilan statistik.

Fungsi SPL Deskripsi YARA-L yang setara Contoh penerapan YARA-L
count Menghitung jumlah peristiwa. count()

metadata.event_type= "USER_LOGIN"
security_result.action= "FAIL"

outcome:
  $event_count = count(metadata.id)

condition:
  $event_count > 2
  
dc (count_distinct) Menghitung jumlah nilai unik untuk kolom. count_distinct()

metadata.event_type = "USER_LOGIN"

outcome:
  $unique_users=count_distinct(principal.user.userid)
  
sum Menghitung jumlah nilai untuk kolom.
sum()

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host

outcome:
  $bytes = sum(network.sent_bytes)
  
avg Menghitung nilai rata-rata untuk kolom.
avg()

$host = principal.hostname

match:
  $host by day

outcome:
  $avg_bytes_sent = avg(network.sent_bytes)
  
min/max Menemukan nilai minimum atau maksimum untuk kolom. min() atau max()

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host

outcome:
  $bytes = max(network.sent_bytes)- min(network.sent_bytes)
  
median() Menemukan nilai median. window.median

target.file.mime_type = "PDF"

outcome:
  $median_file_size = window.median(target.file.size, false)
  
first() and last() Menampilkan nilai berdasarkan urutan peristiwa dalam hasil penelusuran. window.first/window.last

metadata.event_type = "NETWORK_CONNECTION"
principal.ip != ""

match:
  principal.ip

outcome:
  $event_count = count(metadata.id)
  $first_seen = window.first(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  $last_seen = window.last(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  
STDDEV() Menghitung simpangan baku, yang mengukur dispersi set data. window.stddv

principal.hostname= $host

match:
  $host over 5m

outcome:
  $stddev = window.stddev(network.sent_bytes)

Untuk mengetahui detailnya, lihat fungsi tambahan.

Misalnya, kueri multi-tahap dapat melacak beberapa login yang gagal di seluruh agregasi bertingkat. Untuk mengetahui detailnya, lihat contoh agregasi multi-tahap dan Membuat kueri multi-tahap di YARA-L.

Agregasi multi-tahap (rata-rata per jam ke per minggu)

Contoh multi-tahap ini awalnya mengagregasi data untuk menemukan byte yang ditransfer per host setiap jam. Kemudian, agregasi tersebut digunakan untuk menghitung rata-rata keseluruhan di seluruh bucket per jam selama tujuh hari terakhir.

stage bytes_per_host {
metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host by hour

outcome:
  $bytes = cast.as_int(sum(network.sent_bytes))
}

$host = $bytes_per_host.host

match:
  $host

outcome:
  $hour_buckets = array_distinct(timestamp.get_timestamp($bytes_per_host.window_start))
  $num_hour_buckets = count_distinct($bytes_per_host.window_start)
  $avg_hourly_bytes = avg($bytes_per_host.bytes)

Fungsi multi-nilai (membaca array)

Sintaksis YARA-L dibuat untuk memahami bahwa kolom dapat memiliki beberapa nilai. Saat Anda menulis kueri yang menyertakan peristiwa dengan kolom bernilai ganda di bagian events, bahasa akan otomatis memeriksa setiap nilai dalam array. Anda tidak perlu menggunakan fungsi khusus untuk memfilter array; cukup nyatakan kondisi yang ingin Anda cocokkan. Misalnya, jika kolom principal.ip peristiwa log berisi hal berikut, mesin YARA-L akan otomatis memeriksa setiap nilai dalam array principal.ip. Jika salah satu nilai adalah "10.1.1.5", kondisi terpenuhi.

["10.1.1.5", "10.2.2.6", "10.3.3.7"]

Tabel berikut menunjukkan perbandingan antara YARA-L dan SPL tentang cara mengelola kolom bernilai ganda dalam data log. Kolom multi-nilai, seperti array alamat IP atau daftar grup pengguna, adalah fitur umum dalam log terstruktur.

Fungsi SPL Tujuan YARA-L yang setara Contoh penerapan YARA-L
mvfilter() Memfilter kolom multi-nilai untuk hanya menyimpan nilai yang cocok. Jika digunakan di bagian events kueri YARA-L, cantumkan kolom yang akan dicocokkan. YARA-L otomatis memeriksa apakah ada nilai dalam array grup yang cocok dengan "`admin`".

principal.user.group_identifiers = "admin"
        
mvcount() Menghitung jumlah nilai dalam kolom multi-nilai. count() diterapkan ke kolom di bagian kueri outcome. Anda tidak perlu memisahkan nilai terlebih dahulu. Lihat contoh Hitung jumlah pengguna yang termasuk dalam grup staf IT.
mvexpand Membuat peristiwa baru untuk setiap nilai dalam kolom multinilai. Menangani kolom bernilai ganda secara native dan implisit; pembukaan nest terjadi secara otomatis. Lihat contoh Hitung jumlah pengguna yang termasuk dalam grup staf IT.
mvjoin Menggabungkan semua nilai dari kolom bernilai ganda menjadi satu string untuk tujuan pemformatan data. Nilai akan otomatis disimpan sebagai array dalam hasil. Output YARA-L terstruktur, bukan string datar. Menampilkan kolom sebagai array jika manipulasi array lebih lanjut diperlukan. Untuk mengetahui detailnya, gunakan fungsi array.

Contoh: Menghitung jumlah login admin

Dalam contoh berikut, kondisi $metadata.event_type = "USER_LOGIN" memfilter peristiwa dengan event_type "USER_LOGIN":

events:
 metadata.event_type = "USER_LOGIN" // Changed to a more appropriate event type for login
 principal.user.group_identifiers = "admin"

outcome:
 // This counts each unique event ID where the principal user is in the `"admin"` group.
 $admin_login_count = count(metadata.id)

Kolom $principal.user.group_identifiers= "admin" adalah kolom berulang (array).

  • Pelepasan implisit: YARA-L secara otomatis melepaskan kolom ini secara internal selama evaluasi kueri.
  • Pemeriksaan kondisi: Peristiwa akan memenuhi kondisi jika salah satu nilai dalam array $principal.user.group_identifiers sama dengan "admin".
  • Tidak memerlukan perintah eksplisit: Tidak seperti SPL, Anda tidak memerlukan perintah pelepasan nest tertentu seperti mvexpand.

Bagian dampak pada agregasi (outcome) berarti bahwa pelepasan implisit sangat penting di bagian outcome (misalnya, outcome: $admin_login_count = count(metadata.id)). Perhatikan dampak berikut:

  • Satu peristiwa UDM yang berisi beberapa nilai yang cocok dalam kolom berulang dapat menghasilkan beberapa baris internal untuk tujuan evaluasi kueri.
  • Karena bagian events telah secara efektif membatalkan penyusunan bertingkat peristiwa berdasarkan setiap nilai yang cocok di $principal.user.group_identifiers, agregasi count(metadata.id) menghitung setiap instance yang tidak disusun bertingkat ini.

Contoh: Hitung jumlah pengguna yang termasuk dalam grup staf IT

SPL:

index=<your_index_name> user_id="jsmith" 
| where match(memberOf, "Domain Admins|IT Staff|HR") 
| mvexpand memberOf 
| stats count by memberOf 
| mvexpand actions 
| table memberOf, count, actions

YARA-L (penelusuran):

 principal.user.userid = "jsmith"
 additional.fields["memberOf"] = $group
   $group = /Domain Admins|IT Staff|HR/ nocase
 
 match:
   $group by 1h
 
 outcome:
   $group_count = count_distinct(metadata.id)
   $memberOf = array_distinct($group)
   $risk_score = max(50)

Contoh: Membuat aturan untuk memberikan pemberitahuan saat hash file tertentu ada

SPL:

| eval file_hashes="hash12345,hash67890,hashABCDE" 
| makemv delim="," file_hashes 
| mvexpand file_hashes 
| search file_hashes="hash67890" 
| table _time, file_hashes

YARA-L (aturan):

    rule specific_file_hash_detected {
    
    meta:
      rule_name = "Specific File Hash Detected"
      description = "Detects events where a specific file hash is present."
      severity = "Medium"
    
    events:
      $e.target.file.sha256 == "hash67890"
    
    outcome:
      $time = array_distinct($e.metadata.event_timestamp)
      $file_hashes = array_distinct($e.target.file.sha256)
    
    condition:
      $e
    }

Jendela waktu

Di YARA-L, time windowing adalah metode untuk mengorelasikan peristiwa selama jangka waktu tertentu yang terus berlanjut. Saat digunakan dalam aturan, jendela ini terus bergerak dengan data yang masuk, yang memberikan deteksi pola real-time berkelanjutan yang terungkap dari waktu ke waktu.

Proses ini merupakan bagian penting dari desain untuk deteksi otomatis dan merupakan salah satu manfaat penggunaan YARA-L. Dengan menentukan jangka waktu, deteksi dan dasbor Anda akan terus bekerja dengan data real-time.

Fitur SPL YARA-L
Sasaran utama Penelusuran statis, analisis ad hoc Deteksi berkelanjutan, korelasi otomatis
Fungsi utama earliest, latest, span, transaction over, by
Contoh 5 menit earliest=-5m (penelusuran statis)
atau
transaction maxspan=5m
match:
[event] over 5m (deteksi berkelanjutan dalam aturan)
atau
[event] by 5m (penelusuran dan dasbor)

Contoh di bagian ini menggambarkan perbedaan antara jendela waktu bergulir (menggunakan by) dan jendela waktu geser (menggunakan over) di YARA-L.

Periode tumbling (by <time_unit>)

  • Konsep: Digunakan dalam penelusuran YARA-L, jendela bergulir membuat interval waktu berukuran tetap yang tidak tumpang-tindih. Sistem memproses setiap peristiwa dengan menetapkan setiap peristiwa ke tepat satu bucket waktu tertentu berdasarkan stempel waktunya. Interval tetap ini bersifat mutlak, dan selaras dengan penanda waktu standar, seperti hari, jam, atau menit).

  • Penggunaan: Umumnya digunakan dalam kueri penelusuran dan Dasbor Google SecOps untuk menggabungkan data ke dalam segmen waktu terpisah.

Contoh: Jumlah harian proses login yang berhasil per pengguna

Kueri penelusuran ini mengelompokkan peristiwa login yang berhasil menurut setiap pengguna unik dalam setiap hari kalender. Contoh berikut menunjukkan jendela bergulir penelusuran YARA-L (by day):

events:
  //Filter for successful login events
  metadata.event_type = "USER_LOGIN"
  principal.user.userid != ""

match:
  //Group by each unique user ID, aggregated over a calendar day.
  principal.user.userid by day

outcome:
  //Count how many successful logins occurred for this user on this specific day.
  $daily_success_count = count(metadata.id)
  
  //Get the timestamp of the FIRST event within this daily group.
  $first_event_time = window.first(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  
  //Get the timestamp of the LAST event within this daily group.
  $last_event_time = window.last(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))

Cara kerjanya: Jika pengguna jdoe memiliki 10 login yang berhasil di Nov 17 dan 15 di Nov 18, kueri ini akan menghasilkan dua baris terpisah untuk jdoe, satu untuk setiap hari, dengan jumlah masing-masing. Bucket Nov 17 mencakup peristiwa dari 2025-11-17 00:00:00 to 23:59:59 UTC.

Periode waktu geser (over <duration>)

  • Konsep: Digunakan dalam Aturan YARA-L, jendela geser adalah jendela waktu yang bergerak dan berpotensi tumpang-tindih dengan durasi yang ditentukan. ID ini ideal untuk mengorelasikan peristiwa yang terjadi dalam jarak tertentu satu sama lain.

  • Penggunaan: Terutama digunakan dalam Aturan YARA-L untuk mendeteksi pola atau urutan peristiwa dalam jangka waktu berkelanjutan.

Contoh: Mendeteksi beberapa upaya login yang gagal dalam waktu 5 menit

Contoh Aturan YARA-L ini menghasilkan deteksi jika satu pengguna memiliki lebih dari 5 failed logins upaya dalam periode 5-minute yang bergulir:

rule TooManyFailedLogins_SlidingWindow {
 meta:
   author = "Alex"
   description = "Detects when a user has more than 5 failed logins within a 5-minute sliding window."
   severity = "Medium"

events:
   // Define an event variable $e for failed login attempts
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $e.principal.user.userid != ""
   $userid = $e.principal.user.userid

match:
   // Group events by userid over a continuous 5-minute sliding window.
   // Any events for the same $userid within 5 minutes of each other are grouped.
   $userid over 5m

outcome:
   // Count the number of failed login events within each 5-minute window for the grouped userid.
   $failed_count = count($e.metadata.id)

condition:
   // Trigger a detection if the count of failed logins in ANY 5-minute window is greater than 5.
   #e > 5
}

Cara kerjanya: Sistem terus memantau upaya login yang gagal. Setiap saat, model ini mempertimbangkan peristiwa selama 5 menit terakhir untuk setiap pengguna. Misalnya, jika antara 10:02:30 dan 10:07:30, pengguna jdoe mengumpulkan enam kali gagal login, deteksi akan dipicu. Jendela ini terus bergeser ke depan, sehingga memungkinkan deteksi pola real-time terjadi, terlepas dari batas kalender.

Langkah berikutnya

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