Mengorelasikan data dengan outer join

Didukung di:

Dokumen ini menjelaskan outer join (left join dan right join). Operasi gabungan digunakan untuk mengorelasikan dan menggabungkan data dari beberapa sumber berdasarkan nilai kolom umum. Dengan menggabungkan peristiwa dan entitas keamanan terkait ke dalam satu tampilan yang komprehensif, Anda dapat menyediakan deteksi dan investigasi ancaman yang efektif.

Tidak seperti gabungan standar (inner), yang memerlukan entri yang cocok di kedua sumber data, outer join mengambil semua data dari satu sisi gabungan, meskipun tidak ada entri yang cocok di sisi lainnya. Kolom yang tidak cocok dari sisi lain biasanya diisi dengan null. Tindakan ini mencegah Anda kehilangan data yang tidak memiliki kecocokan.

Cara kerja outer join

Konsep gabungan luar di YARA-L 2.0 identik dengan gabungan luar SQL standar:

  • Left outer join mempertahankan semua data dari sisi kiri gabungan.

  • Right outer join mempertahankan semua data dari sisi kanan gabungan.

Sintaksis outer join (left join dan right join) didukung untuk semua kueri–baik dengan maupun tanpa kondisi match.

Memahami left outer join

Left outer join (atau left join) mempertahankan semua data dari sumber data di sisi kiri kata kunci left join.

  • Jika data dari sisi kiri tidak cocok dengan peristiwa kanan, kolom dari peristiwa kanan akan ditampilkan sebagai null.

  • Implikasi placeholder: Setiap variabel placeholder yang digunakan di bagian match harus merujuk ke kolom dari peristiwa kiri untuk memastikan agregasi data yang akurat di seluruh set hasil.

Contoh left join dari peristiwa ke peristiwa

Contoh berikut menunjukkan left outer join untuk mengorelasikan peristiwa login pengguna dengan peristiwa koneksi jaringan berikutnya yang terjadi di host yang sama. Gabungan kiri memastikan bahwa semua peristiwa USER_LOGIN dipertahankan dalam set hasil. Jika peristiwa NETWORK_CONNECTION yang cocok ($e2) ditemukan, datanya akan digabungkan. Jika tidak ditemukan kecocokan, kolom untuk $e2 adalah null.


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname

Tentukan peristiwa kiri

Contoh kueri berikut menentukan sisi kiri gabungan ($e1), yaitu kumpulan peristiwa yang dipertahankan dalam hasil akhir:

$e1.metadata.event_type = "USER_LOGIN"

Tabel berikut menampilkan hasil kueri, yang mengidentifikasi kumpulan awal peristiwa login pengguna:

Jenis peristiwa Nama host utama Alamat IP
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50
USER_LOGIN kiosk-4 192.168.1.104

Menentukan peristiwa yang tepat

Contoh kueri berikut menentukan sisi kanan gabungan ($e2), yang merupakan set peristiwa yang dicocokkan dengan peristiwa kiri:

$e2.metadata.event_type = "NETWORK_CONNECTION"

Tabel berikut menampilkan kumpulan peristiwa koneksi jaringan yang tersedia untuk pencocokan:

Jenis peristiwa Nama host utama Alamat IP
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION kiosk-4 203.0.113.3

Bergabung dalam acara

dengan bagian pertandingan

Contoh berikut menunjukkan kueri kecocokan menggunakan left outer join pada kolom principal.hostname:


  $e1.metadata.event_type = "USER_LOGIN"

  $e2.metadata.event_type = "NETWORK_CONNECTION"

  left join $e1.principal.hostname = $e2.principal.hostname

  $host = $e1.principal.hostname

  match:
    $host over 5m

  • Left outer join memastikan bahwa setiap peristiwa USER_LOGIN ($e1) disertakan dalam set hasil akhir.

  • Placeholder $host diberi nilai dari $e1.principal.hostname. Outer join kiri memastikan keberadaan event $e1, sehingga memastikan bahwa variabel $host selalu diisi untuk agregasi.

  • Aturan ini menggabungkan hasil menurut host untuk rentang waktu 5 menit.

Hasil gabung

