Kolom berulang

Didukung di:

Dalam Model Data Terpadu (UDM), beberapa kolom diberi label sebagai berulang, yang menunjukkan bahwa kolom tersebut adalah daftar nilai atau jenis pesan lainnya. Dokumen ini memberikan informasi tentang cara menggunakan ekspresi, placeholder, pengindeksan array, dan pesan berulang untuk kolom UDM berulang.

Ekspresi Boolean dan kolom berulang

Ekspresi boolean yang diubah dan tidak diubah dapat bertindak pada kolom berulang.

Pertimbangkan peristiwa berikut:

event_original {
  principal {
    // ip is a repeated field
    ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]

    hostname: "host"
  }
}

Ekspresi yang diubah

Gunakan pengubah any dan all dalam ekspresi di kolom berulang.

  • any - Jika ada elemen kolom berulang yang memenuhi kondisi, peristiwa secara keseluruhan memenuhi kondisi. Contoh:

    • event_original memenuhi any $e.principal.ip = "192.0.2.1"
    • event_original gagal any $e.repeated_field.field_a = "9.9.9.9"
  • all - Jika semua elemen kolom berulang memenuhi kondisi, acara secara keseluruhan memenuhi kondisi. Contoh:

    • event_original memenuhi net.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8")
    • event_original gagal all $e.principal.ip = "192.0.2.2"

Saat menulis kondisi dengan any atau all, perhatikan bahwa meniadakan kondisi dengan not mungkin tidak memiliki arti yang sama dengan menggunakan operator yang dinegasi.

Contoh:

  • not all $e.principal.ip = "192.168.12.16" memeriksa apakah tidak semua alamat IP cocok dengan 192.168.12.16, yang berarti kueri memeriksa apakah setidaknya satu alamat IP tidak cocok dengan 192.168.12.16
  • all $e.principal.ip != "192.168.12.16" memeriksa apakah semua alamat IP tidak cocok dengan 192.168.12.16, yang berarti kueri memeriksa bahwa tidak ada alamat IP yang cocok dengan 192.168.12.16

Batasan:

  • Operator any dan all hanya kompatibel dengan kolom berulang (bukan kolom skalar).
  • any dan all tidak dapat digunakan untuk menggabungkan dua kolom berulang. Misalnya, any $e1.principal.ip = $e2.principal.ip tidak valid.
  • Operator any dan all tidak didukung dengan ekspresi daftar referensi.

Ekspresi yang tidak dimodifikasi

Dengan ekspresi yang tidak dimodifikasi, setiap elemen dalam kolom berulang diperlakukan secara terpisah. Jika kolom berulang peristiwa berisi n elemen, kueri akan diterapkan pada n salinan peristiwa, dengan setiap salinan memiliki salah satu elemen kolom berulang. Salinan ini bersifat sementara dan tidak disimpan.

Aturan diterapkan pada salinan berikut:

salinan acara principal.ip principal.hostname
event_copy_1 "192.0.2.1" "host"
event_copy_2 "192.0.2.2" "host"
event_copy_3 "192.0.2.3" "host"

Jika salinan peristiwa memenuhi semua kondisi yang tidak diubah pada kolom berulang, peristiwa secara keseluruhan memenuhi semua kondisi. Oleh karena itu, jika Anda memiliki beberapa kondisi pada kolom berulang, satu salinan peristiwa harus memenuhi semua kondisi tersebut. Contoh kueri berikut menggunakan contoh set data sebelumnya untuk menunjukkan perilaku ini.

Contoh: Ekspresi yang tidak diubah

Aturan berikut menampilkan satu kecocokan saat dijalankan terhadap set data contoh event_original, karena event_copy_1 memenuhi semua predikat peristiwa:

rule repeated_field_1 {
  meta:
  events:
    net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/8") // Checks if IP address matches 192.x.x.x
    $e.principal.ip = "192.0.2.1"
  condition:
    $e
}

Aturan berikut tidak menampilkan kecocokan saat dijalankan terhadap set data contoh event_original, karena tidak ada salinan peristiwa di $e.principal.ip yang memenuhi _semua_ predikat peristiwa.

rule repeated_field_2 {
  meta:
  events:
    $e.principal.ip = "192.0.2.1"
    $e.principal.ip = "192.0.2.2"
  condition:
    $e
}

Ekspresi yang diubah pada kolom berulang kompatibel dengan ekspresi yang tidak diubah pada kolom berulang karena daftar elemen sama untuk setiap salinan peristiwa. Pertimbangkan aturan berikut:

