Statistik dan agregasi dalam penelusuran UDM menggunakan YARA-L 2.0
Halaman ini menjelaskan cara menjalankan kueri statistik pada peristiwa UDM dan mengelompokkan hasilnya untuk analisis menggunakan YARA-L 2.0.
Ringkasan
Saat menangani peristiwa UDM dalam jumlah besar yang dihasilkan dalam lingkungan Anda, penting untuk memahami tren dalam data penelusuran UDM. Anda dapat menggunakan statistik dan fungsi agregat untuk mendapatkan insight yang bisa ditindaklanjuti dari log UDM. Penelusuran UDM mendukung semua fungsi agregat di YARA-L 2.0.
Anda dapat menggunakan kueri statistik untuk kasus penggunaan berikut:
Melacak metrik penting: Anda dapat mengukur distribusi dan frekuensi peristiwa UDM serta aset yang terlibat, seperti host yang berkomunikasi dengan alamat IP berbahaya yang diketahui.
Mendeteksi perilaku anomali: Anda dapat mendeteksi pola atau lonjakan aktivitas yang tidak biasa yang dapat menunjukkan insiden keamanan, seperti volume traffic jaringan yang tidak biasa atau aktivitas login yang tidak terduga selama jam yang tidak biasa.
Menganalisis tren dari waktu ke waktu: Anda dapat mengidentifikasi perubahan postur keamanan untuk mengevaluasi dampak kontrol atau menemukan area yang perlu ditingkatkan, seperti melacak perubahan jumlah kerentanan dari waktu ke waktu.
Struktur kueri YARA-L 2.0 dalam penelusuran
Anda dapat mengelompokkan dan mengurutkan hasil kueri penelusuran UDM menggunakan sintaksis yang mirip dengan struktur YARA-L dalam aturan mesin deteksi. Untuk informasi selengkapnya, lihat Sintaksis bahasa YARA-L 2.0.
Struktur kueri adalah sebagai berikut:
Pernyataan pemfilteran: Pernyataan pemfilteran menentukan kondisi untuk memfilter peristiwa.
Pencocokan (opsional): Bagian pencocokan menentukan kolom yang akan digunakan untuk mengelompokkan. Untuk mengetahui informasi selengkapnya, lihat Sintaksis bagian Pencocokan.
Hasil: Bagian hasil menentukan output kueri. Untuk informasi selengkapnya, lihat Sintaksis bagian hasil.
Urutan: Bagian urutan menentukan urutan hasil kueri yang ditampilkan. Jika urutan (
asc
ataudesc
) tidak ditentukan, urutan tersebut akan ditetapkan secara default keasc
.Batas (opsional): Bagian batas menentukan jumlah maksimum baris yang ditampilkan oleh kueri.
Berikut adalah contoh penggunaan urutan dan batas:
metadata.log_type = "OKTA"
match:
principal.ip
Outcome:
$user_count_by_ip = count(principal.user.userid)
order:
$user_count_by_ip desc
limit:
20
Agregasi
Penelusuran UDM mendukung fungsi agregat berikut:
jumlah
sum(numericExpression)
Deskripsi
Fungsi sum
menampilkan jumlah nilai dalam kolom numerik. Fungsi ini mengabaikan
nilai NULL
selama penghitungan. Fungsi ini sering digunakan dengan match
untuk menghitung jumlah dalam berbagai grup dalam data.
Jenis data parameter
NUMBER
Jenis hasil yang ditampilkan
NUMBER
Contoh Kode
Contoh
Temukan semua peristiwa dengan target.ip
yang tidak kosong. Untuk semua peristiwa yang cocok di principal.ip
, simpan jumlah network.sent_bytes
dalam variabel yang disebut sent_bytes
.
target.ip != ""
match:
principal.ip
outcome:
$sent_bytes = sum(network.sent_bytes)
mnt
min(numericExpression)
Deskripsi
Fungsi min
menampilkan nilai minimum dalam kolom numerik. Fungsi ini
sering digunakan dengan match
untuk mendapatkan nilai minimum dalam setiap
grup dalam data.
Jenis data parameter
NUMBER
Jenis hasil yang ditampilkan
NUMBER
Contoh Kode
Contoh
Temukan semua peristiwa dengan target.ip
yang tidak kosong. Untuk semua peristiwa yang cocok di principal.ip
, simpan minimum metadata.event_timestamp.seconds
dalam variabel bernama min_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$min_seconds = min(metadata.event_timestamp.seconds)
maks
max(numericExpression)
Deskripsi
Fungsi max
menampilkan nilai maksimum dalam kolom numerik.
Fungsi ini sering digunakan dengan match
untuk mendapatkan nilai maksimum dalam setiap grup dalam
data.
Jenis data parameter
NUMBER
Jenis hasil yang ditampilkan
NUMBER
Contoh Kode
Contoh
Temukan semua peristiwa dengan target.ip
yang tidak kosong. Untuk semua peristiwa yang cocok di principal.ip
, simpan maksimum metadata.event_timestamp.seconds
dalam variabel yang disebut max_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$max_seconds = max(metadata.event_timestamp.seconds)
rata-rata
avg(numericExpression)
Deskripsi
Fungsi avg
menampilkan rata-rata nilai dalam kolom numerik. Fungsi ini
mengabaikan nilai NULL
selama penghitungan. Fungsi ini sering digunakan
dengan match
untuk menghitung rata-rata dalam grup tertentu dalam data.
Jenis data parameter
NUMBER
Jenis hasil yang ditampilkan
NUMBER
Contoh Kode
Contoh
Temukan semua peristiwa dengan target.ip
yang tidak kosong. Untuk semua peristiwa yang cocok di principal.ip
, simpan rata-rata metadata.event_timestamp.seconds
dalam variabel bernama avg_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$avg_seconds = avg(metadata.event_timestamp.seconds)
count
count(expression)
Deskripsi
Fungsi count
menampilkan jumlah baris dalam grup. Fungsi ini sering digunakan
dengan match
untuk mendapatkan jumlah kelompok tertentu dalam data.
Jenis data parameter
STRING
Jenis hasil yang ditampilkan
NUMBER
Contoh Kode
Contoh
Menampilkan jumlah login pengguna yang berhasil dari waktu ke waktu.
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count(metadata.id)
count_distinct
count_distinct(expression)
Deskripsi
Fungsi count_distinct
menampilkan jumlah baris yang memiliki nilai
yang berbeda dalam grup. Fungsi ini sering digunakan dengan match
untuk mendapatkan jumlah untuk
grup tertentu dalam data.
Jenis data parameter
STRING
Jenis hasil yang ditampilkan
NUMBER
Contoh Kode
Contoh
Menampilkan jumlah login pengguna yang berhasil dan berbeda dari waktu ke waktu.
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count_distinct(metadata.id)
array
array(expression)
Deskripsi
Fungsi array
menampilkan semua nilai dalam bentuk daftar. Fungsi ini memotong daftar menjadi maksimum 25 elemen acak.
Jenis data parameter
STRING
Jenis hasil yang ditampilkan
LIST
Contoh Kode
Contoh
Menampilkan array yang berisi jenis peristiwa.
$event_type = metadata.event_type
outcome:
$event_type_array = array($event_type)
array_distinct
array_distinct(expression)
Deskripsi
Fungsi array_distinct
menampilkan semua nilai yang berbeda dalam bentuk
daftar. Fungsi ini memotong daftar menjadi maksimum 25 elemen acak. Penghapusan duplikat untuk mendapatkan daftar yang berbeda diterapkan sebelum pemotongan.
Jenis data parameter
STRING
Jenis hasil yang ditampilkan
LIST
Contoh Kode
Contoh
Menampilkan array yang berisi jenis peristiwa yang berbeda.
$event_type = metadata.event_type
outcome:
$event_type_array = array_distinct($event_type)
stddev
stddev(numericExpression)
Deskripsi
Fungsi stddev
menampilkan simpangan baku dari semua kemungkinan
nilai.
Jenis data parameter
NUMBER
Jenis hasil yang ditampilkan
NUMBER
Contoh Kode
Contoh
Temukan semua peristiwa dengan target.ip
yang tidak kosong. Untuk semua peristiwa yang cocok di principal.ip
, simpan deviasi standar metadata.event_timestamp.seconds
dalam variabel yang disebut stddev_seconds
.
target.ip != ""
match:
principal.ip
outcome:
$stddev_seconds = stddev(metadata.event_timestamp.seconds)
Perbedaan antara penggunaan YARA-L 2.0 dalam penelusuran dan penggunaannya dalam UDM
Kata kunci
over
, yang memungkinkan penelusuran peristiwa dalam periode, tidak berlaku dalam penelusuran.Struktur kueri penelusuran UDM tidak menyertakan bagian
condition
danoption
.
Mengelompokkan menurut perincian waktu
Anda dapat mengelompokkan semua kolom peristiwa dan placeholder di bagian match
menurut granularitas waktu yang ditentukan, mirip dengan kolom yang dapat Anda kelompokkan di SQL.
Sintaksisnya adalah sebagai berikut:
match:
... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]
Untuk mengelompokkan menurut tingkat perincian waktu, Anda dapat menggunakan kata kunci by
atau over
every
. Tingkat perincian waktu yang diizinkan adalah:
MINUTE
ataum
HOUR
atauh
DAY
ataud
WEEK
atauw
MONTH
ataumo
Kata kunci by
dan over every
setara secara fungsional. Anda dapat
menggunakan salah satunya.
Contoh
Menggabungkan alamat IP dan nama host berdasarkan jam.
$hostname = principal.hostname
match:
$hostname, target.ip by hour
Mengelompokkan jumlah semua peristiwa menurut nama host dan menurut hari terjadinya peristiwa.
$hostname = target.hostname
match:
$hostname over every day
outcome:
$events_count = count($hostname)
Beberapa sumber data, seperti konteks entity, valid selama rentang waktu
(<start_time>
, <end_time>
) dan tidak memiliki stempel waktu tunggal.
Kata kunci first
adalah kata kunci opsional yang memperlakukan sumber data yang
valid selama rentang waktu seolah-olah sumber data tersebut hanya valid pada
stempel waktu tunggal. Artinya, untuk sumber data yang valid selama rentang waktu,
kata kunci first
hanya mempertimbangkan waktu mulai (<start_time>
),
tanpa mempertimbangkan waktu akhir rentang waktu.
Misalnya, pertimbangkan entity yang memiliki rentang waktu (1m, 5m
) dengan granularitas waktu 1 m. Asumsikan bahwa hasilnya dikelompokkan menurut host, yaitu
[h1, h2
]. Kolom yang kemudian ditampilkan adalah (h1, 1m
) dan (h2,
1m
) karena sisa rentang waktu diabaikan.
Kata kunci first
dapat ditambahkan ke by
dan over every
, yang menghasilkan
perilaku yang sama untuk keduanya. Penggunaan by first
setara dengan
over every first
.
Berikut adalah contoh kueri yang menggunakan operator by
dengan
sumber data konteks entity yang valid selama rentang waktu. Dalam kueri ini, seluruh rentang waktu dipertimbangkan karena kata kunci first
dihilangkan.
graph.entity.hostname != ""
match:
graph.entity.ip by hour
outcome:
$min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)