Data yang dihasilkan menunjukkan kombinasi kedua peristiwa. Semua data dari tabel kiri ($e1) dipertahankan, dan kolom dari tabel kanan ($e2) ditetapkan ke null jika tidak ada hostname yang cocok (misalnya, untuk server-db-03).

Jenis acara ($e1) Nama host utama ($host) Alamat IP ($e1) Jenis acara ($e2) Alamat IP ($e2) Status pencocokan
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION 192.168.1.101 Kecocokan ditemukan
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION 192.168.1.101 Kecocokan ditemukan
USER_LOGIN server-db-03 10.0.0.50 null null Tidak ada yang cocok
USER_LOGIN kiosk-4 192.168.1.104 NETWORK_CONNECTION 203.0.113.3 Kecocokan ditemukan

Contoh kueri left join

Bagian ini memberikan contoh kueri left join.

Bergabung dengan kondisi kecocokan

  • Entitas acara

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Event-datatable

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    match:
      $host by 5m
    

Gabungan tanpa kondisi kecocokan

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    $e1.principal.ip = "114.241.96.87"
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    left join $e1.principal.hostname = $e2.principal.hostname
    
    
  • Entitas acara

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    left join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    $host = $e1.principal.asset.hostname
    
    
  • Event-datatable

    
    $host = $e1.principal.hostname
    left join $e1.principal.hostname = %all_dt_column_types.hostname
    
    

Right outer join

Right outer join (atau right join) mempertahankan semua data dari sumber data di sisi kanan kata kunci right join.

  • Jika data dari peristiwa kanan tidak memiliki kecocokan di peristiwa kiri, kolom dari peristiwa kiri akan ditampilkan sebagai null.

  • Implikasi placeholder: Setiap variabel placeholder yang digunakan di bagian match harus merujuk ke kolom dari peristiwa yang tepat untuk memastikan agregasi data yang akurat di seluruh set hasil.

Contoh gabungan kanan Event-to-Event

Contoh berikut menunjukkan right outer join untuk mengorelasikan peristiwa login pengguna dengan peristiwa koneksi jaringan berikutnya yang terjadi di host yang sama. right join memastikan bahwa semua peristiwa NETWORK_CONNECTION dipertahankan dalam kumpulan hasil. Jika ditemukan peristiwa USER_LOGIN yang cocok, datanya akan digabungkan. Jika tidak ditemukan kecocokan, kolom untuk$e1 adalah null.


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

Tentukan peristiwa kiri

Kueri berikut menentukan sisi kiri gabungan ($e1), yang merupakan set peristiwa opsional dalam hasil akhir:


$e1.metadata.event_type = "USER_LOGIN"

Tabel berikut menampilkan hasil kueri, yang mengidentifikasi kumpulan awal peristiwa login pengguna:

Jenis peristiwa Nama host utama Alamat IP
USER_LOGIN workstation-01 192.168.1.101
USER_LOGIN laptop-hr-02 192.168.1.102
USER_LOGIN server-db-03 10.0.0.50

Menentukan peristiwa yang tepat

Kueri berikut menentukan sisi kanan gabungan ($e2), yang merupakan set peristiwa yang dipertahankan dalam hasil akhir.


$e2.metadata.event_type = "NETWORK_CONNECTION"

Tabel berikut menampilkan kumpulan peristiwa koneksi jaringan yang tersedia untuk pencocokan.

Jenis peristiwa Nama host utama Alamat IP
NETWORK_CONNECTION workstation-01 192.168.1.101
NETWORK_CONNECTION laptop-hr-02 192.168.1.101
NETWORK_CONNECTION vm-unauth-05 203.0.113.3

Bergabung dalam acara

Contoh berikut menunjukkan kueri pencocokan dengan gabungan luar kanan pada kolom principal.hostname:


$e1.metadata.event_type = "USER_LOGIN"

$e2.metadata.event_type = "NETWORK_CONNECTION"

right join $e1.principal.hostname = $e2.principal.hostname

$host = $e1.principal.hostname

