Menerapkan gabungan dalam penelusuran dan dasbor

Didukung di:

Gabungan membantu mengorelasikan data dari beberapa sumber untuk memberikan lebih banyak konteks untuk investigasi. Dengan menautkan peristiwa, entity, dan data lain yang terkait, Anda dapat menyelidiki skenario serangan yang kompleks dan memvisualisasikan tren.

Dokumen ini menjelaskan cara menggunakan operasi gabungan dalam penelusuran dan dasbor Google Security Operations. Dokumen ini juga membahas jenis gabungan, kasus penggunaan, dan praktik terbaik yang didukung.

Membuat gabungan

Hanya gabungan berbasis statistik yang didukung. Anda harus menentukannya di bagian match kueri.

Jendela waktu korelasi (jendela kecocokan) bergantung pada apakah Anda menggunakan penelusuran atau dasbor:

  • Penelusuran: Hingga 48 jam.
  • Dasbor: Hingga 365 hari (untuk sebagian besar sumber data).

Anda dapat membuat gabungan dengan menghubungkan kolom secara langsung (misalnya, $e1.hostname = $e2.hostname) atau menggunakan variabel placeholder. Saat menentukan gabungan di bagian match, Anda harus menggunakan variabel placeholder.

Contoh kueri berikut menggabungkan dua kolom dengan tanda sama dengan (=) dan variabel placeholder bersama:

  • Contoh 1:

    
    events:
    
      // Assign a value from the first event to the placeholder variable $user
    
      $user = $e1.principal.user.userid
    
      // The second assignment creates an implicit join, linking $e2 to $e1
    
      // where the user ID is the same.
    
      $user = $e2.principal.user.userid
    
    match:
    
      $user over 1h
    
    condition:
    
      $e1 and $e2
    
    
  • Contoh 2:

    
    $e1.principal.ip = $ip
    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e1.principal.hostname = $host
    
    $e2.target.ip = $ip
    
    $e2.principal.hostname = "altostrat"
    
    $e2.target.hostname = $host
    
    match:
      $ip, $host over 5m
    
    

Jenis gabungan yang didukung

Bagian ini menjelaskan berbagai jenis gabungan yang dapat Anda gunakan. Contoh di bagian ini menunjukkan sintaksis yang digunakan dalam penelusuran. Untuk mengetahui informasi tentang gabungan di dasbor, lihat Gabungan di dasbor.

Gabungan peristiwa-peristiwa

  • Gabungan peristiwa-peristiwa menghubungkan dua peristiwa Universal Data Model (UDM) yang berbeda. Contoh kueri berikut menautkan peristiwa USER_LOGIN dengan peristiwa lain untuk menemukan nama host (altostrat) yang berinteraksi dengan pengguna, berdasarkan alamat IP umum:

    
    $e1.principal.ip = $ip
    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e2.target.ip = $ip
    
    $e2.principal.hostname = "altostrat"
    
    match:
    
      $ip over 5m
    
    

Gabungan peristiwa-ECG

  • Gabungan Peristiwa-ECG menghubungkan peristiwa UDM dengan entity dari Entity Context Graph (ECG). Contoh kueri berikut menemukan peristiwa NETWORK_CONNECTION dan ASSET dari grafik entity yang memiliki nama host yang sama dalam jangka waktu 1 jam:

    
    events:
    
      $e1.metadata.event_type = "NETWORK_CONNECTION"
    
      $g1.graph.metadata.entity_type = "ASSET"
    
      $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    
      $x = $g1.graph.entity.asset.hostname
    
    match:
    
      $x over 1h
    
    condition:
    
      $e1 and $g1
    
    

Gabungan tabel data-peristiwa

  • Gabungan tabel data-peristiwa menghubungkan peristiwa UDM dengan entri dalam tabel data kustom. Hal ini berguna untuk memeriksa data peristiwa langsung terhadap daftar yang ditentukan pengguna, seperti alamat IP atau pelaku ancaman berbahaya yang diketahui. Contoh kueri berikut menggabungkan peristiwa NETWORK_CONNECTION dengan tabel data untuk menemukan koneksi yang melibatkan alamat IP tertentu dari daftar tersebut:

    
    $ip = %DATATABLE_NAME.COLUMN_NAME
    
    $ip = $e1.principal.ip
    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    match:
    
      $ip over 1h
    
    

