Mulai: YARA-L 2.0 di SecOps

Didukung di:

YARA-L 2.0 adalah bahasa kueri unik dan sangat terstruktur yang mendukung Google Security Operations untuk semua penelusuran, dasbor, dan deteksi ancaman berbasis aturan. Dokumen ini membantu Anda memahami struktur inti YARA-L dan memberikan langkah-langkah praktis untuk menggunakannya, baik Anda seorang Analis Keamanan yang berburu ancaman atau seorang Engineer Deteksi yang membangun logika baru yang kuat.

Sebelum memulai

Memahami struktur YARA-L

Setiap kueri YARA-L disegmentasikan ke dalam bagian bernama yang berbeda, yang menentukan perilaku kueri.

Struktur ini memungkinkan analisis dan korelasi multi-tahap.

Perintah Tindakan Opsional | Wajib
meta Menetapkan metadata deskriptif untuk aturan, seperti penulis, deskripsi, dan tingkat keparahan. Opsional untuk penelusuran dan dasbor. Hanya diperlukan untuk aturan.
events Menentukan dan memfilter peristiwa. Mendeklarasikan semua sumber data (terutama peristiwa) yang akan dipertimbangkan dan memfilternya menggunakan kolom UDM. Diperlukan (logika inti kueri) untuk penelusuran, dasbor, dan aturan.
match Mengelompokkan menurut peristiwa dan memungkinkan Anda menentukan periode waktu yang didukung (misalnya, by 5m). Diperlukan dalam beberapa kasus untuk penelusuran statistik saat terjadi penggabungan. Diperlukan untuk kueri korelasi multi-peristiwa. Spesifikasi waktu diperlukan dalam match untuk aturan dan bersifat opsional untuk penelusuran dan dasbor.
outcome Menghitung metrik penting dan mendapatkan insight (misalnya, count(), avg()). Opsional.
condition Mendefinisikan logika yang harus dipenuhi untuk menampilkan hasil (dalam penelusuran) atau memicu pemberitahuan (dalam aturan). Mengevaluasi kriteria variabel kueri untuk menentukan apakah hasil berlaku (misalnya, $event >5). Opsional dalam penelusuran dan dasbor. Hanya diperlukan untuk aturan.
dedup Menghapus peristiwa duplikat dengan mengelompokkannya berdasarkan variabel utama atau jalur peristiwa (misalnya, target.user.userid, target.ip, principal.hostname atau variabel, seperti $host, $user). Pelajari lebih lanjut variabel peristiwa. Opsional. Tidak tersedia dalam aturan.
order Mengurutkan hasil yang ditentukan oleh kolom tertentu (misalnya, asc). Opsional (hanya berlaku jika match digunakan). Tidak tersedia dalam aturan.
limit Membatasi jumlah maksimum peristiwa yang ditampilkan dari kueri. Opsional. Tidak tersedia dalam aturan.
select Menentukan daftar kolom UDM yang akan disertakan dalam hasil kueri. Opsional. Tidak tersedia dalam aturan.
unselect Menentukan daftar kolom UDM yang akan dikecualikan dari hasil kueri. Opsional. Tidak tersedia dalam aturan.

Ketersediaan sumber data YARA-L

YARA-L memiliki akses ke berbagai sumber data, bergantung pada lokasi Anda di platform. Peristiwa, entitas (ECG), dan tabel data sepenuhnya tersedia di seluruh penelusuran, dasbor, dan aturan.

Tabel berikut mencantumkan fitur yang tersedia di YARA-L:

Fitur Tersedia Di
Kasus dan histori kasus Dasbor
Tabel data Penelusuran, dasbor, aturan
Entitas (ECG) Penelusuran, dasbor, aturan
Metrik penyerapan Dasbor
Kecocokan IoC Dasbor
Deteksi aturan Dasbor, aturan
Kumpulan aturan Dasbor
Acara Penelusuran, dasbor, aturan
Metrik UEBA Penelusuran, dasbor

Semua data di Google SecOps ditelusuri menggunakan dua metode utama berdasarkan sasaran Anda: penelusuran filter dan penelusuran statistik (penggabungan).

Metode penelusuran filter memungkinkan Anda mengisolasi peristiwa tertentu dari aliran telemetri yang lebih luas tanpa overhead agregasi statistik. Metode ini menggunakan kriteria untuk mempersempit volume besar data keamanan—seperti log atau traffic jaringan—ke dalam set hasil yang ditargetkan. Logika ini hanya mengharuskan Anda menentukan peristiwa di bagian events.

