開始使用:SecOps 中的 YARA-L 2.0
YARA-L 2.0 是獨特的結構化查詢語言,可為 Google Security Operations 的所有搜尋、資訊主頁和規則式威脅偵測功能提供支援。無論您是搜尋威脅的資安分析師,還是建構強大新邏輯的偵測工程師,這份文件都能協助您瞭解 YARA-L 的核心結構,並提供實用的使用步驟。
事前準備
- 確認您有權存取 Google SecOps 平台。
- 使用測試規則驗證資料擷取作業。
- 您必須對安全概念和記錄資料有基本瞭解。
- 本文假設資料已擷取至 Google SecOps 執行個體,並已正規化為統合資料模型 (UDM)。
瞭解 YARA-L 結構
每個 YARA-L 查詢都會劃分為不同的具名區段,這些區段會決定查詢的行為。
這種結構可進行多階段分析和關聯。
| 指令 | 動作 | 選用 | 必要 |
|---|---|---|
meta |
設定規則的說明中繼資料,例如作者、說明和嚴重程度。 | 搜尋和資訊主頁可選用這類元素。僅適用於規則。 |
events |
定義及篩選事件。宣告要考量的所有資料來源 (主要是事件),並使用 UDM 欄位篩選這些來源。 | 搜尋、資訊主頁和規則的必要條件 (查詢的核心邏輯)。 |
match |
依事件分組,並可指定支援的時間範圍 (例如 by 5m)。 |
在進行統計搜尋 (會發生匯總) 時,有時需要使用這項屬性。多事件關聯查詢必須使用這項功能。在 match 中,規則必須指定時間,搜尋和資訊主頁則可選擇是否指定時間。 |
outcome |
計算重要指標並取得洞察資料 (例如 count()、avg())。 |
選填。 |
condition |
定義必須符合的邏輯,才能傳回結果 (在搜尋中) 或觸發快訊 (在規則中)。評估查詢變數條件,判斷結果是否適用 (例如 $event >5)。 |
搜尋和資訊主頁可選用。僅適用於規則。 |
dedup |
根據重要變數或事件路徑 (例如 target.user.userid、target.ip、principal.hostname 或 $host、$user 等變數) 將事件分組,藉此移除重複事件。進一步瞭解事件變數。 |
選用。規則不支援這項功能。 |
order |
依據特定欄位 (例如 asc) 定義的結果排序。 |
選用 (僅適用於使用 match 時)。規則不支援這項功能。 |
limit |
限制查詢傳回的事件數量上限。 | 選用。規則不支援這項功能。 |
select |
指定要在查詢結果中加入的 UDM 欄位清單。 | 選用。規則不支援這項功能。 |
unselect |
指定要從查詢結果中排除的 UDM 欄位清單。 | 選用。規則不支援這項功能。 |
YARA-L 資料來源可用性
YARA-L 可存取的資料來源取決於您在平台中的位置。事件、實體 (ECG) 和資料表可完整用於搜尋、資訊主頁和規則。
下表列出 YARA-L 的可用功能:
| 功能 | 適用於 |
|---|---|
| 案件和案件記錄 | 資訊主頁 |
| 資料表 | 搜尋、資訊主頁、規則 |
| 實體 (ECG) | 搜尋、資訊主頁、規則 |
| 擷取指標 | 資訊主頁 |
| IoC 比對結果 | 資訊主頁 |
| 規則偵測 | 資訊主頁、規則 |
| 規則集 | 資訊主頁 |
| 活動 | 搜尋、資訊主頁、規則 |
| UEBA 指標 | 搜尋資訊主頁 |
建立第一個 YARA-L 搜尋查詢
Google SecOps 中的所有資料都會根據您的目標,使用兩種主要方法進行搜尋:篩選器搜尋和統計搜尋 (彙整)。
篩選搜尋 (事件篩選)
篩選器搜尋方法可讓您從較廣泛的遙測串流中,找出特定事件,不必進行統計匯總。這個方法會使用條件,將大量安全性資料 (例如記錄或網路流量) 縮減為目標結果集。您只需在 events 區段中指定事件。
如要建立第一個 YARA-L 篩選器搜尋,請按照下列步驟搜尋登入失敗的使用者:
- 前往 Google SecOps 的「搜尋」頁面。
-
篩選登入事件:
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使用每個使用者的登入失敗次數 (
$failed_login_count),由outcome變數定義:countmetadata.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: principal.$user.userid by day outcome: $daily_failed_login_count = count(metadata.id)
透過搜尋建立資訊主頁小工具
您可以從匯總搜尋結果建立資訊主頁小工具,如建立第一個搜尋範例所示。
驗證搜尋項目後,您可以將其儲存為小工具,並新增至資訊主頁,步驟如下:
- 看到結果後,依序點選「Visualize」分頁 >「Add to Dashboard」。
- 設定小工具:
- 為小工具命名 (例如
"Daily Failed Login")。 - 選取時間範圍。
- 選擇要新增至現有或新資訊主頁。
- 按一下「新增」。
- 為小工具命名 (例如
- 選用:直接在資訊主頁中建構查詢。或者,您也可以複製精選資訊主頁,並修改其中的查詢,做為起點。
- 選用:您可以使用 YARA-L 製作自訂資訊主頁,並在其中新增小工具。詳情請參閱「建立自訂資訊主頁」。
設定資訊主頁
建立新資訊主頁時,events 區段是必填的起點。您可彈性使用 match (用於分組結果) 或 outcome (用於計算輸出內容和匯總)。
舉例來說,您可以建立含有 events 和 match 區段的資訊主頁,並在資訊主頁中顯示依 by hour 值分組的偵測結果嚴重程度 ($severity)。
範例:依嚴重程度匯總時間序列
您可以使用 events 和 match 區段建立資訊主頁,顯示分組到 hour 值區的偵測嚴重程度 ($severity):
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 分組會正確地將每個 24 小時期間內的事件依使用者 ID 分組 (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 查詢工具:直接在使用者介面中快速搜尋及參照 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 中的函式
- 瀏覽 Google SecOps 社群,查看更多範例
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。