Praktik terbaik

  • Kueri gabungan dapat menggunakan banyak resource karena menggabungkan banyak hasil. Filter umum yang luas dapat menyebabkan kueri gagal, terkadang setelah penundaan yang lama, misalnya:

    • target.ip != ""

    • metadata.event_type = "NETWORK_CONNECTION" (jika jenis peristiwa ini sangat umum di lingkungan Anda)

  • Sebaiknya gabungkan filter umum dengan filter yang lebih spesifik untuk mengurangi jumlah total peristiwa yang perlu diproses oleh kueri. Filter luas seperti target.ip != "" harus dipasangkan dengan filter yang lebih spesifik untuk meningkatkan performa kueri, misalnya:

    $e1.metadata.log_type = $log
    $e1.metadata.event_type = "USER_LOGIN"
    $e1.target.ip != ""
    
    $e2.metadata.log_type = $log
    $e2.principal.ip = "10.0.0.76"
    $e2.target.hostname != "altostrat"
    
    match:
    $log over 5m
    

Jika kueri Anda masih lambat, Anda juga dapat mengurangi rentang waktu keseluruhan kueri (misalnya, dari 30 hari menjadi satu minggu).

Untuk mengetahui informasi selengkapnya, lihat praktik terbaik YARA-L.

Gabungan di dasbor

Dasbor mendukung rentang sumber data yang lebih luas dan jendela korelasi yang lebih lama daripada penelusuran.

Sumber data yang didukung

Di dasbor, Anda dapat menggabungkan data dari sumber berikut menggunakan awalan YARA-L masing-masing:

Awalan Sumber Data
case Kasus dan pemberitahuan
case_history Tren aktivitas di seluruh siklus proses kasus
detection Histori deteksi aturan dan masukan analis
ingestion Volume log dan metrik kesehatan penyerapan
ioc Kecocokan IoC (indikator penyusupan)
playbook Metrik eksekusi playbook dan respons otomatis
ruleset / rules Metadata tentang kumpulan aturan aktif
graph Data Entity Graph (ECG)
events Peristiwa UDM

Kepekaan huruf besar/kecil

Tidak seperti penelusuran yang tidak peka huruf besar/kecil secara default, dasbor peka huruf besar/kecil. Untuk melakukan gabungan atau penelusuran yang tidak peka huruf besar/kecil di dasbor, gunakan pengubah nocase.

Contoh: Menggabungkan kasus dan case_history

Anda dapat mengorelasikan metadata kasus dengan aktivitas historisnya dengan menggabungkan ID Kasus unik.

  • Contoh berikut menggabungkan sumber data case dan case_history untuk menghitung jumlah total tindakan historis untuk setiap kasus prioritas tinggi.

      // 1. Establish the Join using a shared placeholder variable ($case_id)
      $h.case_history.case_response_platform_info.case_id = $case_id
      $c.case.response_platform_info.response_platform_id = $case_id
    
      // 2. Apply Filters
      $c.case.priority = "PRIORITY_HIGH"
    
      // 3. Group the correlated data by the Case ID
      match:
        $case_id
    
      // 4. Calculate the selected metrics to display on the dashboard
      outcome:
        $case_name = array_distinct($c.case.display_name)
        $total_historical_actions = count($h.case_history.case_activity)
    

Kasus penggunaan lanjutan: Menghitung MTTR

Untuk metrik yang lebih kompleks seperti Mean Time to Resolve (MTTR) atau Mean Time to Close (MTTC), Anda dapat menggunakan kueri multi-tahap. Hal ini memungkinkan Anda menghitung durasi untuk setiap kasus di tahap pertama, lalu menghitung rata-rata durasi tersebut secara global di blok hasil akhir.

  • Kueri berikut menghitung waktu rata-rata untuk menutup kasus (dalam menit) di semua kasus di "Lingkungan Default".

    stage stage1 {
      // 1. Establish the Join
      $h.case_history.case_response_platform_info.case_id = $case_id
      $c.case.response_platform_info.response_platform_id = $case_id
    
      // 2. Filter by specific environment
      $c.case.environment = "Default Environment"
    
      // 3. Group by Case ID to process per case
      match:
        $case_id
    
      // 4. Calculate the Time to Close (TTC) for each case individually
      outcome:
        $case_close_time = max(if($h.case_history.case_activity = "CLOSE_CASE", $h.case_history.event_time.seconds, 0))
        $status = array_distinct($h.case_history.case_activity)
    
        // Subtract the very first event time (creation) from the close time
        $TTC = $case_close_time - min($h.case_history.event_time.seconds)
    
      // 5. Filter to ensure the case has a complete lifecycle
      condition:
        arrays.contains($status, "CREATE_CASE") and
        arrays.contains($status, "CLOSE_CASE")
    }
    
    // 6. Global Aggregation: Calculate the Mean (Average) across all processed cases
    outcome:
      $case_count = count($stage1.case_id)
      $MTTC = (math.round(avg($stage1.TTC) / 60))
    

