Kolom berulang
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_originalmemenuhiany $e.principal.ip = "192.0.2.1"event_originalgagalany $e.repeated_field.field_a = "9.9.9.9"
all- Jika semua elemen kolom berulang memenuhi kondisi, acara secara keseluruhan memenuhi kondisi. Contoh:event_originalmemenuhinet.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8")event_originalgagalall $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 dengan192.168.12.16, yang berarti kueri memeriksa apakah setidaknya satu alamat IP tidak cocok dengan192.168.12.16all $e.principal.ip != "192.168.12.16"memeriksa apakah semua alamat IP tidak cocok dengan192.168.12.16, yang berarti kueri memeriksa bahwa tidak ada alamat IP yang cocok dengan192.168.12.16
Batasan:
- Operator
anydanallhanya kompatibel dengan kolom berulang (bukan kolom skalar). anydanalltidak dapat digunakan untuk menggabungkan dua kolom berulang. Misalnya,any $e1.principal.ip = $e2.principal.iptidak valid.- Operator
anydanalltidak 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
anyatauallberoperasi pada daftar dievent_original. - Ekspresi pada kolom berulang yang tidak menggunakan
anyatauallberoperasi pada peristiwaevent_copy_nindividual.
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 menghasilkantrue.
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 keint) tidak dihitung. - Pengindeksan array tidak dapat digabungkan dengan
anyatauall. 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 karenaintermediarydanipadalah kolom berulang, tetapi hanya ada indeks untukip.
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.