Untuk membuat penelusuran filter YARA-L pertama, ikuti langkah-langkah berikut untuk menelusuri pengguna yang gagal login:

  1. Di Google SecOps, buka halaman search.
  2. Filter untuk peristiwa login:
    metadata.event_type = "USER_LOGIN"

    Tips: Anda dapat menghilangkan header bagian events: dalam penelusuran Anda. Secara default, sintaksis penelusuran menyiratkan bagian ini.

  3. Tambahkan tindakan event untuk login yang gagal dari pengguna yang tidak memiliki userid kosong.
    metadata.event_type = "USER_LOGIN"
    security_result.action = "FAIL"
    principal.user.userid != ""
  4. Jalankan penelusuran ini untuk melihat hasilnya.

Menggunakan variabel placeholder

Gunakan variabel pengganti untuk mengekstrak nilai tertentu dari peristiwa Anda, seperti nama pengguna atau alamat IP. Variabel ini berfungsi sebagai penanda sementara yang memungkinkan Anda membandingkan data di berbagai peristiwa atau menampilkan nilai tersebut dalam output akhir.

Anda menerapkan variabel placeholder untuk melakukan hal berikut:

  • Data penghubung: Gunakan placeholder, seperti $userid atau $ip untuk menemukan kecocokan antara variabel peristiwa yang berbeda (misalnya, Anda dapat menggunakan $userid untuk menautkan ID pengguna di seluruh peristiwa login dan logout).
  • Hasil pengelompokan: Di bagian match, gunakan variabel placeholder untuk menentukan jendela output kueri Anda, seperti match: $userid over 1h.
  • Membuat hasil: Gunakan placeholder untuk merekam dan menampilkan titik data tertentu dalam output kueri Anda.

Misalnya, jika Anda menetapkan $user = principal.user.userid, variabel $user kini menyimpan nilai spesifik yang diekstrak dari peristiwa. Kemudian, Anda menggunakan $user di bagian match untuk mengelompokkan semua aktivitas yang terkait dengan pengguna tertentu tersebut.

Metode penelusuran statistik membantu Anda mendapatkan insight, tren, atau anomali dengan melakukan perhitungan di seluruh kumpulan peristiwa. Daripada menampilkan daftar log individual, alat ini memberikan ringkasan gabungan data Anda. Logika ini menggunakan bagian match (untuk pengelompokan) dan bagian outcome (untuk penghitungan). Bagian outcome mendukung fungsi agregasi, seperti count(), sum(), avg(), max(), min(), dan stddev().

Contoh berikut menggunakan logika kueri berikut:

  • events: Memfilter data mentah untuk upaya login yang gagal.
  • match: Menentukan peristiwa pengelompokan (berdasarkan userid).
  • outcome: Melakukan penggabungan statistik (jumlah peristiwa per pengguna).

Contoh: Menggabungkan aktivitas login yang gagal menggunakan fungsi outcome

Contoh berikut menggunakan fungsi agregasi bagian outcome (seperti count() atau sum()) untuk meringkas aktivitas login yang gagal.

  1. Gunakan bagian match untuk mengelompokkan peristiwa login yang gagal menurut userid:

    metadata.event_type = "USER_LOGIN"
    security_result.action = "FAIL"
    principal.user.userid != ""
    
    match:
      principal.user.userid
    
  2. Gunakan count login yang gagal untuk setiap pengguna ($failed_login_count), yang ditentukan oleh variabel outcome:

    metadata.event_type = "USER_LOGIN"
    security_result.action = "FAIL"
    principal.user.userid != ""
    
    match:
      principal.$user.userid
    
    outcome:
      $failed_login_count = count(metadata.id)
    
  3. Jalankan penelusuran ini untuk melihat hasilnya.

  4. Opsional: Tambahkan elemen waktu ke bagian match (dalam hal ini, day). Kemudian, perbarui variabel outcome agar lebih eksplisit ($daily_failed_login_count):

    metadata.event_type = "USER_LOGIN"
    security_result.action = "FAIL"
    principal.user.userid != ""
    $user =principal.user.userid
    
    match:
      principal.$user.userid by day
    
    outcome:
      $daily_failed_login_count = count(metadata.id)
    

Membuat widget dasbor dari penelusuran Anda

Anda dapat membuat widget dasbor dari penelusuran gabungan, seperti yang ditunjukkan dalam contoh membuat penelusuran pertama.

