Sintaksis bagian kecocokan
Bagian match menyediakan parameter yang diperlukan untuk mengorelasikan beberapa peristiwa terkait menjadi satu deteksi. Kolom ini hanya diperlukan untuk aturan yang menautkan
dua atau beberapa peristiwa berbeda. Gunakan untuk menentukan kriteria korelasi ini
dengan menentukan hal berikut:
Mengelompokkan kolom (Kunci): Kolom tertentu dari peristiwa (ditetapkan di bagian
events) yang harus memiliki nilai yang sama agar peristiwa dapat ditautkan secara logis.Batasan waktu: Jangka waktu berkelanjutan yang di dalamnya peristiwa terkait harus terjadi untuk membentuk satu kecocokan yang lengkap. Ini hanya diperlukan untuk Aturan dan tidak diperlukan untuk Penelusuran dan Dasbor.
Menentukan bagian kecocokan
Aturan memerlukan variabel kecocokan sebagai placeholder yang ditentukan di bagian event. Anda juga dapat menentukan kolom event di Penelusuran dan Dasbor.
Gunakan variabel placeholder yang ditentukan di bagian events untuk menentukan periode waktu terjadinya peristiwa. Setiap peristiwa yang cocok yang terjadi di luar periode waktu yang ditentukan akan diabaikan untuk grup deteksi tertentu tersebut.
Gunakan kata kunci over dan sintaksis <number><m/h/d> (dengan m/h/d adalah menit, jam, dan hari) untuk menentukan jangka waktu. Anda dapat menentukan durasi minimum satu menit dan maksimum 48 jam.
Contoh aturan ini mendeteksi login yang gagal yang terjadi dalam jangka waktu 10 menit. Mengorelasikan beberapa upaya login yang gagal dalam jangka waktu singkat sering kali menunjukkan upaya akses tidak sah atau serangan brute force.
rule failed_logins
{
meta:
author = "Security Team"
description = "Detects multiple failed user logins within 10-minute windows."
severity = "HIGH"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
$user = $e.target.user.userid
match:
$user over 10m
condition:
#e >= 5
}
Bagian match menemukan pengguna yang gagal login di lokasi baru dalam interval 10 menit:
match:
$user over 10m
Nilai nol di bagian kecocokan
Google SecOps secara implisit memfilter nilai nol untuk semua placeholder yang digunakan di bagian match ("" untuk string, 0 untuk angka, false untuk boolean, nilai di posisi 0 untuk jenis yang di-enum).
Contoh: mengecualikan nilai nol
Contoh berikut mengilustrasikan kueri yang memfilter nilai nol.
rule ZeroValuePlaceholderExample {
meta:
events:
// Because $host is used in the match section, the query behaves
// as if the following predicate was added to the events section:
// $host != ""
$host = $e.principal.hostname
// Because $otherPlaceholder was not used in the match,
// there is no implicit filtering of zero values for $otherPlaceholder.
$otherPlaceholder = $e.principal.ip
match:
$host over 5m
condition:
$e
}Namun, jika placeholder ditetapkan ke fungsi, kueri tidak
secara implisit memfilter nilai nol placeholder yang digunakan di
bagian match.
Untuk menonaktifkan pemfilteran implisit nilai nol,
Anda dapat menggunakan opsi allow_zero_values di bagian opsi. Opsi allow_zero_values hanya tersedia di Aturan.
Contoh: izinkan nilai nol
Contoh berikut menggambarkan kueri yang tidak secara implisit memfilter nilai nol placeholder yang digunakan di bagian match:
rule ZeroValueFunctionPlaceholder {
meta:
events:
// Even though $ph is used in the match section, there is no
// implicit filtering of zero values for $ph, because $ph is assigned to a function.
$ph = re.capture($e.principal.hostname, "some-regex")
match:
$ph over 5m
condition:
$e
}Jendela waktu yang didukung
Anda dapat mengelompokkan kolom dan placeholder peristiwa di bagian match menurut perincian waktu yang ditentukan menggunakan salah satu periode yang didukung berikut.
- Periode hopping (periode yang tumpang-tindih)
- Periode tumbling (periode yang tidak tumpang-tindih)
- Periode tumbling (periode yang dihasilkan oleh poros)
Periode hop
Jangka waktu lompatan adalah jenis kueri multi-peristiwa yang mengelompokkan peristiwa yang cocok dengan kriteria kueri dalam jangka waktu tertentu, terlepas dari urutan terjadinya. Secara default, kueri YARA-L dengan bagian match menggunakan jendela hop untuk menghubungkan beberapa peristiwa dari waktu ke waktu. Rentang waktu eksekusi kueri dibagi menjadi serangkaian jendela hop yang tumpang-tindih, yang masing-masing memiliki durasi yang ditentukan di bagian match. Kemudian, peristiwa dikorelasikan dalam setiap periode hop.
Misalnya, untuk kueri yang dijalankan selama rentang waktu [1:00, 2:00], dengan
bagian match selama 30m, kemungkinan kumpulan jendela hop yang tumpang-tindih
yang dapat dibuat adalah [1:00, 1:30], [1:03, 1:33], dan [1:06, 1:36].
Jendela ini digunakan untuk menghubungkan beberapa peristiwa.
Periode tumbling
Periode tumbling menyegmentasikan aliran data ke dalam interval waktu berukuran tetap, tidak tumpang-tindih, dan berkelanjutan. Setiap peristiwa data hanya ditetapkan ke satu jendela. Hal ini berbeda dengan jendela geser atau lompat, yang dapat memiliki interval waktu yang tumpang-tindih.
Misalnya, dengan jendela pengelompokan 30 menit, peristiwa yang terjadi antara 1:00:00 dan 1:29:59 diproses bersama-sama. Kemudian, kumpulan peristiwa berikutnya, dari 1:30:00 hingga 1:59:59, diproses secara terpisah.
Jendela geser
Saat Anda perlu menelusuri peristiwa yang terjadi dalam urutan relatif tertentu (misalnya, e1terjadi hingga dua menit setelah e2), jendela geser sangat efektif. Jendela geser dibuat saat batasan waktu dimulai atau berakhir dengan variabel peristiwa utama yang ditentukan. Ini secara dinamis melacak urutan dan pengaturan waktu peristiwa relatif terhadap variabel peristiwa titik tumpu tertentu tersebut.
Kemudian, peristiwa dikorelasikan dalam setiap jendela geser. Hal ini memungkinkan Anda menelusuri peristiwa yang terjadi dalam urutan tertentu (misalnya, e1 terjadi dalam waktu 2 menit setelah e2). Terjadinya peristiwa e1 dan terjadinya peristiwa e2 berkorelasi jika peristiwa e1 terjadi dalam durasi periode geser setelah peristiwa e2.
- Jendela geser didasarkan pada variabel peristiwa titik pusat (
pivot-event-var). - Gunakan kata kunci
beforeuntuk membuat jendela geser yang berakhir dengan setiap kemunculan peristiwa pivot. - Gunakan kata kunci
afteruntuk membuat jendela geser yang dimulai dengan setiap kemunculan peristiwa pivot.
Tentukan periode geser di bagian match kueri sebagai berikut:
<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>
Contoh berikut menunjukkan jendela geser yang valid:
$var1, $var2 over 5m after $e1
$user over 1h before $e2
Catatan:
- Contoh jendela geser tambahan.
Menggunakan jendela geser, bukan jendela lompatan, diketahui menghasilkan performa yang lebih lambat. Sebaiknya gunakan jendela geser hanya untuk kasus tertentu, seperti saat urutan peristiwa sangat diperlukan atau saat mencari peristiwa yang tidak ada.
Karena jendela geser dirancang untuk mendeteksi beberapa peristiwa, sebaiknya Anda tidak menggunakan jendela geser untuk kueri satu peristiwa. Sebagai gantinya, gunakan salah satu solusi sementara berikut:
- Konversi kueri untuk menggunakan beberapa variabel peristiwa, dan perbarui bagian kondisi jika kueri memerlukan lebih dari satu kemunculan peristiwa.
- Atau, pertimbangkan untuk menambahkan filter stempel waktu, bukan menggunakan jendela geser. Contoh:
$permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds - Lepaskan jendela geser.
Langkah berikutnya
Informasi tambahan
- Ekspresi, operator, dan konstruksi yang digunakan di YARA-L 2.0
- Fungsi di YARA-L 2.0
- Membangun aturan deteksi komposit
- Contoh: Kueri YARA-L 2.0
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.