Mengorelasikan data dengan outer join
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
matchharus 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 5mEvent-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.hostnameEntitas 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.hostnameEvent-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
matchharus 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
$hostdiberi nilai dari$e2.principal.hostname. Outer join kanan memastikan keberadaan peristiwa$e2, sehingga memastikan variabel$hostselalu 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 5mEntity-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 5mDatatable-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.hostnameEntity-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.hostnameDatatable-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.