Setelah penelusuran divalidasi, Anda dapat menyimpannya sebagai widget dan menambahkannya ke dasbor, sebagai berikut:

  1. Saat Anda melihat hasilnya, klik tab Visualize > Add to Dashboard.
  2. Konfigurasi widget:
    1. Beri nama widget (misalnya, "Daily Failed Login").
    2. Pilih rentang waktu.
    3. Pilih apakah akan menambahkannya ke dasbor yang sudah ada atau baru.
    4. Klik Tambahkan.
  3. Opsional: Buat kueri langsung ke dasbor Anda. Atau, Anda dapat menyalin dasbor pilihan dan mengubah hasil edit pada kueri di dalamnya sebagai titik awal.
  4. Opsional: Anda dapat membuat dasbor kustom dan menambahkan widget ke dasbor tersebut menggunakan YARA-L. Untuk mengetahui detailnya, lihat Membuat dasbor kustom.

Mengonfigurasi dasbor

Saat Anda membuat dasbor baru, bagian events adalah titik awal yang wajib ada. Dari sana, Anda dapat menggunakan match (untuk mengelompokkan hasil) atau outcome (untuk menghitung output dan penggabungan).

Misalnya, Anda dapat memiliki dasbor dengan bagian events dan match, tempat dasbor Anda menampilkan tingkat keparahan ($severity) deteksi yang dikelompokkan menurut bucket by hour.

Contoh: Mengagregasi deret waktu menurut tingkat keparahan

Anda dapat membuat dasbor menggunakan bagian events dan match untuk menampilkan tingkat keparahan ($severity) deteksi yang dikelompokkan ke dalam bucket hour:

detection.detection.severity != "UNKNOWN_SEVERITY"
$severity = detection.detection.severity

match:
  $severity by hour

Contoh: Menggabungkan total dampak kritis

Demikian pula, Anda dapat membuat dasbor menggunakan bagian events dan outcome untuk melacak deteksi tingkat keparahan tinggi:

detection.detection.severity = "CRITICAL"
$severity = detection.detection.severity

outcome:
  $detection_count = count_distinct($severity)

Contoh: Memvisualisasikan volume deteksi menurut tingkat keparahan dari waktu ke waktu

Pada contoh berikut, Anda dapat menghitung deteksi penting dan menentukan rentang waktu melalui konsol. Dalam banyak kasus, Anda akan menggunakan bagian match dan outcome saat membuat visualisasi di dasbor:

detection.detection.severity != "UNKNOWN_SEVERITY"
$severity = detection.detection.severity

match:
  $severity by hour

outcome:
  $detection_count = count_distinct(detection.id)

Contoh: Menghitung frekuensi login pengguna

Contoh berikut berfokus pada penghitungan login_count untuk pengguna tertentu menggunakan bagian match dan outcome:

events:
  metadata.event_type = "USER_LOGIN"

match:
  target.user.userid

outcome:
  $login_count = count(metadata.id)

Membuat aturan

Aturan memerlukan bagian berikut:

  • meta: Berisi nama aturan dan detail deskriptif.
  • events: Menentukan sumber data dan filter menggunakan variabel peristiwa.
  • condition: Menentukan variabel peristiwa mana yang harus ada agar aturan dipicu.

Menentukan dan menggunakan variabel peristiwa

Variabel peristiwa berfungsi sebagai penampung logis, yang mengelompokkan filter sehingga Anda dapat mereferensikan aktivitas tertentu tersebut di seluruh penelusuran, aturan, atau dasbor.

Saat menentukan logika di bagian events, Anda dapat menggunakan variabel peristiwa (seperti $e) untuk merepresentasikan peristiwa tertentu (atau sekelompok peristiwa) yang cocok dengan kriteria Anda.

Contoh: Menentukan dan memfilter variabel peristiwa

Untuk menentukan variabel peristiwa (misalnya, $e), gunakan awalan di bagian events kueri Anda. Hal ini menyatakan bahwa peristiwa tersebut diwakili oleh variabel. Misalnya, ekspresi $e.principal.hostname = "dev" mengevaluasi setiap peristiwa untuk menentukan apakah nama host cocok persis.

$e.principal.hostname = "dev"
$e.metadata.event_type = "USER_LOGIN"

Kemudian, Anda dapat menggunakan variabel tersebut di bagian kueri lainnya untuk mereferensikan grup peristiwa tertentu tersebut (di bagian match, outcome, condition) dan kolom datanya.

Menyusun struktur dan sintaksis aturan

Gunakan struktur dan sintaksis aturan berikut untuk membantu Anda menentukan variabel, logika pengelompokan, dan nilai minimum pemicu:

