Statistik dan agregasi dalam penelusuran melalui 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 volume besar peristiwa UDM yang dihasilkan di lingkungan Anda, penting untuk memahami tren dalam data penelusuran UDM Anda. Anda dapat menggunakan statistik dan fungsi agregat untuk mendapatkan insight yang dapat ditindaklanjuti dari log UDM Anda. 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 dan aset terkait, seperti host yang berkomunikasi dengan alamat IP berbahaya yang diketahui.

  • Mendeteksi perilaku anomali: Anda dapat mengidentifikasi lonjakan aktivitas yang mungkin mengindikasikan insiden keamanan, seperti lonjakan traffic jaringan yang tidak terduga atau login di luar jam kerja.

  • 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 mengetahui 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.

  • Cocokkan (opsional): menentukan kolom yang akan dikelompokkan. Untuk mengetahui informasi selengkapnya, lihat Sintaksis bagian kecocokan.

  • 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, nilai defaultnya adalah asc.

  • Batas (opsional): menetapkan jumlah maksimum baris yang ditampilkan 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. Daftar ini dipangkas 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 unik dalam bentuk daftar. Fungsi ini memangkas daftar hingga maksimum 25 elemen acak. Penghapusan duplikat untuk mendapatkan daftar unik 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 angka. 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 acara yang target.ip-nya tidak kosong. Untuk semua peristiwa yang cocok dengan 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 grup 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 unik dalam grup. Fungsi ini sering digunakan dengan match untuk mendapatkan jumlah 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 dari nilai 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 acara yang target.ip-nya tidak kosong. Untuk semua peristiwa yang cocok dengan principal.ip, simpan nilai maksimum metadata.event_timestamp.seconds dalam variabel bernama max_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $max_seconds = max(metadata.event_timestamp.seconds)

mnt

min(numericExpression)

Deskripsi

Fungsi min menampilkan nilai minimum dari nilai 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 acara yang target.ip-nya tidak kosong. Untuk semua peristiwa yang cocok dengan principal.ip, simpan nilai 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 acara yang target.ip-nya tidak kosong. Untuk semua peristiwa yang cocok di principal.ip, simpan jumlah network.sent_bytes dalam variabel bernama sent_bytes.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $sent_bytes = sum(network.sent_bytes)

stddev

stddev(numericExpression)

Deskripsi

Fungsi stddev menampilkan simpangan baku untuk semua kemungkinan nilai.

Jenis data parameter

NUMBER

Jenis hasil yang ditampilkan

NUMBER

Contoh Kode

Contoh

Temukan semua acara yang target.ip-nya tidak kosong. Untuk semua peristiwa yang cocok di principal.ip, simpan standar deviasi metadata.event_timestamp.seconds dalam variabel bernama stddev_seconds.

  target.ip != ""
  match:
    principal.ip
  outcome:
    $stddev_seconds = stddev(metadata.event_timestamp.seconds)

paling awal

earliest(timestamp)

Deskripsi

Fungsi earliest menampilkan stempel waktu paling awal dari sekumpulan data dengan resolusi mikrodetik.

Jenis data parameter

TIMESTAMP

Jenis hasil yang ditampilkan

TIMESTAMP

Contoh Kode

Contoh

Untuk semua peristiwa yang cocok di hostname, simpan metadata.event_timestamp paling awal di variabel start.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $start = earliest(metadata.event_timestamp)

terbaru

latest(timestamp)

Deskripsi

Fungsi latest menampilkan stempel waktu terbaru dari sekumpulan rekaman dengan resolusi mikrodetik.

Jenis data parameter

TIMESTAMP

Jenis hasil yang ditampilkan

TIMESTAMP

Contoh Kode

Contoh

Untuk semua peristiwa yang cocok pada hostname, simpan metadata.event_timestamp terbaru di variabel end.

  $hostname = principal.hostname
  match:
    $hostname
  outcome:
    $end = latest(metadata.event_timestamp)

YARA-L 2.0: penelusuran versus penggunaan UDM

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

  • Kueri penelusuran UDM tidak menyertakan bagian condition dan option.

Kelompokkan menurut perincian waktu

Anda dapat mengelompokkan kolom peristiwa dan placeholder di bagian match menurut perincian waktu yang ditentukan, mirip dengan mengelompokkan kolom di SQL.

Sintaksisnya adalah sebagai berikut:

match:
  ... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]

Untuk mengelompokkan menurut perincian waktu, Anda dapat menggunakan kata kunci by atau over every. 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 memiliki fungsi yang setara. Anda dapat menggunakan salah satunya.

Contoh

Kelompokkan alamat IP dan nama host per jam.

$hostname = principal.hostname
match:
  $hostname, target.ip by hour

Kelompokkan 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 perincian waktu 1m. Jika hasilnya dikelompokkan menurut host (h1,h2), kolom yang ditampilkan adalah (h1, 1m) dan (h2, 1m), dengan rentang waktu lainnya 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 entitas yang valid selama rentang waktu. Dalam kueri ini, seluruh rentang waktu dipertimbangkan karena kata kunci first tidak ada.

graph.entity.hostname != ""
match:
  graph.entity.ip by hour
outcome:
  $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)

Membuat dan menyimpan visualisasi dalam 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

Untuk membuat dan menyimpan visualisasi yang akan ditambahkan ke dasbor, 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 hasil di tab Statistik dan Visualisasi.

  3. Di 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 Tambahkan ke dasbor, 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.