rule repeated_field_3 {
  meta:
  events:
    any $e.principal.ip = "192.0.2.1"
    $e.principal.ip = "192.0.2.3"
  condition:
    $e
}

Aturan diterapkan pada salinan berikut:

salinan acara principal.ip $e.principal.ip
event_copy_1 "192.0.2.1" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
event_copy_2 "192.0.2.2" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
event_copy_3 "192.0.2.3" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]

Dalam hal ini, semua salinan memenuhi any $e.principal.ip = "192.0.2.1", tetapi hanya event_copy_3 yang memenuhi $e.principal.ip = "192.0.2.3". Akibatnya, acara secara keseluruhan akan cocok.

Cara lain untuk memahami jenis ekspresi ini adalah:

  • Ekspresi pada kolom berulang yang menggunakan any atau all beroperasi pada daftar di event_original.
  • Ekspresi pada kolom berulang yang tidak menggunakan any atau all beroperasi pada peristiwa event_copy_n individual.

Placeholder dan kolom berulang

Kolom berulang berfungsi dengan penetapan placeholder. Mirip dengan ekspresi yang tidak diubah pada kolom berulang, salinan peristiwa dibuat untuk setiap elemen. Dengan menggunakan contoh event_copy yang sama, placeholder mengambil nilai kolom berulang event_copy_n, untuk setiap salinan peristiwa dengan n adalah nomor salinan peristiwa. Jika placeholder digunakan di bagian kecocokan, hal ini dapat menghasilkan beberapa kecocokan.

Contoh: Placeholder kolom berulang

Contoh berikut menghasilkan satu kecocokan. Placeholder `$ip` sama dengan `192.0.2.1` untuk `event_copy_1`, yang memenuhi predikat dalam aturan. Contoh peristiwa kecocokan berisi satu elemen, `event_original`.

// Generates 1 match.
rule repeated_field_placeholder1 {
  meta:
  events:
    $ip = $e.principal.ip
    $ip = "192.0.2.1"
    $host = $e.principal.hostname

  match:
    $host over 5m

  condition:
    $e
}

Contoh berikut menghasilkan tiga kecocokan. Placeholder $ip sama dengan nilai yang berbeda, untuk setiap salinan event_copy_n yang berbeda. Pengelompokan dilakukan pada $ip karena berada di bagian kecocokan. Oleh karena itu, Anda akan mendapatkan tiga kecocokan dengan setiap kecocokan memiliki nilai yang berbeda untuk variabel kecocokan $ip. Setiap kecocokan memiliki contoh peristiwa yang sama: satu elemen, event_original.

// Generates 3 matches.
rule repeated_field_placeholder2 {
  meta:
  events:
    $ip = $e.principal.ip
    net.ip_in_range_cidr($ip, "192.0.2.0/8") // Checks if IP matches 192.x.x.x

  match:
    $ip over 5m

  condition:
    $e
}

Hasil menggunakan placeholder yang ditetapkan ke kolom berulang

Penampung ditetapkan ke setiap elemen dari setiap kolom berulang, bukan seluruh daftar. Saat digunakan di bagian outcome, hasilnya dihitung hanya menggunakan elemen yang memenuhi bagian sebelumnya.

Pertimbangkan aturan berikut:

rule outcome_repeated_field_placeholder {
  meta:
  events:
    $ip = $e.principal.ip
    $ip = "192.0.2.1" or $ip = "192.0.2.2"
    $host = $e.principal.hostname

  match:
    $host over 5m

  outcome:
    $o = array_distinct($ip)

  condition:
    $e
}

Ada empat tahap eksekusi untuk aturan ini. Tahap pertama adalah penyalinan peristiwa:

salinan acara $ip $host $e
event_copy_1 "192.0.2.1" "host" event_id
event_copy_2 "192.0.2.2" "host" event_id
event_copy_3 "192.0.2.3" "host" event_id

Bagian peristiwa kemudian akan memfilter baris yang tidak cocok dengan filter:

salinan acara $ip $host $e
event_copy_1 "192.0.2.1" "host" event_id
event_copy_2 "192.0.2.2" "host" event_id

event_copy_3 difilter karena "192.0.2.3" tidak memenuhi $ip = "192.0.2.1" or $ip = "192.0.2.2".

