條件區段語法

支援的國家/地區:

本文說明如何使用 YARA-L 查詢的 condition 區段。condition 區段用於搜尋和資訊主頁,且是規則的必要條件,內含可進一步篩選結果的邏輯。在搜尋或資訊主頁查詢中使用時,只會顯示符合條件的輸出內容。在偵測規則中使用時,必須符合條件才能觸發快訊。

condition 區段中,您可以使用布林運算子、比較運算子和 outcome 變數的結果,判斷是否應觸發查詢。

定義 condition 區段

condition 部分中,定義事件的條件運算式和預留位置變數。您也可以為 events 區段中定義的事件和預留位置指定比對條件,並視需要使用 and 關鍵字,透過 outcome 區段中定義的結果變數指定比對條件,請參閱「結果區段語法」。

您可以使用 andor 關鍵字加入運算式:

  • 在任何條件之間使用 and

  • 只有在查詢包含單一事件變數時,才能使用 or

在任何事件或預留位置變數名稱前的 condition 區段中使用 # 字元,代表滿足 events 區段中所有條件的不重複事件或值數量。例如:

#c > 1 表示變數 c 必須出現超過 1 次。

condition 區段中,於任何結果變數名稱前使用 $ 字元,代表該結果的值。如果用在任何事件或預留位置變數名稱之前 (例如 $event),則代表 #event > 0

這個規則範例會在 10 分鐘時間範圍內 (如 match 區段所定義),每個使用者登入失敗次數超過五次 (如 condition 區段所定義) 時,傳回偵測結果:

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

  outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

  condition:
    #e >= 5
}

受限和不受限的條件

您可以在查詢中使用有界或無界條件:

  • 有界條件會強制存在相關聯的事件變數,也就是說,事件必須至少出現一次偵測結果。以下是有界條件:

    $var // equivalent to #var > 0

    #var > n // where n >= 0

    #var >= m // where m > 0

  • 無界限條件可用於偵測一段時間內是否沒有事件;例如,在 10 分鐘的時間範圍內,如果發生威脅事件但沒有緩解事件,無界限條件允許相關聯的事件變數不存在 (非存在查詢),這表示偵測結果中可能不會出現任何事件,且對事件變數中欄位的任何參照都會產生零值。

    以下是不受限制的條件:

    !$var // equivalent to #var = 0

    #var >= 0

    #var < n // where n > 0

    #var <= m // where m >= 0

不存在查詢的規定

非存在查詢必須符合下列條件,才能編譯:

  • 至少一個 UDM 事件必須有界限條件 (也就是說,至少要有一個 UDM 事件)。
  • 如果預留位置有不設限的條件,則必須與至少一個設限的 UDM 事件建立關聯。
  • 如果實體有不設限的條件,則必須與至少一個設限的 UDM 事件建立關聯。

範例:不存在的查詢

請考慮省略條件部分的下列查詢:

rule NonexistenceExample {
  meta:
      author = "Google Security"
      description = "Example: non-existence query."
  events:
      $u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
      $u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
      $e1.graph.metadata.entity_type = "FILE"        // $e1 is an entity.
      $e2.graph.metadata.entity_type = "FILE"        // $e2 is an entity.

      $user = $u1.principal.user.userid // Match variable is required for multi-event query.

      // Placeholder Associations:
      //   u1        u2
      //   |  \    /
      // port   ip
      //   |       \
      //   e1        e2
      $u1.target.port = $port
      $e1.graph.entity.port = $port
      $u1.principal.ip = $ip
      $u2.target.ip = $ip
      $e2.graph.entity.ip = $ip

      // UDM-Entity Associations:
      // u1 - u2
      // |  \  |
      // e1   e2
      $u1.metadata.event_type = $u2.metadata.event_type
      $e1.graph.entity.hostname = $u1.principal.hostname
      $e2.graph.entity.hostname = $u1.target.hostname
      $e2.graph.entity.hostname = $u2.principal.hostname

  match:
    $user over 5m

  condition:
      //Add valid condition
}

有效條件區段

以下是條件部分的有效範例:

  • $u1 and !$u2 and $e1 and $e2
    • 條件區段中會顯示所有 UDM 事件和實體。
    • 至少有一個 UDM 事件受到限制。
  • $u1 and !$u2 and $e1 and !$e2
    • $e2與受限的 $u1 相關聯,因此不受限且允許使用。如果 $e2 未與 $u1 建立關聯,則無效。
  • #port > 50 and #ip = 0
    • 條件區段中沒有 UDM 事件和實體,但現有的預留位置涵蓋所有 UDM 事件和實體。
    • $ip 同時指派給 $u1$u2,且 #ip = 0 是無界限條件。不過,有界條件比無界條件更強大。由於 $port 已指派給 $u1,且 #port > 50 是有界條件,因此 $u1 仍是有界條件。

條件區段無效

以下是條件部分的無效範例:

  • $u1 and $e1
    • events 區段中顯示的每個 UDM 事件和實體,都必須出現在 condition 區段中 (或已指派給該區段中的預留位置)。condition
  • $u1, $u2, $e1, $u2, #port > 50
    • 條件分隔符不得使用半形逗號。
  • !$u1 and !$u2 and $e1 and $e2
    • 違反第一個規定,即至少要繫結一個 UDM 事件。
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • 無界條件不支援 or 關鍵字。
  • ($u1 or $u2) and $e1 and $e2
    • 不同事件變數之間不支援 or 關鍵字。
  • not $u1 and $u2 and $e1 and $e2
    • not 關鍵字不適用於事件和預留位置條件。
  • #port < 50 and #ip = 0
    • 雖然預留位置會參照所有 UDM 事件和實體,但每個相關聯的條件都是無界限。也就是說,沒有任何 UDM 事件受到限制,導致規則無法編譯。

結果條件

您可以在 condition 區段中加入結果變數的條件,並以 andor 關鍵字聯結,或以 not 關鍵字做為前置字元。

結果條件的指定方式會因結果變數類型而異:

  • 整數:使用 =, >, >=, <, <=, != 運算子與整數常值比較 例如:$risk_score > 10

  • 浮點數:使用 =, >, >=, <, <=, != 運算子與浮點數常值比較 例如:$risk_score <= 5.5

  • string:使用 =!= 與字串常值比較 例如:$severity = "HIGH"

  • 整數或陣列清單:使用 arrays.contains 函式指定條件 例如:arrays.contains($event_ids, "id_1234")

如果在含有 match 區段的查詢中指定結果條件,系統會將該查詢歸類為多事件查詢,並計入查詢配額。如要進一步瞭解單一和多個事件分類,請參閱「相符語法」。

限制

  • 請勿在 condition 區段中使用 match 變數。這是語意錯誤,因為事件是依據 match 變數值分組。

  • 請避免只在所有 event 變數上指定無界限條件,並將這些變數指派給 match 變數。這是語意錯誤。如要回傳 match 變數值,至少必須有一個包含該值的事件。

  • 如果使用滑動視窗,基準事件變數必須至少參與一個有界條件。

後續步驟

其他資訊

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