使用外部聯結關聯資料
本文說明外部聯結 (左聯結和右聯結)。聯結作業可用於根據通用欄位值,關聯及合併多個來源的資料。將相關安全事件和實體整合為單一全面檢視畫面,即可有效偵測及調查威脅。
與標準 (內部) 彙整不同,外部彙整會從彙整的一側擷取所有記錄,即使另一側沒有相符的項目也一樣。其他側的不相符欄位通常會填入 null。這樣可避免遺失沒有相符項目的資料。
外部聯結的運作方式
YARA-L 2.0 的外部聯結概念與標準 SQL 外部聯結相同:
左外部 join 會保留 join 左側的所有記錄。
右外部彙整會保留彙整右側的所有記錄。
所有查詢 (包括有和沒有 match 條件的查詢) 都支援外部 join 語法 (左 join 和右 join)。
瞭解左外部 join
左外部彙整 (或左彙整) 會保留 left join 關鍵字左側資料來源的所有記錄。
如果左側記錄在右側事件中沒有相符項目,則右側事件中的欄位會以
null形式傳回。預留位置的含意:
match部分中使用的任何預留位置變數,都必須參照左側事件的欄位,確保整個結果集中的資料匯總正確無誤。
事件對事件左側聯結範例
以下範例說明如何使用左外部聯結,將使用者登入事件與同一主機上發生的後續網路連線事件建立關聯。左側聯結可確保結果集保留所有 USER_LOGIN 事件。如果找到相符的 NETWORK_CONNECTION 事件 ($e2),系統會彙整其資料。如果找不到相符項目,$e2 的欄位會顯示 null。
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
left join $e1.principal.hostname = $e2.principal.hostname
定義左側事件
下列查詢範例定義了聯結的左側 ($e1),也就是最終結果中保留的事件集:
$e1.metadata.event_type = "USER_LOGIN"
下表代表查詢結果,可識別初始的使用者登入事件集:
| 活動類型 | 主要主機名稱 | 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
|
定義合適的事件
下列查詢範例定義了聯結的右側 ($e2),也就是與左側事件比對的事件集:
$e2.metadata.event_type = "NETWORK_CONNECTION"
下表列出可供比對的網路連線事件:
| 活動類型 | 主要主機名稱 | 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
|
參加活動
並在「比對」部分
以下範例示範如何使用 principal.hostname 欄位上的 left outer join 執行比對查詢:
$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
左外部聯結可確保最終結果集包含每個
USER_LOGIN事件 ($e1)。預留位置 $host 會獲派
$e1.principal.hostname的值。 左外部聯結可確保事件$e1的存在,確保 $host 變數一律會填入匯總資料。這項規則會匯總 5 分鐘時間範圍內,各主機的結果。
加入結果
產生的資料會顯示這兩個事件的組合。系統會保留左側表格 ($e1) 中的所有記錄,如果找不到相符的主機名稱 (例如 server-db-03),右側表格 ($e2) 中的欄位會設為 null。
活動類型 ($e1)
|
主要主機名稱 ($host)
|
IP 位址 ($e1)
|
活動類型 ($e2)
|
IP 位址 ($e2)
|
比對狀態 |
|---|---|---|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
192.168.1.101
|
找到相符項目 |
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
NETWORK_CONNECTION
|
192.168.1.101
|
找到相符項目 |
USER_LOGIN
|
server-db-03
|
10.0.0.50
|
null
|
null
|
不相符 |
USER_LOGIN
|
kiosk-4
|
192.168.1.104
|
NETWORK_CONNECTION
|
203.0.113.3
|
找到相符項目 |
左側聯結查詢範例
本節提供左側聯結查詢範例。
以比對條件加入
Event-entity
$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
沒有比對條件的聯結
活動
$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.hostnameEvent-entity
$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
右外部 join
右外部彙整 (或右彙整) 會保留 right join 關鍵字右側資料來源的所有記錄。
如果右側事件的記錄在左側事件中沒有相符項目,則左側事件的欄位會以
null形式傳回。預留位置的含義:
match部分使用的任何預留位置變數都必須參照正確事件中的欄位,確保整個結果集中的資料匯總準確無誤。
事件對事件右側聯結範例
以下範例說明如何使用 right outer join,將使用者登入事件與同一主機上發生的後續網路連線事件建立關聯。right join可確保所有 NETWORK_CONNECTION 事件都保留在結果集中。如果找到相符的 USER_LOGIN 事件,系統就會合併資料。
如果找不到相符項目,$e1的欄位會是null。
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname
定義左側事件
下列查詢會定義聯結的左側 ($e1),也就是最終結果中的選用事件集:
$e1.metadata.event_type = "USER_LOGIN"
下表代表查詢結果,可識別初始的使用者登入事件集:
| 活動類型 | 主要主機名稱 | 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
|
定義正確的事件
下列查詢會定義聯結的右側 ($e2),也就是最終結果中保留的事件集。
$e2.metadata.event_type = "NETWORK_CONNECTION"
下表列出可供比對的網路連線事件集。
| 活動類型 | 主要主機名稱 | 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
|
參加活動
以下範例顯示比對查詢,並在 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
右外部聯結可確保最終結果集包含每個
NETWORK_CONNECTION事件 ($e2)。預留位置
$host會獲派$e2.principal.hostname的值。右外部彙整可確保活動$e2的存在,確保$host變數一律會填入彙整資料。這項規則會匯總 5 分鐘時間範圍內的主機結果。
加入結果
產生的資料集會顯示這兩個事件的組合。系統會保留右側表格 ($e2) 中的所有記錄,如果找不到相符的主機名稱,左側表格 ($e1) 中的欄位會設為空值 (例如 vm-unauth-05)。
活動類型 ($e1)
|
主要主機名稱 ($e1)
|
IP 位址 ($e1)
|
活動類型 ($e2)
|
主要主機名稱 ($host) | IP 位址 ($e2)
|
比對狀態 |
|---|---|---|---|---|---|---|
USER_LOGIN
|
workstation-01
|
192.168.1.101
|
NETWORK_CONNECTION
|
workstation-01
|
192.168.1.101
|
找到相符項目 |
USER_LOGIN
|
laptop-hr-02
|
192.168.1.102
|
NETWORK_CONNECTION
|
laptop-hr-02
|
192.168.1.101
|
找到相符項目 |
null
|
null
|
null
|
NETWORK_CONNECTION
|
vm-unauth-05
|
203.0.113.4
|
不相符 |
右側聯結查詢範例
本節提供右側聯結查詢的範例。
以比對條件加入
活動活動
$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實體事件
$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
沒有比對條件的聯結
活動活動
$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實體事件
$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
限制
建立外部聯結時,請注意下列限制:
系統不支援完整外部聯結 (左聯結和右聯結)。
無比對彙整查詢的查詢時間範圍上限為 14 天。
您無法直接合併兩個情境來源 (例如,直接將實體合併至資料表)。
主要統合式資料模型 (UDM) 事件必須是外部聯結的保留端。如果主要事件位於「可為空值」端,查詢就會無效。
事件實體聯結必須是左聯結。這樣就能正確保留事件 (
$e1)。實體事件聯結必須是右聯結。這樣就能正確保留事件 (
$e1)。
以下範例無效,因為 UDM 事件 (
$e1) 位於左側,但右側聯結會保留右側 ($g1),這違反了必須保留 UDM 事件的規則:// 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
最佳做法
如要避免外部聯結查詢效能緩慢和查詢逾時,請使用特定且範圍較窄的篩選器。
舉例來說,以下是不夠具體的查詢:
$e1.metadata.event_type = "USER_LOGIN"
$e2.metadata.event_type = "NETWORK_CONNECTION"
right join $e1.principal.hostname = $e2.principal.hostname
可透過新增特定條件來最佳化,如下所示:
$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
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。