比對區段語法
match 區段提供必要參數,可將多個相關事件關聯至單一偵測結果。只有在規則連結兩個以上不同的事件時,才需要這項設定。您可以使用這項功能定義關聯性的條件,方法是指定下列項目:
分組欄位 (鍵):事件 (在
events區段中定義) 的特定欄位,必須共用相同的值,才能在邏輯上連結事件。時間限制:相關事件必須在連續時間範圍內發生,才能構成單一完整比對。這項步驟僅適用於規則,搜尋和資訊主頁則不需要。
定義比對區段
規則需要比對變數,才能成為 event 部分定義的預留位置。您也可以在搜尋和資訊主頁中指定 event 欄位。
使用 events 部分定義的預留位置變數,指定事件必須發生的時間範圍。如果相符事件發生在指定時間範圍外,系統會忽略該特定偵測群組。
使用 over 關鍵字和語法 <number><m/h/d> (其中 m/h/d 代表分鐘、小時和天數),指定時間範圍。最短可指定一分鐘,最長則為 48 小時。
這項規則範例會偵測 10 分鐘內發生的登入失敗事件。如果短時間內發生多起登入失敗事件,通常表示有人嘗試暴力破解或未經授權存取。
rule failed_logins
{
meta:
author = "Security Team"
description = "Detects multiple failed user logins within 10-minute windows."
severity = "HIGH"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
$user = $e.target.user.userid
match:
$user over 10m
condition:
#e >= 5
}
「match」部分會找出在 10 分鐘間隔內,於新位置登入失敗的使用者:
match:
$user over 10m
比對區段中的零值
Google SecOps 會隱含地濾除 match 區段中所有預留位置的零值 (字串為 ""、數字為 0、布林值為 false,列舉型別則為位置 0 中的值)。
範例:篩除零值
以下範例說明如何查詢並篩除零值。
rule ZeroValuePlaceholderExample {
meta:
events:
// Because $host is used in the match section, the query behaves
// as if the following predicate was added to the events section:
// $host != ""
$host = $e.principal.hostname
// Because $otherPlaceholder was not used in the match,
// there is no implicit filtering of zero values for $otherPlaceholder.
$otherPlaceholder = $e.principal.ip
match:
$host over 5m
condition:
$e
}不過,如果預留位置已指派給函式,查詢不會在 match 區段中,隱含地篩除預留位置的零值。
如要停用零值的隱含篩選,可以在選項部分使用 allow_zero_values 選項。「allow_zero_values」選項僅適用於規則。
範例:允許零值
以下範例說明查詢不會隱含篩除 match 區段中使用的預留位置零值:
rule ZeroValueFunctionPlaceholder {
meta:
events:
// Even though $ph is used in the match section, there is no
// implicit filtering of zero values for $ph, because $ph is assigned to a function.
$ph = re.capture($e.principal.hostname, "some-regex")
match:
$ph over 5m
condition:
$e
}支援的時間範圍
您可以在「match」部分,使用下列其中一個支援的視窗,依指定的時間精細度將事件欄位和預留位置分組。
- 跳躍視窗 (重疊視窗)
- 滾動式時間區間 (不重疊的時間區間)
- 滑動視窗 (由樞紐產生的視窗)
跳躍式時間區間
跳躍視窗是一種多事件查詢類型,可將符合查詢條件的事件分組到指定時間範圍內,不論事件發生的順序為何。根據預設,含有 match 區段的 YARA-L 查詢會使用跳躍視窗,在一段時間內關聯多個事件。查詢的執行時間範圍會劃分為一組重疊的跳躍視窗,每個視窗的持續時間都由 match 區段指定。然後在每個躍點視窗中關聯事件。
舉例來說,如果查詢是在 [1:00, 2:00] 的時間範圍內執行,且 match 區段超過 30m,則可能產生的一組重疊跳躍視窗為 [1:00, 1:30]、[1:03, 1:33] 和 [1:06, 1:36]。這些時間範圍可用於關聯多個事件。
滾動式時間區間
滾動式時間區間會將資料串流劃分為固定大小、不重疊且連續的時間間隔。每個資料事件只會指派給一個時間區間。這與滑動或跳躍式時間區間不同,後者可能會有重疊的時間間隔。
舉例來說,如果使用 30 分鐘的滾動視窗,系統會一併處理 1:00:00 到 1:29:59 之間發生的事件。接著,系統會分開處理下一組事件 (1:30:00 至 1:59:59)。
橫拉窗
如果您需要搜尋以特定相對順序發生的事件 (例如 e1 最多在 e2 發生後兩分鐘內發生),滑動視窗就非常有效。當時間限制以指定的樞紐事件變數開始或結束時,系統就會產生滑動視窗。這項功能會動態追蹤事件序列,以及相對於特定樞紐事件變數的時間。
然後在每個滑動視窗中關聯事件。這樣一來,您就能搜尋以特定順序發生的事件 (例如 e1 在 e2 發生後 2 分鐘內發生)。如果事件 e1 在事件 e2 發生後,於滑動視窗期間內發生,則事件 e1 和事件 e2 的發生次數會相互關聯。
- 滑動視窗是以樞紐事件變數 (
pivot-event-var) 為依據。 - 使用
before關鍵字產生滑動視窗,並以每個樞紐事件的發生時間做為視窗結尾。 - 使用
after關鍵字產生滑動視窗,從每個樞紐事件發生時間開始。
在查詢的 match 區段中指定滑動視窗,如下所示:
<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>
以下範例顯示有效的滑動視窗:
$var1, $var2 over 5m after $e1
$user over 1h before $e2
注意事項:
- 其他滑動區間範例。
已知使用滑動視窗而非跳躍視窗會導致效能變慢。建議您只在特定情況下使用滑動視窗,例如事件順序絕對必要,或是要搜尋不存在的事件時。
由於滑動視窗的設計目的是偵測多個事件,因此建議您不要將滑動視窗用於單一事件查詢。請改用下列任一方法:
- 將查詢轉換為使用多個事件變數,並在查詢需要多次發生事件時,更新條件部分。
- 視需要考慮新增時間戳記篩選器,而非使用滑動時間範圍。例如:
$permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds - 取下滑動式窗戶。
後續步驟
其他資訊
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。