Elemen Deskripsi Contoh
Struktur aturan Membungkus kueri Anda dalam blok rule dan menetapkan nama unik untuk mengidentifikasi deteksi. rule DailyFailedLoginAttempts { }
Bagian meta Wajib. Mencakup metadata deskriptif (seperti `author`, `description`, `severity`) untuk meningkatkan pengelolaan aturan dan memberikan konteks bagi tim Anda. Direkomendasikan sebagai praktik terbaik untuk pengelolaan aturan. author = "Alex"
severity = "Medium"
Variabel peristiwa Dalam kueri aturan, setiap kolom di bagian events diberi awalan variabel peristiwa (seperti $e) untuk merepresentasikan peristiwa tertentu (atau sekelompok peristiwa) yang cocok dengan kriteria Anda. Grup ini berfungsi sebagai pengelompokan filter logis.

Dalam contoh Mengonversi penelusuran Anda menjadi aturan YARA-L, $e merepresentasikan semua login pengguna yang gagal.
$e.metadata.event_type = "USER_LOGIN"
Variabel placeholder Menetapkan peristiwa ke nama umum yang dapat Anda rujuk nanti dalam kueri. Untuk mengetahui detailnya, lihat Menggunakan variabel placeholder. $userid = $e.principal.user.userid
Bagian match Menentukan pengelompokan dan menentukan periode waktu yang didukung. Dalam contoh Mengonversi penelusuran Anda menjadi aturan YARA-L, pengelompokan match: $userid over day mengelompokkan peristiwa dengan benar menurut ID pengguna dalam setiap periode 24 jam (1d).

Saat menulis aturan, Anda harus menentukan periode waktu yang didukung untuk menentukan periode lihat kembali. Anda dapat menerapkan jendela hop, sliding, atau tumbling, bergantung pada persyaratan logika Anda. Menggunakan operator over secara eksplisit akan membuat jendela hop.
$userid over 1d
Bagian outcome Melakukan penggabungan statistik atau merekam variabel tertentu untuk membuat pemberitahuan yang dihasilkan lebih informatif.

Gunakan fungsi count() pada $e.metadata.id untuk menggabungkan peristiwa dalam setiap grup match. Anda juga dapat menetapkan variabel, seperti $userid, untuk mengambil kolom UDM tertentu dan memberikan lebih banyak konteks dalam output deteksi yang dihasilkan.
$failed_count = count($e.metadata.id)
Bagian condition Diperlukan agar aturan dapat menghasilkan deteksi.

Menentukan nilai minimum deteksi Anda di bagian condition. Misalnya, penggunaan #e > 5 mengharuskan jumlah peristiwa melebihi lima (5) untuk memicu pemberitahuan. Jika Anda tidak melakukan penghitungan, Anda tetap memerlukan bagian condition dan menyatakan keberadaan variabel peristiwa (misalnya, #e).

Analisis dasar pengukuran lingkungan Anda untuk menetapkan nilai minimum yang dapat mendeteksi aktivitas mencurigakan sekaligus meminimalkan positif palsu. Jika Anda tidak melakukan penghitungan, Anda tetap memerlukan bagian condition dan cukup menyatakan keberadaan variabel peristiwa, seperti #e.
#e > 5 atau $e

Untuk memahami cara kerja struktur ini, lihat contoh berikut.

Contoh: Mendeteksi serangan brute force (beberapa kali login gagal)

Contoh berikut mendeteksi beberapa upaya login yang gagal untuk satu pengguna dalam jangka waktu 24 jam:

rule DailyFailedLoginAttempts {
  meta:
    author = "Alex"
    description = "Detects multiple failed login attempts for a single user within a day."
    severity = "Medium"

  events:
    $e.metadata.event_type = "USER_LOGIN"
    $e.security_result.action = "FAIL"
    $e.principal.user.userid != ""
    $userid = $e.principal.user.userid

  match:
    $userid over 1d

  outcome:
    $daily_failed_login_count = count($e.metadata.id)

  condition:
    $daily_failed_login_count > 5
}

