使用統計資料分析搜尋資料

支援的國家/地區:

本頁面說明如何使用 YARA-L 2.0,對 UDM 事件執行統計查詢,並將結果分組以供分析。

處理環境中產生的大量 UDM 事件時,瞭解 UDM 搜尋資料的趨勢非常重要。您可以使用統計資料和匯總函式,從 UDM 記錄中取得可據以行動的洞察資訊。UDM 搜尋支援 YARA-L 2.0 中的所有匯總函式。

統計查詢的用途

統計查詢適用於下列用途:

  • 追蹤重要指標:您可以評估 UDM 事件和相關聯資產的分布情形和頻率,例如與已知惡意 IP 位址通訊的主機。

  • 偵測異常行為:您可以找出可能表示安全事件的活動尖峰,例如非預期的網路流量激增或非上班時間的登入活動。

  • 分析一段時間內的趨勢:您可以評估安全態勢變化,評估控管措施的有效性,或找出需要改進之處,例如監控一段時間內漏洞數量的變化。

您可以使用類似於偵測引擎規則中 YARA-L 結構的語法,將 UDM 搜尋查詢結果分組及排序。詳情請參閱「開始使用:Google SecOps 中的 YARA-L 2.0」。

YARA-L 2.0 查詢結構如下:

  • 篩選條件陳述式:指定篩選事件的條件。詳情請參閱「篩選缺少、零和未初始化的值」。

  • 比對 (選用):定義要分組的欄位。詳情請參閱「比對區段語法」。

  • 結果:指定查詢的輸出內容。詳情請參閱「結果區段語法」。

  • 重複資料刪除 (選用):減少重複結果的數量。詳情請參閱「在搜尋和資訊主頁中使用重複資料刪除功能」。

  • 順序:決定查詢結果的順序,可以是 asc (遞增) 或 desc (遞減)。如未指定順序 (asc 或 desc),則預設為 asc。

  • 限制 (選用):設定查詢傳回的資料列數量上限。

    • 範例:訂購和使用限制

      以下範例顯示訂單和限制用量:

      metadata.log_type = "OKTA"
      
      match:
          principal.ip
      Outcome:
          $user_count_by_ip = count(principal.user.userid)
      
      order:
      $user_count_by_ip desc
      
      limit:
          20
      

匯總函式

如果事件包含多個值,您必須使用匯總函式來彙整資料。

搜尋功能支援下列匯總函式:

array

array 函式會以清單形式傳回所有值。

傳回的元素數量上限取決於查詢的執行位置:

  • 搜尋:將清單截斷為最多 1,000 個隨機元素。
  • 資訊主頁和規則:將清單截斷為最多 25 個隨機元素。
語法 參數資料類型 傳回類型
array(expression) STRING LIST

程式碼範例

  • 傳回內含事件類型的陣列。

    $event_type = metadata.event_type
    outcome:
      $event_type_array = array($event_type)
    

array_distinct

array_distinct 函式會以清單形式傳回所有不重複的值。系統會在截斷前,先套用去重複功能,產生不重複的清單。

傳回的元素數量上限取決於查詢的執行位置:

  • 搜尋:將清單截斷為最多 1,000 個隨機元素。
  • 資訊主頁和規則:將清單截斷為最多 25 個隨機元素。
語法 參數資料類型 傳回類型
array_distinct(expression) STRING LIST

程式碼範例

  • 傳回不同的事件類型

    傳回內含不同事件類型的陣列。

    $event_type = metadata.event_type
    outcome:
      $event_type_array = array_distinct($event_type)
    
  • 從相異陣列中排除預設值

    以下範例會篩除缺少安全結果說明的事件。它會使用重複欄位中的 any 關鍵字,在結果彙整期間保留所有陣列索引:

    events:
      $e.security_result[0].description != ""
      any $e.security_result.description = ""
    outcome:
      $security_result_description = array_distinct($e.security_result.description)
    

avg

avg 函式會傳回數值欄中值的平均值。計算時會忽略 NULL 值。這項函式通常會與 match 搭配使用,計算資料中特定群組的平均值。

語法 參數資料類型 傳回類型
avg(numericExpression) NUMBER NUMBER

程式碼範例

  • 找出 target.ip 不為空白的所有事件。針對所有符合 principal.ip 的事件,將 metadata.event_timestamp.seconds 的平均值儲存在名為 avg_seconds 的變數中。

    target.ip != ""
    match:
      principal.ip
    outcome:
      $avg_seconds = avg(metadata.event_timestamp.seconds)
    

count

count 函式會傳回群組內的列數。這項函式通常會與 match 搭配使用,取得資料中特定群組的計數。

語法 參數資料類型 傳回類型
count(expression) STRING NUMBER

程式碼範例

  • 傳回一段時間內成功登入的使用者人數。

    metadata.event_type = "USER_LOGIN"
    $security_result = security_result.action
    $security_result = "ALLOW"
    $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
    match:
        $security_result, $date
    outcome:
        $event_count = count(metadata.id)
    

count_distinct

