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.

Saat menangani peristiwa UDM dalam jumlah besar yang dihasilkan di 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.

Kasus penggunaan untuk kueri statistik

Anda dapat menggunakan kueri statistik untuk kasus penggunaan berikut:

  • Melacak metrik penting: Anda dapat mengukur distribusi dan frekuensi peristiwa UDM serta aset terkait, seperti host yang berkomunikasi dengan alamat IP berbahaya yang diketahui.

  • Mendeteksi perilaku yang tidak wajar: Anda dapat mengidentifikasi lonjakan aktivitas yang mungkin menunjukkan insiden keamanan, seperti lonjakan traffic jaringan yang tidak terduga atau login selama jam non-operasional.

  • Menganalisis tren dari waktu ke waktu: Anda dapat menilai perubahan postur keamanan untuk mengevaluasi efektivitas kontrol atau mengidentifikasi area yang perlu ditingkatkan, seperti memantau fluktuasi jumlah kerentanan dari waktu ke waktu.

Anda dapat mengelompokkan dan mengurutkan hasil kueri penelusuran UDM menggunakan sintaksis yang mirip dengan struktur YARA-L yang digunakan dalam aturan mesin deteksi. Untuk informasi selengkapnya, lihat Sintaksis bahasa YARA-L 2.0.

Struktur kueri YARA-L 2.0 adalah sebagai berikut:

  • Pernyataan pemfilteran: menentukan kondisi untuk memfilter peristiwa.

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

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

  • Urutan: menentukan urutan hasil kueri sebagai asc (naik) atau desc (turun). Jika urutan (asc atau desc) tidak ditentukan, urutan tersebut akan ditetapkan secara default ke asc.

  • Limit (opsional): menetapkan 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:

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)

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)

jumlah

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)

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)

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)

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)

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)

YARA-L 2.0: penelusuran versus penggunaan UDM

  • Kata kunci over, yang digunakan untuk penelusuran periode peristiwa, tidak didukung dalam penelusuran.

  • Kueri penelusuran UDM tidak menyertakan bagian condition dan option.

Mengelompokkan menurut perincian waktu

Anda dapat mengelompokkan kolom peristiwa dan placeholder di bagian match berdasarkan granularitas waktu yang ditentukan, mirip dengan mengelompokkan kolom 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 sebagai berikut:

  • 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 bersifat opsional dan berlaku untuk satu stempel waktu. Artinya, untuk sumber data yang valid selama rentang waktu, kata kunci first hanya mempertimbangkan waktu mulai (<start_time>).

Misalnya, pertimbangkan entity dengan rentang waktu (1m, 5m) dengan granularitas waktu 1m. Jika hasilnya dikelompokkan menurut host (h1,h2), kolom yang ditampilkan akan menjadi (h1, 1m) dan (h2, 1m), dengan sisa rentang waktu diabaikan.

Kata kunci first dapat ditambahkan ke by dan over every, sehingga 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)

Membuat dan menyimpan visualisasi di penelusuran

Bagian ini menguraikan kemampuan visualisasi data dalam penelusuran Model Data Terpadu (UDM) Google SecOps. Fitur ini memungkinkan analis Security Operations Center (SOC) mendeteksi, menyelidiki, dan merespons ancaman secara efisien dengan membuat visualisasi dari hasil penelusuran dan menyimpannya ke dasbor.

Membuat dan menyimpan visualisasi ke Dasbor Native

Untuk membuat dan menyimpan visualisasi yang akan ditambahkan ke Dasbor Native, lakukan tindakan berikut:

  1. Tulis kueri YARA-L dengan bagian match dan outcome.

  2. Pilih rentang tanggal, lalu klik Jalankan Penelusuran untuk menjalankan kueri. Lihat hasilnya di tab Statistik dan Visualisasi.

  3. Pada tab Visualize, lakukan hal berikut: a. Pilih jenis diagram dari daftar Jenis diagram. b. Sesuaikan setelan di bagian Setelan Data untuk menyesuaikan diagram.

  4. Di layar Add to dashboard, lakukan hal berikut: a. Masukkan nama diagram, deskripsi, dan rentang waktu. b. Pilih untuk menambahkan diagram ke dasbor yang ada atau membuat dasbor baru.

  5. Klik Tambahkan ke Dasbor untuk menambahkan diagram ke dasbor.

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