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

支援的國家/地區:

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

事前準備

瞭解 YARA-L 結構

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

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

指令 動作 選用 | 必要
meta 設定規則的說明中繼資料,例如作者、說明和嚴重程度。 搜尋和資訊主頁可選用這類元素。僅適用於規則。
events 定義及篩選事件。宣告要考量的所有資料來源 (主要是事件),並使用 UDM 欄位篩選這些來源。 搜尋、資訊主頁和規則的必要條件 (查詢的核心邏輯)。
match 依事件分組,並可指定支援的時間範圍 (例如 by 5m)。 在進行統計搜尋 (會發生匯總) 時,有時需要使用這項屬性。多事件關聯查詢必須使用這項功能。在 match 中,規則必須指定時間,搜尋和資訊主頁則可選擇是否指定時間。
outcome 計算重要指標並取得洞察資料 (例如 count()avg())。 選填。
condition 定義必須符合的邏輯,才能傳回結果 (在搜尋中) 或觸發快訊 (在規則中)。評估查詢變數條件,判斷結果是否適用 (例如 $event >5)。 搜尋和資訊主頁可選用。僅適用於規則。
dedup 根據重要變數或事件路徑 (例如 target.user.useridtarget.ipprincipal.hostname$host$user 等變數) 將事件分組,藉此移除重複事件。進一步瞭解事件變數 選用。規則不支援這項功能。
order 依據特定欄位 (例如 asc) 定義的結果排序。 選用 (僅適用於使用 match 時)。規則不支援這項功能。
limit 限制查詢傳回的事件數量上限。 選用。規則不支援這項功能。
select 指定要在查詢結果中加入的 UDM 欄位清單。 選用。規則不支援這項功能。
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:
      principal.$user.userid 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 專業人員尋求答案。