match:
  $host over 5m

  • Gabungan luar kanan memastikan bahwa setiap peristiwa NETWORK_CONNECTION ($e2) disertakan dalam set hasil akhir.

  • Placeholder $host diberi nilai dari $e2.principal.hostname. Outer join kanan memastikan keberadaan peristiwa $e2, sehingga memastikan variabel $host selalu diisi untuk agregasi.

  • Aturan ini menggabungkan hasil menurut host untuk jangka waktu 5 menit.

Hasil gabung

Set data yang dihasilkan menunjukkan kombinasi kedua peristiwa. Semua data dari tabel kanan ($e2) dipertahankan, dan kolom dari tabel kiri ($e1) ditetapkan ke null jika tidak ada nama host yang cocok (misalnya, vm-unauth-05).

Jenis acara ($e1) Nama host utama ($e1) Alamat IP ($e1) Jenis acara ($e2) Nama host utama ($host) Alamat IP ($e2) Status pencocokan
USER_LOGIN workstation-01 192.168.1.101 NETWORK_CONNECTION workstation-01 192.168.1.101 Kecocokan ditemukan
USER_LOGIN laptop-hr-02 192.168.1.102 NETWORK_CONNECTION laptop-hr-02 192.168.1.101 Kecocokan ditemukan
null null null NETWORK_CONNECTION vm-unauth-05 203.0.113.4 Tidak ada yang cocok

Contoh kueri gabungan kanan

Bagian ini memberikan contoh kueri gabungan kanan.

Bergabung dengan kondisi kecocokan

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    $host = $e2.principal.hostname
    
    match:
      $host over 5m
    
    
  • Entity-event

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    match:
      $host over 5m
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    match:
      $host by 5m
    
    

Gabungan tanpa kondisi kecocokan

  • Event-event

    
    $e1.metadata.event_type = "USER_LOGIN"
    
    $e1.principal.ip = "114.241.96.87"
    
    $e2.metadata.event_type = "NETWORK_CONNECTION"
    
    right join $e1.principal.hostname = $e2.principal.hostname
    
    
  • Entity-event

    
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    
    $g1.graph.metadata.entity_type = "ASSET"
    
    right join $g1.graph.entity.asset.hostname = $e1.principal.asset.hostname
    
    $host = $e1.principal.asset.hostname
    
    
  • Datatable-event

    
    $host = $e1.principal.hostname
    
    right join %all_dt_column_types.hostname = $e1.principal.hostname
    
    

Batasan

Pertimbangkan batasan berikut saat Anda membuat gabungan luar:

  • Full outer join (left join dan right join bersama-sama) tidak didukung.

  • Rentang waktu kueri untuk gabungan yang tidak cocok dibatasi hingga maksimum 14 hari.

  • Anda tidak dapat menggabungkan dua sumber kontekstual secara langsung (misalnya, entitas langsung ke tabel data).

  • Peristiwa Model Data Terpadu (UDM) utama harus menjadi sisi yang dipertahankan dari gabungan luar. Kueri tidak valid jika peristiwa utama berada di sisi "nullable".

    • Gabungan entitas acara harus berupa gabungan kiri. Hal ini akan mempertahankan peristiwa dengan benar ($e1).

    • Gabungan entity-event harus berupa gabungan kanan. Hal ini akan mempertahankan peristiwa dengan benar ($e1).

    Contoh berikut tidak valid karena peristiwa UDM ($e1) berada di sebelah kiri, tetapi gabungan kanan mempertahankan sisi kanan ($g1), yang melanggar aturan bahwa peristiwa UDM harus dipertahankan:

    
    // Invalid query
    $e1.metadata.event_type = "NETWORK_CONNECTION"
    $g1.graph.metadata.entity_type = "ASSET"
    right join $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname
    
    

Praktik terbaik

Untuk mencegah performa yang lambat dan waktu tunggu kueri habis dalam kueri outer join, gunakan filter yang spesifik dan sempit.

Misalnya, kueri luas seperti berikut:


$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname

Dapat dioptimalkan dengan menambahkan kriteria spesifik sebagai berikut:


$e1.metadata.event_type = "USER_LOGIN"
$e1.principal.ip = "121.121.121.121"
$e1.principal.user.userid = "alex"
$e2.metadata.event_type = "NETWORK_CONNECTION"
$e2.src.hostname = "altostrat.com"
$e1.principal.hostname = $e2.principal.hostname

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