Batasan

Batasan berikut berlaku saat menggunakan gabungan:

  • Anda dapat menggunakan maksimum dua peristiwa UDM per kueri dalam penelusuran.

  • Anda dapat menggunakan maksimum satu peristiwa ECG per kueri dalam penelusuran.

  • Anda dapat menggunakan maksimum dua Tabel Data per kueri.

  • Anda tidak dapat menggabungkan peristiwa tabel data, UDM, dan ECG dalam satu kueri.

  • Rentang waktu kueri maksimum adalah 90 hari.

  • Jendela waktu match maksimum adalah 48 jam untuk penelusuran dan 365 hari untuk dasbor.

  • Gabungan didukung di antarmuka pengguna dan EventService.UDMSearch API, tetapi tidak di SearchService.UDMSearch API.

Kasus penggunaan umum

Bagian ini mencantumkan beberapa cara umum untuk menggunakan gabungan.

Mendeteksi pencurian dan penggunaan kredensial

Tujuan: Menemukan instance saat pengguna berhasil login, lalu dengan cepat menghapus file sistem penting. Hal ini dapat menunjukkan pengambilalihan akun atau aktivitas orang dalam yang berbahaya.

Jenis gabungan: Gabungan Peristiwa-Peristiwa

Deskripsi: Kueri ini menghubungkan dua peristiwa berbeda yang tidak mencurigakan dengan sendirinya, tetapi menjadi sangat mencurigakan jika terjadi bersamaan. Kueri ini pertama-tama mencari peristiwa USER_LOGIN, lalu peristiwa FILE_DELETION. Keduanya digabungkan oleh user.userid umum dengan jendela waktu yang singkat.

  • Contoh kueri:

    
    // Event 1: A user successfully logs in
    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e1.security_result.action = "ALLOW"
    
    $e1.principal.user.userid = $user
    
    // Event 2: The same user deletes a critical file
    
    $e2.metadata.event_type = "FILE_DELETION"
    
    $e2.target.file.full_path = /etc\/passwd|C:\\Windows\\System32\\/
    
    $e2.principal.user.userid = $user
    
    match:
      $user over 10m
    
    condition:
      $e1 and $e2
    

Mengidentifikasi koneksi berisiko dari aset penting

Tujuan: Memperkaya data jaringan langsung dengan informasi aset untuk menemukan koneksi keluar dari server yang tidak boleh berkomunikasi dengan domain eksternal yang jarang digunakan (misalnya, server database produksi).

Jenis gabungan: Gabungan Peristiwa-ECG

Deskripsi: Satu koneksi jaringan ke domain yang jarang digunakan mungkin bukan prioritas tinggi. Namun, kueri ini meningkatkan pentingnya peristiwa tersebut dengan menggabungkannya dengan Entity Context Graph (ECG). Kueri ini secara khusus mencari peristiwa NETWORK_CONNECTION yang berasal dari aset yang diberi label "Server Database Penting" di grafik entity.

  • Contoh kueri:

    
    events:
      $e.metadata.event_type = "NETWORK_CONNECTION"
    
      $e.target.domain.prevalence.day_count <= 5
    
      $asset.graph.metadata.entity_type = "ASSET"
    
      $asset.graph.entity.asset.labels.value = "Critical Database Server"
    
      $e.principal.asset.hostname = $asset.graph.entity.asset.hostname
    
      $host = $e.principal.asset.hostname
    
    match:
      $host over 1h
    
    condition:
      $e and $asset
    
    

Mencari IOC pelaku ancaman

Tujuan: Secara aktif mencari Indikator Gangguan (IoC) dengan memeriksa semua kueri DNS langsung terhadap daftar domain yang diketahui digunakan oleh pelaku ancaman tertentu.

Jenis gabungan: Gabungan Tabel Data-Peristiwa

Deskripsi: Tim threat intelligence Anda mengelola tabel data bernama ThreatActor_Domains yang mencantumkan domain berbahaya. Kueri ini menggabungkan semua peristiwa NETWORK_DNS_QUERY real-time dengan tabel data ini. Kueri ini akan segera menampilkan instance saat host di jaringan Anda mencoba me-resolve domain dari daftar threat intelligence Anda.

  • Contoh kueri:

    
    // Datatable: Get the list of malicious domains
    
    $domain = %DATATABLE_NAME.COLUMN_NAME
    
    // Event: A DNS query is made
    
    $e.metadata.event_type = "NETWORK_DNS"
    
    $e.network.dns.questions.name = $domain
    
    match:
      $domain over 5m
    
    condition:
      $e
    

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