開始使用:SecOps 中的 YARA-L 2.0

支援的國家/地區:

YARA-L 2.0 是獨特的結構化查詢語言,可為 Google Security Operations 的所有搜尋、資訊主頁和規則式威脅偵測功能提供支援。無論您是搜尋威脅的安全分析師,還是建構強大新邏輯的偵測工程師,這份文件都能協助您瞭解 YARA-L 的核心結構,並提供實用的使用步驟。

本文將說明 YARA-L 及其語法,並示範如何使用 YARA-L 表示各種內容,從基本篩選查詢到尋找複雜模式的規則皆可。在 YARA-L 查詢中使用區段,支援匯總函式、條件邏輯,並透過聯結、模式比對等方式新增內容。

事前準備

瞭解 YARA-L 結構

每個 YARA-L 查詢都會劃分為不同的具名區段,這些區段會決定查詢的行為。

這個結構可進行多階段分析和關聯。

訂單 區段 規則 搜尋/資訊主頁 說明
1 meta 必填 選用 設定規則的說明中繼資料,例如作者、說明和嚴重程度。例如作者 (security team)、說明 (Detects multiple failed user logins within 10-minute windows) 和嚴重程度 (High)。請參閱meta 區段語法
2 events 必填 必填 定義及篩選必須追蹤的事件:使用者登入、使用者登入失敗 (事件變數),以及使用者比對變數的連結 (預留位置變數)。宣告要考量的所有資料來源 (主要是事件),並使用 UDM 欄位篩選這些來源。請參閱events 區段語法
3 match 必填 選用 依事件分組,並可指定支援的時間範圍 (例如 by 5m)。在某些情況下,進行統計搜尋 (會發生匯總) 時,必須使用這個參數。多事件關聯查詢必須使用此函式。match 必須為規則指定時間,搜尋和資訊主頁則可選擇是否指定時間。請參閱match 區段語法

注意:如果排除 match 區段,規則可以比對單一事件。
4 outcome 選用 選用 計算重要指標並取得洞察 (例如 count()avg())。請參閱 outcome 區段語法
5 condition 必填 選用 定義必須符合的邏輯,才能傳回結果 (在搜尋中) 或觸發快訊 (在規則中)。評估查詢變數條件,判斷結果是否適用 (例如 $event >5)。請參閱condition 區段語法
6 options 選用 選用 允許啟用或停用特定規則行為。請參閱options 區段語法
7 dedup 不適用 選用 根據重要變數或事件路徑 (例如 target.user.useridtarget.ipprincipal.hostname$host$user 等變數) 將事件分組,藉此移除重複事件。進一步瞭解事件變數
8 order 不適用 選用 依特定欄位 (例如 asc) 定義的結果排序。進一步瞭解事件變數。選用 (僅適用於使用 match 時)。
9 limit 不適用 選用 限制查詢傳回的事件數量上限。
10 select 不適用 選用 指定要在查詢結果中加入的 UDM 欄位清單。
11 unselect 不適用 選用 指定要從查詢結果中排除的 UDM 欄位清單。

YARA-L 資料來源可用性

YARA-L 可存取的資料來源取決於您在平台中的位置。事件實體 (ECG)資料表在搜尋、資訊主頁和規則中完全可用。如需查詢範例的詳細資料,請參閱「支援的資料來源」。

下表列出 YARA-L 的可用功能:

功能 適用於
案件和案件記錄 資訊主頁
資料表 搜尋、資訊主頁、規則
實體 (ECG) 搜尋、資訊主頁、規則
擷取指標 資訊主頁
IoC 比對結果 資訊主頁
規則偵測 資訊主頁、規則
規則集 資訊主頁
活動 搜尋、資訊主頁、規則
UEBA 指標 搜尋資訊主頁

Google SecOps 中的所有資料都會根據您的目標,透過兩種主要方法進行搜尋:篩選器搜尋統計搜尋 (彙整)。

篩選器搜尋方法可讓您從更廣泛的遙測串流中,隔離特定事件,而不會產生統計匯總的額外負荷。這個方法會使用條件,將大量安全性資料 (例如記錄或網路流量) 縮減為目標結果集。您只需在 events 區段中指定事件,即可完成邏輯設定。

如要建立第一個 YARA-L 篩選器搜尋,請按照下列步驟搜尋登入失敗的使用者:

  1. 前往 Google SecOps 的「搜尋」頁面。
  2. 篩選登入事件:
    metadata.event_type = "USER_LOGIN"

    提示:搜尋時可以省略 events: 區段標題。根據預設,搜尋語法會隱含這個部分。

  3. userid 不為空的使用者新增登入失敗的 event 動作。
    metadata.event_type = "USER_LOGIN"
    security_result.action = "FAIL"
    principal.user.userid != ""
  4. 執行這項搜尋即可查看結果。