count_distinct 函式會傳回群組中具有相異值的資料列數。這項函式通常會與 match 搭配使用,取得資料中特定群組的計數。

語法 參數資料類型 傳回類型
count_distinct(expression) STRING NUMBER

程式碼範例

  • 傳回不重複使用者登入次數

    傳回一段時間內成功登入的不重複使用者人數。

      metadata.event_type = "USER_LOGIN"
      $security_result = security_result.action
      $security_result = "ALLOW"
      $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
      match:
          $security_result, $date
      outcome:
          $event_count = count_distinct(metadata.id)
    
  • 從不重複計數中排除預設值

    以下範例會篩除未初始化的使用者 ID,因此 count_distinct 不會在總計數中納入預設空白字串:

    metadata.event_type = "USER_LOGIN"
    $userid = principal.user.userid
    $userid != ""
    match:
        metadata.event_type
    outcome:
        $distinct_users = count_distinct($userid)
    

earliest

支援的國家/地區:

earliest 函式會從一組記錄中傳回最早的時間戳記,解析度為微秒。

語法 參數資料類型 傳回類型
earliest(timestamp) TIMESTAMP TIMESTAMP

程式碼範例

  • 針對所有符合 hostname 的事件,將最早的 metadata.event_timestamp 儲存在 start 變數中。

    $hostname = principal.hostname
    match:
      $hostname
    outcome:
      $start = earliest(metadata.event_timestamp)
    

latest

支援的國家/地區:

latest 函式會從一組記錄傳回最新時間戳記,解析度為微秒。

語法 參數資料類型 傳回類型
latest(timestamp) TIMESTAMP TIMESTAMP

程式碼範例

  • 針對所有相符的事件,將最新的 metadata.event_timestamp 儲存在 end 變數中。hostname

    $hostname = principal.hostname
    match:
      $hostname
    outcome:
      $end = latest(metadata.event_timestamp)
    

max

max 函式會傳回數值欄中的最大值。 這項函式通常會與 match 搭配使用,以取得資料中每個群組的最大值。

語法 參數資料類型 傳回類型
max(numericExpression) NUMBER NUMBER

程式碼範例

  • 找出 target.ip 不為空白的所有事件。針對所有符合 principal.ip 的事件,將 metadata.event_timestamp.seconds 的最大值儲存在名為 max_seconds 的變數中。

    target.ip != ""
    match:
      principal.ip
    outcome:
      $max_seconds = max(metadata.event_timestamp.seconds)
    

min

min 函式會傳回數值欄中的最小值。這項函式通常會與 match 搭配使用,取得資料中每個群組的最小值。

語法 參數資料類型 傳回類型
min(numericExpression) NUMBER NUMBER

程式碼範例

  • 找出 target.ip 不為空白的所有事件。針對所有符合 principal.ip 的事件,將 metadata.event_timestamp.seconds 的最小值儲存在名為 min_seconds 的變數中。

    target.ip != ""
    match:
      principal.ip
    outcome:
      $min_seconds = min(metadata.event_timestamp.seconds)
    

stddev

stddev 函式會傳回所有可能值的標準差。

語法 參數資料類型 傳回類型
stddev(numericExpression) NUMBER NUMBER

程式碼範例

  • 找出 target.ip 不為空白的所有事件。針對所有符合 principal.ip 的事件,將 metadata.event_timestamp.seconds 的標準差儲存在名為 stddev_seconds 的變數中。

    target.ip != ""
    match:
      principal.ip
    outcome:
      $stddev_seconds = stddev(metadata.event_timestamp.seconds)
    

sum

sum 函式會傳回數值欄中的值總和。計算時會忽略 NULL 值。這項函式通常會與 match 搭配使用,計算資料中不同群組的總和。

語法 參數資料類型 傳回類型
sum(numericExpression) NUMBER NUMBER

程式碼範例

  • 找出 target.ip 不為空白的所有事件。針對所有符合 principal.ip 的事件,將 network.sent_bytes 的總和儲存在名為 sent_bytes 的變數中。

    target.ip != ""
    match:
      principal.ip
    outcome:
      $sent_bytes = sum(network.sent_bytes)
    

篩除遺漏、零和未初始化的值

匯總 Unified Data Model (UDM) 事件資料時,結果可能會包含非預期的空字串、零值或「[Unknown]」項目。這是因為 YARA-L 2.0 會將未初始化的欄位評估為預設零值,而不是 NULL。

舉例來說,未初始化的字串欄位預設為空字串 (""),整數欄位預設為零 (0),列舉欄位預設為未指定的值 (例如 principal.security_result.action 的 "UNKNOWN_ACTION")。使用零值可避免負向比較篩選器 (例如 $e.principal.hostname != "test_domain") 意外排除缺少主機名稱的事件。

由於匯總函式會將預設零值視為有效資料,因此這項行為會對查詢結果造成下列影響:

  • 不重複計數:count_distinct 等函式會將預設零值視為不重複項目。如果部分事件缺少欄位,count_distinct 會將預設零值視為額外項目,使總數增加一。
  • 陣列清單:array 和 array_distinct 等函式會在傳回的清單中加入預設零值。如果結果陣列只包含空字串 ([""]),偵測時間軸會將值顯示為 [Unknown]。