Bagian match kemudian akan dikelompokkan berdasarkan variabel kecocokan dan bagian outcome akan melakukan agregasi pada setiap grup:

$host $o $e
"host" ["192.0.2.1", "192.0.2.2"] event_id

$o = array_distinct($ip) dihitung menggunakan $ip dari tahap sebelumnya, bukan tahap penyalinan peristiwa.

Terakhir, bagian condition akan memfilter setiap grup. Karena aturan ini hanya memeriksa keberadaan $e, baris dari sebelumnya akan menghasilkan satu deteksi.

$o tidak berisi semua elemen dari $e.principal.ip karena tidak semua elemen memenuhi semua kondisi di bagian peristiwa. Namun, semua elemen e.principal.ip akan muncul dalam contoh peristiwa karena contoh peristiwa menggunakan event_original.

Pengindeksan array

Anda dapat melakukan pengindeksan array pada kolom berulang. Untuk mengakses elemen kolom berulang ke-n, gunakan sintaksis daftar standar (elemen diindeks 0). Elemen di luar batas akan menampilkan nilai default.

  • $e.principal.ip[0] = "192.168.12.16"
  • $e.principal.ip[999] = "" Jika ada kurang dari 1.000 elemen, fungsi ini akan menghasilkan true.

Batasan:

  • Indeks harus berupa literal bilangan bulat non-negatif. Misalnya, $e.principal.ip[-1] tidak valid.
  • Nilai yang memiliki jenis int (misalnya, placeholder yang ditetapkan ke int) tidak dihitung.
  • Pengindeksan array tidak dapat digabungkan dengan any atau all. Misalnya, any $e.intermediary.ip[0] tidak valid.
  • Pengindeksan array tidak dapat digabungkan dengan sintaksis peta. Misalnya, $e.additional.fields[0]["key"] tidak valid.
  • Jika jalur kolom berisi beberapa kolom berulang, semua kolom berulang harus menggunakan pengindeksan array. Misalnya, $e.intermediary.ip[0] tidak valid karena intermediary dan ip adalah kolom berulang, tetapi hanya ada indeks untuk ip.

Pesan berulang

Jika kolom message diulang, efek yang tidak diinginkan adalah mengurangi kemungkinan kecocokan. Hal ini diilustrasikan dalam contoh berikut.

Pertimbangkan peristiwa berikut:

event_repeated_message {
  // about is a repeated message field.
  about {
    // ip is a repeated string field.
    ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]

    hostname: "alice"
  }
  about {
    hostname: "bob"
  }
}

Seperti yang dinyatakan untuk ekspresi yang tidak diubah pada kolom berulang, salinan sementara peristiwa dibuat untuk setiap elemen kolom berulang. Pertimbangkan aturan berikut:

rule repeated_message_1 {
  meta:
  events:
    $e.about.ip = "192.0.2.1"
    $e.about.hostname = "bob"
  condition:
    $e
}

Aturan diterapkan pada salinan berikut:

salinan acara about.ip about.hostname
event_copy_1 "192.0.2.1" "alice"
event_copy_2 "192.0.2.2" "alice"
event_copy_3 "192.0.2.3" "alice"
event_copy_4 "" "bob"

Peristiwa tidak cocok dengan aturan karena tidak ada salinan peristiwa yang memenuhi semua ekspresi.

Pesan berulang dan pengindeksan array

Perilaku tidak terduga lainnya dapat terjadi saat menggunakan pengindeksan array dengan ekspresi yang tidak dimodifikasi pada kolom pesan berulang. Perhatikan contoh aturan berikut yang menggunakan pengindeksan array:

rule repeated_message_2 {
  meta:
  events:
    $e.about.ip = "192.0.2.1"
    $e.about[1].hostname = "bob"
  condition:
    $e
}

Aturan ini diterapkan ke salinan berikut:

salinan acara about.ip about[1].hostname
event_copy_1 "192.0.2.1" "bob"
event_copy_2 "192.0.2.2" "bob"
event_copy_3 "192.0.2.3" "bob"
event_copy_4 "" "bob"

Karena event_copy_1 memenuhi semua ekspresi dalam repeated_message_2, peristiwa cocok dengan aturan.

Hal ini dapat menyebabkan perilaku yang tidak terduga karena aturan repeated_message_1 tidak memiliki pengindeksan array dan tidak menghasilkan kecocokan, sedangkan aturan repeated_message_2 menggunakan pengindeksan array dan menghasilkan kecocokan.

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