開始使用:SecOps 中的 YARA-L 2.0
YARA-L 2.0 是獨特且高度結構化的查詢語言,可為 Google Security Operations 的所有搜尋、資訊主頁和規則式威脅偵測功能提供支援。本文將協助您瞭解 YARA-L 的核心結構,並提供實用步驟,無論您是搜尋威脅的資安分析師,還是建構強大新邏輯的偵測工程師,都能輕鬆上手。
本文將說明 YARA-L 及其語法,並示範如何使用 YARA-L 表示各種內容,從基本篩選器查詢到尋找複雜模式的規則皆可。在 YARA-L 查詢中使用區段,支援匯總函式、條件邏輯,並透過聯結、模式比對等方式新增脈絡。
事前準備
- 確認您有權限存取 Google SecOps 平台。
- 使用測試規則驗證資料擷取。
- 您必須對安全性概念和記錄資料有基本瞭解。
- 本文假設資料已擷取至 Google SecOps 執行個體,並已正規化為統合資料模型 (UDM)。
- 如要快速遷移查詢,請參閱「從 SPL 轉換為 YARA-L 2.0」指南,瞭解如何將常見的 SPL 指令 (例如
stats、eval和lookup) 轉換為 YARA-Loutcomes和match條件。
瞭解 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.userid、target.ip、principal.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 指標 | 搜尋、資訊主頁 |
建立第一個 YARA-L 搜尋
Google SecOps 中的所有資料都會根據您的目標,透過兩種主要方法進行搜尋:篩選器搜尋和統計搜尋 (彙整)。
篩選搜尋結果 (事件篩選)
篩選搜尋方法可讓您從更廣泛的遙測串流中隔離特定事件,而不會產生統計匯總的負擔。這個方法會使用條件,將大量安全性資料 (例如記錄或網路流量) 縮減為目標結果集。您只需在 events 區段中指定事件,即可完成邏輯。
如要建立第一個 YARA-L 篩選器搜尋,請按照下列步驟搜尋登入失敗的使用者:
- 前往 Google SecOps 的「search」(搜尋) 頁面。
-
篩選登入事件:
metadata.event_type = "USER_LOGIN"
提示:搜尋時可以省略
events:區段標題。根據預設,搜尋語法會隱含這個區段。 - 針對
userid不為空白的使用者,新增登入失敗的event動作。metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" - 執行這項搜尋即可查看結果。
使用預留位置變數
使用預留位置變數從事件中擷取特定值,例如使用者名稱或 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()),匯總登入失敗活動。
使用
match部分,依userid分組登入失敗事件:metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" match: principal.user.userid針對每位使用者,使用
outcome變數定義的登入失敗次數count($failed_login_count):metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" match: principal.user.userid outcome: $failed_login_count = count(metadata.id)執行這項搜尋即可查看結果。
選用:在
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)
從搜尋結果建立資訊主頁小工具
您可以根據匯總搜尋建立資訊主頁小工具,如建立第一個搜尋範例所示。
驗證搜尋後,您可以將其儲存為小工具,並新增至資訊主頁,如下所示:
- 看到結果後,依序點選「Visualize」分頁 >「Add to Dashboard」。
- 設定小工具:
- 為小工具命名 (例如
"Daily Failed Login")。 - 選取日期範圍。
- 選擇要新增至「現有」或「新」資訊主頁。
- 按一下「新增」。
- 為小工具命名 (例如
- 選用:直接在資訊主頁中建立查詢。或者,您也可以複製精選資訊主頁,並修改其中的查詢做為起點。
- 選用:您可以建立自訂資訊主頁,並使用 YARA-L 新增小工具。詳情請參閱「建立自訂資訊主頁」。
設定資訊主頁
建立新資訊主頁時,events 區段是必要的起點。接著,您可以視需要使用 match (用於將結果分組) 或 outcome (用於計算輸出內容和匯總資料)。
舉例來說,您可以建立包含 events 和 match 區段的資訊主頁,其中資訊主頁會顯示偵測結果的嚴重性 ($severity),並依 by hour 值區分組。
範例:依嚴重性匯總時間序列
您可以使用
events和match區段建立資訊主頁,顯示偵測結果的嚴重性 ($severity),並分組到hour值區:detection.detection.severity != "UNKNOWN_SEVERITY" $severity = detection.detection.severity match: $severity by hour
範例:匯總重大影響的總數
同樣地,您可以使用
events和outcome區段建立資訊主頁,追蹤高嚴重性偵測項目:detection.detection.severity = "CRITICAL" $severity = detection.detection.severity outcome: $detection_count = count_distinct($severity)
範例:以圖表呈現偵測數量隨時間變化的趨勢 (依嚴重性區分)
在下列範例中,您可以透過控制台計算重大偵測結果,並指定日期範圍。在許多情況下,您會在資訊主頁中建構圖表時,同時使用
match和outcome區段:detection.detection.severity != "UNKNOWN_SEVERITY" $severity = detection.detection.severity match: $severity by hour outcome: $detection_count = count_distinct(detection.id)
範例:計算使用者登入頻率
以下範例著重於使用
match和outcome區段,計算特定使用者的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"
接著,您可以在查詢的其他部分 (match、outcome、condition 部分) 使用該變數,參照該特定事件群組及其資料欄位。
整理規則結構和語法
使用下列規則結構和語法,定義變數、分組邏輯和觸發門檻:
| 元素 | 說明 | 範例 |
|---|---|---|
| 規則結構 | 將查詢包裝在 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 分組會正確地依使用者 ID,將每個 24 小時期間內的事件分組 (1d)。撰寫規則時,您必須指定支援的時間範圍,定義回溯期。您可以根據邏輯需求,實作 hop、sliding 或 tumbling 視窗。使用 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 }
將搜尋內容轉換為 YARA-L 規則
如要將最終搜尋查詢轉換為可靠的偵測規則,通常需要按照下列步驟操作:
進階:建立多事件規則
您可以使用多事件規則,關聯特定時間範圍內發生的不同類型活動。您不必只查看單一事件,而是將多個事件 (例如使用者登入後立即執行異常檔案下載) 連結在一起,找出複雜的威脅。
多事件規則必須包含下列區段:
meta:包含規則名稱和說明詳細資料。events:使用事件變數定義資料來源和篩選器。match:設定時間範圍和用於連結事件的預留位置變數。outcome擷取快訊的額外脈絡資訊。多重事件規則需要匯總函式。condition:指定規則觸發時必須存在的事件變數。
如要建立多事件規則,請按照下列步驟操作:
- 定義事件變數:在事件部分中,定義
$e1以擷取"PROCESS_LAUNCH"事件,並定義$e2以擷取特定惡意檔案雜湊。 - 使用預留位置建立關聯:使用
$user預留位置變數,透過共用的主體使用者 ID (例如$user = $e1.principal.user.userid and $user = $e2.principal.user.userid) 連結這兩個不同的事件串流。 - 將比對分組:在
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 查詢工具:直接在 UI 中快速搜尋及參照 UDM 欄位名稱、定義和資料類型。如果不知道欄位 ID,請優先查看這份參考資料。
- 自然語言轉 YARA-L 搜尋:在搜尋列中輸入說明,即可草擬初始查詢,或取得/翻譯相應的 YARA-L 建議。
- SPL → YARA-L 轉換器 (實驗室工具):如果您要從競爭對手的平台轉移,請使用這個工具 (位於「實驗室」部分),將舊版 Splunk SPL 查詢轉換為 YARA-L。這會產生結構化的起點,加快遷移速度並修正偵測邏輯。如要使用 Labs 工具,請在 Google SecOps 前往 yourinstancename.chronicle.security/labs。
後續步驟
- 探索完整的 YARA-L 2.0 語法
- 瀏覽 YARA-L 2.0 中的函式
- 請瀏覽下列資源,查看相關範例:
- 範例:YARA-L 2.0 查詢
- Google SecOps 社群)
- 進一步瞭解下列 YARA-L 資源:
還有其他問題嗎?向社群成員和 Google SecOps 專家尋求解答。