如要從匯總中移除預設值,請在查詢的 events 區段中新增篩選器,排除這些值 (例如 $e.field != ""、$e.field != 0 或 $e.field != "UNKNOWN_ACTION")。

篩選重複欄位時,請在篩選器前方加上 any 關鍵字,例如 any $e.security_result.description != ""。使用 any 會評估整個事件的條件,並在結果彙整資料時保留所有陣列索引。

YARA-L 2.0:搜尋與 UDM 的比較

  • 搜尋功能不支援用於搜尋活動視窗的 over 關鍵字。

  • UDM 搜尋查詢不包含 condition 和 option 部分。

如要詳細比較 UDM 搜尋查詢和即時 YARA-L 2.0 偵測規則,請參閱「UDM 搜尋與規則結果比較」。

依時間精細程度分組

您可以在 match 區段中,依指定的時間精細程度將事件欄位和預留位置分組,類似於在 SQL 中將資料欄分組。

語法如下:

  • 語法格式

    match:
      ... [BY|OVER EVERY] [FIRST] [NUMBER] [TIME_GRANULARITY]
    

如要依時間細微程度分組,可以使用 by 或 over every 關鍵字。允許的時間精細度如下:

  • MINUTE或m
  • HOUR 或 h
  • DAY 或 d
  • WEEK 或 w
  • MONTH或mo

by 和 over every 關鍵字的功能相同。你可以使用其中一個,

  • 範例:每兩小時將 IP 位址和主機名稱分組

    $hostname = principal.hostname
    match:
      $hostname, target.ip by 2h
    
  • 範例:依主機名稱分組,並以全時細微程度顯示

    $hostname = principal.hostname
    match:
      $hostname by minute
    
  • 範例:依主機名稱和事件發生日期將所有事件分組

    $hostname = target.hostname
    match:
      $hostname over every day
    outcome:
      $events_count = count($hostname)
    

依時間範圍將資料來源分組

部分資料來源 (例如實體內容) 在時間範圍 (<start_time>, <end_time>) 內有效,而非單一時間戳記。在這些資料來源中依時間精細程度分組時,您可以評估整個時間範圍,也可以將分組限制為開始時間戳記。

評估整個時間範圍 (預設)

根據預設,如果省略 first 關鍵字,查詢會評估記錄的整個時間範圍。

  • 範例:依實體 IP 位址在完整時間範圍內分組

    graph.entity.hostname != ""
    match:
      graph.entity.ip by hour
    outcome:
      $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)
    

使用第一個關鍵字評估開始時間戳記

如要將分組限制為僅限記錄的開始時間戳記 (<start_time>),請在 match 陳述式中新增選用的 first 關鍵字。您可以搭配 by 或 over every 使用 first (by first 等同於 over every first)。

舉例來說,假設實體的時間範圍為 1m 到 5m,時間精細程度為 1m。如果使用 first 將結果依主機分組 (h1、h2),則傳回的資料欄會是 (h1、1m) 和 (h2、1m),其餘時間範圍則會遭到忽略。

  • 範例:僅使用開始時間,依實體 IP 位址分組

    graph.entity.hostname != ""
    match:
      graph.entity.ip by first hour
    outcome:
      $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)
    

在搜尋結果中建立及儲存圖表

本節說明 Google SecOps 統合式資料模型 (UDM) 搜尋的資料圖表製作功能。這項功能可讓資安營運中心 (SOC) 分析師從搜尋結果建立視覺化內容,並儲存至資訊主頁,有效偵測、調查及應對威脅。

如要建立視覺化效果,您需要 chronicle.nativeDashboards.create 和 chronicle.nativeDashboards.update IAM 權限。

建立及儲存圖表,以便新增至資訊主頁

如要建立及儲存圖表,並新增至資訊主頁,請按照下列步驟操作:

  1. 使用 match 和 outcome 區段編寫 YARA-L 查詢。

  2. 選取日期範圍,然後按一下「執行搜尋」執行查詢。 在「統計資料」和「視覺化」分頁中查看結果。

  3. 在「Visualize」(視覺化) 分頁中,執行下列操作: a. 從「圖表類型」清單中選取圖表類型。 b. 在「資料設定」下方調整設定,自訂圖表。

  4. 在「Add to dashboard」(新增至資訊主頁) 畫面中,執行下列操作: a. 輸入圖表名稱、說明和時間範圍。 b. 選擇將圖表新增至現有資訊主頁,或建立新的資訊主頁。

  5. 按一下「新增至資訊主頁」,將圖表新增至資訊主頁。

限制

統計查詢執行作業有以下限制:

  • 查詢無法處理 90 天前的資料 (3 個月的追溯期)。
  • 統計查詢最多會傳回 100,000 個結果 (僅限使用者介面和長時間執行的作業 API)。

還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求解答。