使用預留位置變數

使用預留位置變數從事件中擷取特定值,例如使用者名稱或 IP 位址。這些變數可做為暫時錨點,讓您比較不同事件的資料,或在最終輸出中顯示這些值。

您可以使用預留位置變數執行下列操作:

  • 橋接資料:使用 $userid$ip 等預留位置,找出不同事件變數之間的相符項目 (例如,您可以使用 $userid 連結登入和登出事件中的使用者 ID)。
  • 分組結果:在 match 區段中,使用預留位置變數定義查詢輸出內容的視窗,例如 match: $userid over 1h
  • 建立結果:使用預留位置擷取及顯示查詢輸出中的特定資料點。

舉例來說,如果您指派 $user = principal.user.userid$user 變數現在會保留從事件中擷取的特定值。然後在「match」部分使用 $user,將與該特定使用者相關的所有活動分組。

統計搜尋方法可對事件集執行計算,協助您取得洞察資料、趨勢或異常狀況。這項功能會提供資料的匯總摘要,而非傳回個別記錄的清單。這項邏輯會使用 match 區段 (用於分組) 和 outcome 區段 (用於計算)。outcome 區段支援匯總函式,例如 count()sum()avg()max()min()stddev()

以下範例使用下列查詢邏輯:

  • events:篩選登入嘗試失敗的原始資料。
  • match:定義分組事件 (依 userid)。
  • outcome:執行統計匯總 (每位使用者的事件計數)。

範例:使用 outcome 函式匯總登入失敗活動

下列範例使用 outcome 區段的匯總函式 (例如 count()sum()),匯總登入失敗活動。

  1. 使用 match 區段,依 userid 分組登入失敗事件:

    metadata.event_type = "USER_LOGIN"
    security_result.action = "FAIL"
    principal.user.userid != ""
    
    match:
      principal.user.userid
    
  2. 使用每個使用者的登入失敗次數 ($failed_login_count),由 outcome 變數定義:count

    metadata.event_type = "USER_LOGIN"
    security_result.action = "FAIL"
    principal.user.userid != ""
    
    match:
      principal.$user.userid
    
    outcome:
      $failed_login_count = count(metadata.id)
    
  3. 執行這項搜尋即可查看結果。

  4. 選用:在 match 區段中新增時間元素 (在本例中為 day)。然後,更新 outcome 變數,使其更明確 ($daily_failed_login_count):

    metadata.event_type = "USER_LOGIN"
    security_result.action = "FAIL"
    principal.user.userid != ""
    $user = principal.user.userid
    
    match:
      $user by day
    
    outcome:
      $daily_failed_login_count = count(metadata.id)
    

透過搜尋建立資訊主頁小工具

您可以從匯總搜尋結果建立資訊主頁小工具,如建立第一個搜尋範例所示。

驗證搜尋查詢後,您可以將其儲存為小工具,並新增至資訊主頁,步驟如下:

  1. 看到結果後,依序點選「Visualize」分頁 >「Add to Dashboard」
  2. 設定小工具:
    1. 為小工具命名 (例如 "Daily Failed Login")。
    2. 選取時間範圍。
    3. 選擇要新增至現有資訊主頁。
    4. 按一下「新增」。
  3. 選用:直接在資訊主頁中建構查詢。或者,您也可以複製精選資訊主頁,並修改其中的查詢做為起點。
  4. 選用:您可以使用 YARA-L 製作自訂資訊主頁,並在其中新增小工具。詳情請參閱「建立自訂資訊主頁」。

設定資訊主頁

建立新資訊主頁時,events 區段是必要的起點。您可彈性使用 match (用於分組結果) 或 outcome (用於計算輸出內容和匯總)。

舉例來說,您可以建立含有 eventsmatch 區段的資訊主頁,並在資訊主頁中顯示依 by hour 值分組的偵測結果嚴重程度 ($severity)。

範例:依嚴重程度匯總時間序列

您可以使用 eventsmatch 區段建立資訊主頁,顯示分組到 hour 值區的偵測嚴重程度 ($severity):

detection.detection.severity != "UNKNOWN_SEVERITY"
$severity = detection.detection.severity

match:
  $severity by hour

範例:匯總重大影響總計

同樣地,您可以使用 eventsoutcome 區段建立資訊主頁,追蹤高嚴重性偵測結果:

detection.detection.severity = "CRITICAL"
$severity = detection.detection.severity

outcome:
  $detection_count = count_distinct($severity)

範例:以圖表呈現一段時間內依嚴重程度分類的偵測量

在下列範例中,您可以透過控制台計算重大偵測結果,並指定時間範圍。在許多情況下,您會在資訊主頁中建構圖表時,同時使用 matchoutcome 區段:

detection.detection.severity != "UNKNOWN_SEVERITY"
$severity = detection.detection.severity

match:
  $severity by hour

outcome:
  $detection_count = count_distinct(detection.id)

示例:計算使用者登入頻率

以下範例著重於使用 matchoutcome 區段,計算特定使用者的 login_count

events:
  metadata.event_type = "USER_LOGIN"

match:
  target.user.userid

outcome:
  $login_count = count(metadata.id)

建立規則

規則必須包含下列章節:

  • meta:包含規則名稱和說明詳細資料。
  • events:使用事件變數定義資料來源和篩選器。
  • condition:指定規則觸發時必須存在的事件變數。

定義及使用事件變數

事件變數可做為邏輯容器,將篩選器分組,方便您在搜尋、規則或資訊主頁中參照該特定活動。

events 部分定義邏輯時,您可以使用事件變數 (例如 $e) 代表符合條件的特定事件 (或一組事件)。

範例:定義及篩選事件變數

如要定義事件變數 (例如 $e),請在查詢的 events 區段中使用前置字串。這會宣告這些事件由變數代表。舉例來說,運算式 $e.principal.hostname = "dev" 會評估每個事件,判斷主機名稱是否完全相符。

$e.principal.hostname = "dev"
$e.metadata.event_type = "USER_LOGIN"

接著,您可以在查詢的其他部分使用該變數,參照特定事件群組 (在 matchoutcomecondition 區段中) 及其資料欄位。

整理規則結構和語法

請使用下列規則結構和語法,定義變數、分組邏輯和觸發門檻:

元素 說明 範例
規則結構 將查詢包裝在 rule 區塊中,並指派專屬名稱來識別偵測結果。 rule DailyFailedLoginAttempts { }
meta 專區 這是必要旗標,包括說明性中繼資料 (例如 `author`、`description`、`severity`),可改善規則管理作業,並為團隊提供背景資訊。建議您採用這項最佳做法來管理規則。 author = "Alex"
severity = "Medium"
事件變數 在規則查詢中,events 部分的每個欄位都會加上事件變數 (例如 $e) 前置字元,代表符合條件的特定事件 (或一組事件)。這些群組是篩選器的邏輯分組

在「將搜尋內容轉換為 YARA-L 規則」範例中,$e 代表所有使用者登入失敗。
$e.metadata.event_type = "USER_LOGIN"
預留位置變數 將事件指派給通用名稱,以便稍後在查詢中參照。詳情請參閱「使用預留位置變數」。 $userid = $e.principal.user.userid
match 專區 定義分組並指定支援的時間範圍。在「將搜尋查詢轉換為 YARA-L 規則」範例中,match: $userid over day 分組會正確地將每個 24 小時期間內的事件依使用者 ID 分組 (1d)。

撰寫規則時,您必須指定支援的時間範圍,定義回溯期。您可以根據邏輯需求,實作 hopslidingtumbling 視窗。明確使用 over 運算子會建立躍遷視窗。
$userid over 1d
outcome 專區 執行統計匯總或擷取特定變數,讓產生的快訊提供更多資訊。

$e.metadata.id 上使用 count() 函式,匯總每個 match 群組中的事件。您也可以指派變數 (例如 $userid),擷取特定 UDM 欄位,並在產生的偵測輸出內容中提供更多情境資訊。
$failed_count = count($e.metadata.id)
condition 專區 規則必須包含這項條件,才能產生偵測結果

condition 區段中定義偵測門檻。舉例來說,使用 #e > 5 時,事件計數必須超過五個 (5) 才會觸發快訊。即使不執行計算,您仍需要 condition 區段,並說明事件變數的存在 (例如 #e)。

分析環境的基準,設定可偵測可疑活動的門檻,同時盡量減少誤判。即使不執行計算,您仍需要 condition 區段,只要說明事件變數的存在即可,例如 #e
#e > 5$e

如要瞭解這種結構的運作方式,請參閱下列範例。

範例:偵測暴力破解 (多次登入失敗)

以下範例會偵測單一使用者在 24 小時內多次嘗試登入失敗:

rule DailyFailedLoginAttempts {
  meta:
    author = "Alex"
    description = "Detects multiple failed login attempts for a single user within a day."
    severity = "Medium"

  events:
    $e.metadata.event_type = "USER_LOGIN"
    $e.security_result.action = "FAIL"
    $e.principal.user.userid != ""
    $userid = $e.principal.user.userid

  match:
    $userid over 1d

  outcome:
    $daily_failed_login_count = count($e.metadata.id)

  condition:
    $daily_failed_login_count > 5
}

如要將最終搜尋查詢轉換為產生偵測結果的可靠規則,通常需要按照下列步驟操作:

  1. 在 Google SecOps 中,前往「規則編輯器」
  2. 開始建立新規則。
  3. 貼上搜尋查詢,並修改查詢以符合規則結構,包括:
    • meta 區段:定義中繼資料規則,包括規則名稱、作者和嚴重程度
    • event 區段:必填。與搜尋不同,您必須有具名的 event` 區段標題。
    • 事件變數:在邏輯中宣告及參照特定事件 (或事件群組)。
    • match 區段,並指定支援的時間範圍:指定分組鍵並定義時間參數 (例如 5m1d)。注意:如果在規則中使用 match 區段,請務必新增時間範圍。
    • condition 區段:定義觸發規則必須符合的最終邏輯或門檻。

進階:建立多重事件規則

您可以使用多事件規則,關聯特定時間範圍內發生的不同類型活動。您不必只查看單一事件,而是將多個事件 (例如使用者登入後立即執行異常檔案下載) 連結在一起,找出複雜的威脅。

多事件規則需要下列部分:

  • meta:包含規則名稱和說明詳細資料。
  • events:使用事件變數定義資料來源和篩選器。
  • match:設定時間範圍和用來連結事件的預留位置變數。
  • outcome擷取快訊的額外背景資訊。多事件規則需要匯總函式
  • condition:指定規則觸發時必須存在的事件變數。

如要建立多事件規則,請按照下列步驟操作:

  1. 定義事件變數:在事件部分中,定義 $e1 來擷取 "PROCESS_LAUNCH" 事件,並定義 $e2 來擷取特定惡意檔案雜湊。
  2. 與預留位置建立關聯:使用 $user 預留位置變數,透過共用的主要使用者 ID (例如 $user = $e1.principal.user.userid and $user = $e2.principal.user.userid),連結這兩個不同的事件串流。
  3. 將相符項目分組:在 match 區段中,指定這些事件必須在設定的時間範圍內 (例如 5 分鐘) 發生於同一個 $user (5m)。

範例:建立多事件規則

在以下範例中,$e1 代表 PROCESS_LAUNCH 事件,$e2 則代表具有特定惡意雜湊的事件。$user 預留位置變數會根據相同的主要使用者 ID,將這些事件建立關聯。

rule MultiEventExample {
  meta:
    author = "Alex"
    description = "Detects a bad hash execution or a process launch from a specific IP for the same user."

  events:
    $e1.principal.ip = "1.1.1.1"
    $e1.metadata.event_type = "PROCESS_LAUNCH"
    $e2.target.file.sha256 = "badhash..."
    $user = $e1.principal.user.userid
    $user = $e2.principal.user.userid

  match:
    $user over 5m

  condition:
    $e1 or $e2
}

下列規則元件說明範例中使用的邏輯:

  • 事件變數:定義兩個事件變數,即 $e1$e2。使用預留位置變數 $user,在通用 userid 欄位中彙整這些事件。
  • match 部分:為這項多重事件規則加入 match 部分,以便依使用者分組,並指定五分鐘的跳躍時間視窗 (5m) 來關聯事件。
  • condition 區段:定義觸發快訊的邏輯。如果第一個或第二個事件存在,這個範例就會觸發快訊。

使用其他工具建構查詢

這些工具是撰寫、驗證及加速採用 YARA-L 的重要幫手:

  • UDM 查詢工具:直接在使用者介面中快速搜尋及參照 UDM 欄位名稱、定義和資料型別。如果不知道欄位 ID,請優先查看這份參考資料。
  • 自然語言轉 YARA-L 搜尋:在搜尋列中輸入說明,即可草擬初始查詢,或取得/翻譯相應的 YARA-L 建議。
  • SPL → YARA-L 轉換器 (實驗室工具):如果您要從競爭對手的平台轉移,請使用這項工具 (位於「實驗室」部分),將舊版 Splunk SPL 查詢轉換為 YARA-L。這會產生結構化的起點,加快遷移速度並改善偵測邏輯。如要使用 Labs 工具,請前往 Google SecOps 的 yourinstancename.chronicle.security/labs。

後續步驟

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