Sintaksis bagian kecocokan

Didukung di:

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 before untuk membuat jendela geser yang berakhir dengan setiap kemunculan peristiwa pivot.
  • Gunakan kata kunci after untuk 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

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