Sintaksis bagian kondisi

Didukung di:

Dokumen ini menjelaskan cara menggunakan bagian condition dari kueri YARA-L. Bagian condition digunakan dalam penelusuran, dasbor, dan diperlukan untuk aturan serta berisi logika untuk memfilter hasil lebih lanjut. Jika digunakan dalam kueri penelusuran atau dasbor, hanya akan menampilkan output yang memenuhi kondisi. 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 di bagian condition. Anda juga dapat menentukan kondisi kecocokan untuk peristiwa dan placeholder yang ditentukan di bagian events dan secara opsional menggunakan kata kunci and untuk menentukan kondisi kecocokan menggunakan variabel hasil yang ditentukan di bagian outcome. 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 menunjukkan 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 acara atau placeholder (misalnya, $event), ini mewakili #event > 0.

Contoh aturan ini menampilkan deteksi jika ada lebih dari lima (seperti yang ditentukan di bagian condition) kegagalan login 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 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 tanpa batas dapat digunakan untuk mendeteksi tidak adanya peristiwa selama jangka waktu tertentu; misalnya, peristiwa ancaman tanpa peristiwa mitigasi dalam jangka waktu 10 menit. Kondisi tanpa batas memungkinkan variabel peristiwa terkait tidak ada (kueri tidak ada), yang berarti kemungkinan 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 terikat (yaitu, setidaknya satu peristiwa UDM harus ada).
  • Jika memiliki kondisi yang tidak terikat, placeholder harus dikaitkan dengan setidaknya satu peristiwa UDM terikat.
  • Jika entitas memiliki kondisi yang tidak terikat, entitas tersebut harus dikaitkan dengan setidaknya satu peristiwa UDM yang 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 entitas UDM ada di bagian kondisi.
    • Setidaknya satu peristiwa UDM dibatasi.
  • $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 entitas UDM di bagian kondisi; namun, placeholder yang ada mencakup semua peristiwa dan entitas 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 yang dibatasi, $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 tanpa batas.
  • ($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 entitas UDM, setiap kondisi terkait tidak terikat. Artinya, tidak ada peristiwa UDM yang dibatasi, sehingga 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:

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

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

  • string: bandingkan dengan literal string dengan = 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 kecocokan 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 berdasarkan 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.