Sintaksis bagian Condition

Didukung di:

Dokumen ini menjelaskan cara menggunakan bagian condition dari kueri YARA-L 2.0.

Dampak bagian condition bergantung pada apakah Anda menjalankan kueri ad-hoc atau men-deploy aturan persisten sebagai berikut:

  • Untuk Penelusuran dan Dasbor: Berfungsi sebagai pemfilteran pascaproses, hanya menampilkan dan merender data yang memenuhi ekspresi yang ditentukan.
  • Aturan Deteksi (wajib): Berfungsi sebagai logika pemicu. Peringatan hanya dipicu jika kondisi diselesaikan menjadi true untuk periode match tertentu.

Gunakan bagian condition untuk menentukan ekspresi yang memfilter peristiwa dan variabel placeholder. Saat digunakan dalam kueri penelusuran atau dasbor, hanya output yang memenuhi kondisi yang akan ditampilkan. Jika digunakan dalam aturan deteksi, kondisi harus dipenuhi untuk memicu pemberitahuan.

Di bagian condition, Anda dapat menggunakan operator boolean, operator perbandingan, dan hasil variabel outcome untuk menentukan apakah kueri harus dipicu.

Menentukan bagian condition

Tentukan ekspresi kondisi untuk peristiwa dan variabel placeholder dari bagian condition. Anda dapat menentukan kondisi match untuk variabel dari bagian events dan, secara opsional, menggunakan kata kunci and untuk menyertakan logika berdasarkan bagian outcome. Untuk mengetahui detailnya, lihat Sintaksis bagian hasil.

Anda dapat menggabungkan ekspresi menggunakan kata kunci and atau or:

  • Gunakan and di antara kondisi.

  • Gunakan or hanya jika kueri berisi satu variabel peristiwa.

Gunakan karakter # di bagian condition sebelum nama variabel peristiwa atau placeholder untuk merepresentasikan jumlah peristiwa atau nilai unik yang memenuhi semua kondisi di bagian events. Contoh:

#c > 1 berarti variabel c harus muncul lebih dari 1 kali.

Gunakan karakter $ di bagian condition sebelum nama variabel hasil untuk merepresentasikan nilai hasil tersebut. Jika digunakan sebelum nama variabel peristiwa atau placeholder (misalnya, $event), ini mewakili #event > 0.

Contoh aturan ini menampilkan deteksi jika ada lebih dari lima (seperti yang ditentukan di bagian condition) login yang gagal untuk setiap pengguna dalam jangka waktu 10 menit (seperti yang ditentukan di bagian match):

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

  outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

  condition:
    #e >= 5
}

Kondisi terbatas dan tidak terbatas

Anda dapat menggunakan kondisi terbatas atau tidak terbatas dalam kueri:

  • Kondisi terikat memaksa variabel peristiwa terkait untuk ada, yang berarti setidaknya satu kemunculan peristiwa harus muncul dalam deteksi. Berikut adalah kondisi yang dibatasi:

    $var // equivalent to #var > 0

    #var > n // where n >= 0

    #var >= m // where m > 0

  • Kondisi tidak terbatas dapat digunakan untuk mendeteksi tidak adanya peristiwa selama jangka waktu tertentu; misalnya, peristiwa ancaman tanpa peristiwa mitigasi dalam periode 10 menit. Kondisi tanpa batas memungkinkan variabel peristiwa terkait tidak ada (kueri tidak ada), yang berarti tidak ada kemunculan peristiwa dalam deteksi dan setiap referensi ke kolom pada variabel peristiwa menghasilkan nilai nol.

    Berikut adalah kondisi tanpa batas:

    !$var // equivalent to #var = 0

    #var >= 0

    #var < n // where n > 0

    #var <= m // where m >= 0

Persyaratan untuk kueri tidak ada

Agar kueri tidak ada dapat dikompilasi, kueri tersebut harus memenuhi persyaratan berikut:

  • Setidaknya satu peristiwa UDM harus memiliki kondisi yang dibatasi (yaitu, setidaknya satu peristiwa UDM harus ada).
  • Jika placeholder memiliki kondisi tidak terbatas, placeholder tersebut harus dikaitkan dengan setidaknya satu peristiwa UDM terbatas.
  • Jika entitas memiliki kondisi yang tidak terikat, entitas tersebut harus dikaitkan dengan setidaknya satu peristiwa UDM terikat.

Contoh: kueri tidak ada

Pertimbangkan kueri berikut dengan bagian kondisi yang dihilangkan:

rule NonexistenceExample {
  meta:
      author = "Google Security"
      description = "Example: non-existence query."
  events:
      $u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
      $u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
      $e1.graph.metadata.entity_type = "FILE"        // $e1 is an entity.
      $e2.graph.metadata.entity_type = "FILE"        // $e2 is an entity.

      $user = $u1.principal.user.userid // Match variable is required for multi-event query.

      // Placeholder Associations:
      //   u1        u2
      //   |  \    /
      // port   ip
      //   |       \
      //   e1        e2
      $u1.target.port = $port
      $e1.graph.entity.port = $port
      $u1.principal.ip = $ip
      $u2.target.ip = $ip
      $e2.graph.entity.ip = $ip

      // UDM-Entity Associations:
      // u1 - u2
      // |  \  |
      // e1   e2
      $u1.metadata.event_type = $u2.metadata.event_type
      $e1.graph.entity.hostname = $u1.principal.hostname
      $e2.graph.entity.hostname = $u1.target.hostname
      $e2.graph.entity.hostname = $u2.principal.hostname

  match:
    $user over 5m

  condition:
      //Add valid condition
}

Bagian kondisi yang valid

Berikut adalah contoh yang valid untuk bagian kondisi:

  • $u1 and !$u2 and $e1 and $e2
    • Semua peristiwa dan entity UDM ada di bagian kondisi.
    • Setidaknya satu peristiwa UDM memiliki batas.
  • $u1 and !$u2 and $e1 and !$e2
    • $e2 tidak terikat dan diizinkan karena terkait dengan $u1, yang terikat. Jika $e2 tidak dikaitkan dengan $u1, hal ini tidak valid.
  • #port > 50 and #ip = 0
    • Tidak ada peristiwa dan entity UDM di bagian kondisi; namun, placeholder yang ada mencakup semua peristiwa dan entity UDM.
    • $ip ditetapkan ke $u1 dan $u2, serta #ip = 0 adalah kondisi yang tidak terikat. Namun, kondisi terikat lebih kuat daripada kondisi tidak terikat. Karena $port ditetapkan ke $u1 dan #port > 50 adalah kondisi terbatas, $u1 masih dibatasi.

Bagian kondisi tidak valid

Berikut adalah contoh yang tidak valid untuk bagian kondisi:

  • $u1 and $e1
    • Setiap peristiwa dan entitas UDM yang muncul di bagian events harus muncul di bagian condition (atau memiliki placeholder yang ditetapkan untuknya yang muncul di bagian condition).
  • $u1, $u2, $e1, $u2, #port > 50
    • Koma tidak diizinkan sebagai pemisah kondisi.
  • !$u1 and !$u2 and $e1 and $e2
    • Melanggar persyaratan pertama bahwa setidaknya satu peristiwa UDM dibatasi.
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • Kata kunci or tidak didukung dengan kondisi yang tidak terikat.
  • ($u1 or $u2) and $e1 and $e2
    • Kata kunci or tidak didukung di antara variabel peristiwa yang berbeda.
  • not $u1 and $u2 and $e1 and $e2
    • Kata kunci not tidak diizinkan untuk kondisi acara dan placeholder.
  • #port < 50 and #ip = 0
    • Meskipun placeholder mereferensikan semua peristiwa dan entity UDM, setiap kondisi terkait tidak dibatasi. Artinya, tidak ada peristiwa UDM yang dibatasi, sehingga menyebabkan aturan gagal dikompilasi.

Kondisi hasil

Anda dapat menyertakan kondisi untuk variabel hasil di bagian condition, yang digabungkan dengan kata kunci and atau or, atau diawali dengan kata kunci not.

Kondisional hasil ditentukan secara berbeda bergantung pada jenis variabel hasil:

  • bilangan bulat: bandingkan dengan literal bilangan bulat dengan operator =, >, >=, <, <=, != Misalnya: $risk_score > 10

  • float: bandingkan dengan literal float menggunakan operator =, >, >=, <, <=, != Misalnya: $risk_score <= 5.5

  • string: bandingkan dengan literal string menggunakan = atau != Misalnya: $severity = "HIGH"

  • daftar bilangan bulat atau array: tentukan kondisi menggunakan fungsi arrays.contains Misalnya: arrays.contains($event_ids, "id_1234")

Jika Anda menentukan kondisi hasil dalam kueri yang memiliki bagian match, kueri tersebut diklasifikasikan sebagai kueri multi-peristiwa untuk kuota kueri. Lihat Sintaksis pencocokan untuk mengetahui informasi selengkapnya tentang klasifikasi peristiwa tunggal dan ganda.

Pembatasan

  • Hindari penggunaan variabel match di bagian condition. Ini adalah kesalahan semantik karena peristiwa dikelompokkan menurut nilai variabel match.

  • Hindari hanya menentukan kondisi tanpa batas pada semua variabel event yang ditetapkan ke variabel match. Ini adalah error semantik. Agar nilai variabel match ditampilkan, setidaknya harus ada satu peristiwa yang berisi nilai tersebut.

  • Jika menggunakan jendela geser, variabel peristiwa titik tumpu harus disertakan dalam setidaknya satu kondisi terikat.

Apa langkah selanjutnya?

Informasi tambahan

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