Untuk mengonversi kueri penelusuran yang telah diselesaikan menjadi aturan yang andal untuk membuat deteksi, Anda biasanya mengikuti langkah-langkah berikut:

  1. Di Google SecOps, buka Editor Aturan.
  2. Mulai aturan baru.
  3. Tempel kueri penelusuran dan ubah agar sesuai dengan struktur aturan, termasuk:
    • Bagian meta: Menentukan aturan metadata, termasuk nama aturan, penulis, dan tingkat keparahan
    • Bagian event: Wajib. Tidak seperti di penelusuran, Anda harus memiliki header bagian event` bernama.
    • Variabel peristiwa: Mendeklarasikan dan mereferensikan peristiwa tertentu (atau grup peristiwa) dalam logika Anda.
    • Bagian match dengan jendela waktu yang didukung: Menentukan kunci pengelompokan dan menentukan parameter waktu (misalnya, 5m atau 1d). Catatan: Jika Anda menggunakan bagian match dalam aturan, Anda harus menambahkan jendela waktu.
    • Bagian condition: Menentukan logika atau nilai minimum akhir yang harus dipenuhi untuk memicu aturan.

Lanjutan: Membuat aturan multiperistiwa

Anda menggunakan aturan multi-peristiwa untuk menghubungkan berbagai jenis aktivitas yang terjadi dalam jangka waktu tertentu. Daripada melihat satu peristiwa, Anda menghubungkan beberapa peristiwa, seperti pengguna yang login lalu segera melakukan download file yang tidak biasa, untuk mengidentifikasi ancaman yang kompleks.

Aturan multi-peristiwa memerlukan bagian berikut:

  • meta: Berisi nama aturan dan detail deskriptif.
  • events: Menentukan sumber data dan filter menggunakan variabel peristiwa.
  • match: Menetapkan jangka waktu dan variabel placeholder yang digunakan untuk menghubungkan peristiwa Anda.
  • outcomeMencatat konteks tambahan untuk pemberitahuan. Aturan multi-peristiwa memerlukan fungsi agregasi.
  • condition: Menentukan variabel peristiwa mana yang harus ada agar aturan dipicu.

Untuk membuat aturan multi-peristiwa, lakukan hal berikut:

  1. Tentukan variabel peristiwa Anda: Di bagian peristiwa, tentukan $e1 untuk merekam peristiwa "PROCESS_LAUNCH" dan $e2 untuk merekam hash file berbahaya tertentu.
  2. Korelasikan dengan placeholder: Gunakan variabel placeholder $user untuk menghubungkan dua aliran peristiwa yang berbeda ini dengan ID pengguna utama bersama (misalnya, $user = $e1.principal.user.userid and $user = $e2.principal.user.userid).
  3. Mengelompokkan pertandingan: Di bagian match, Anda menentukan bahwa peristiwa ini harus terjadi untuk $user yang sama dalam jangka waktu yang ditetapkan, seperti 5 menit (5m).

Contoh: Membuat aturan multi-peristiwa

Dalam contoh berikut, $e1 mewakili peristiwa PROCESS_LAUNCH dan $e2 mewakili peristiwa dengan hash berbahaya tertentu. Variabel placeholder $user mengorelasikan peristiwa ini dengan ID pengguna utama yang sama.

rule MultiEventExample {
  meta:
    author = "Alex"
    description = "Detects a bad hash execution or a process launch from a specific IP for the same user."

  events:
    $e1.principal.ip = "1.1.1.1"
    $e1.metadata.event_type = "PROCESS_LAUNCH"
    $e2.target.file.sha256 = "badhash..."
    $user = $e1.principal.user.userid
    $user = $e2.principal.user.userid

  match:
    $user over 5m

  condition:
    $e1 or $e2
}

Komponen aturan berikut menjelaskan logika yang digunakan dalam contoh:

  • Variabel peristiwa: Menentukan dua variabel peristiwa, $e1 dan $e2. Menggunakan variabel placeholder $user untuk menggabungkan peristiwa ini pada kolom userid umum.
  • Bagian match: Menyertakan bagian match untuk aturan multi-peristiwa ini guna mengelompokkan menurut pengguna dan menentukan periode waktu lompatan lima menit (5m) untuk mengorelasikan peristiwa.
  • condition: Menentukan logika untuk memicu pemberitahuan. Contoh ini memicu notifikasi jika peristiwa pertama atau kedua ada.

Menggunakan alat lain untuk membuat kueri

Alat ini adalah pendamping penting untuk menulis, memvalidasi, dan mempercepat adopsi YARA-L:

  • Alat Penelusuran UDM: Telusuri dan rujuk nama kolom, definisi, dan jenis data UDM dengan cepat langsung dalam UI. Jika ID kolom tidak diketahui, prioritaskan untuk memeriksa referensi ini.
  • Penelusuran bahasa alami ke YARA-L: Di kotak penelusuran, masukkan deskripsi untuk membuat draf kueri awal atau mendapatkan atau menerjemahkan saran YARA-L yang sesuai.
  • SPL → YARA-L Translator (alat Labs): Jika Anda beralih dari platform pesaing, gunakan alat ini (tersedia di bagian Labs) untuk mengonversi kueri SPL Splunk lama menjadi YARA-L. Cara ini menghasilkan titik awal terstruktur, yang mempercepat migrasi dan menyempurnakan logika deteksi Anda. Untuk menggunakan alat Labs, di Google SecOps, buka yourinstancename.chronicle.security/labs.

Langkah berikutnya

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