Statistik dan agregasi dalam penelusuran UDM menggunakan YARA-L 2.0

Didukung di:

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.

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:

  1. Pernyataan pemfilteran: Pernyataan pemfilteran menentukan kondisi untuk memfilter peristiwa.

  2. Pencocokan (opsional): Bagian pencocokan menentukan kolom yang akan digunakan untuk mengelompokkan. Untuk mengetahui informasi selengkapnya, lihat Sintaksis bagian Pencocokan.

  3. Hasil: Bagian hasil menentukan output kueri. Untuk informasi selengkapnya, lihat Sintaksis bagian hasil.

  4. Urutan: Bagian urutan menentukan urutan hasil kueri yang ditampilkan. Jika urutan (asc atau desc) tidak ditentukan, urutan tersebut akan ditetapkan secara default ke asc.

  5. 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 dan option.

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 atau m
  • HOUR atau h
  • DAY atau d
  • WEEK atau w
  • MONTH atau mo

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)