使用外部聯結關聯資料

支援的國家/地區:

本文說明外部聯結 (左聯結和右聯結)。聯結作業可用於根據通用欄位值,關聯及合併多個來源的資料。將相關安全事件和實體整合為單一全面檢視畫面,即可有效偵測及調查威脅。

標準 (內部) 彙整不同,外部彙整會從彙整的一側擷取所有記錄,即使另一側沒有相符的項目也一樣。其他側的不相符欄位通常會填入 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 5m
    
    
  • Event-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.hostname
    
    
  • 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
    
    
  • Event-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 5m
    
    
  • Datatable-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.hostname
    
    
  • Datatable-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 專業人員尋求答案。