透過 YARA-L 2.0 搜尋統計資料和匯總資料
本頁說明如何使用 YARA-L 2.0 對 UDM 事件執行統計查詢,並將結果分組以供分析。
處理環境中產生的大量 UDM 事件時,瞭解 UDM 搜尋資料的趨勢非常重要。您可以使用統計和匯總函式,從 UDM 記錄檔中取得可做為行動依據的洞察資料。UDM 搜尋支援 YARA-L 2.0 中的所有匯總函式。
統計查詢的用途
統計查詢適用於下列用途:
追蹤重要指標:您可以評估 UDM 事件和相關聯資產 (例如與已知惡意 IP 位址通訊的主機) 的分布情形和頻率。
偵測異常行為:您可以找出可能代表安全性事件的活動尖峰,例如非上班時間的登入次數或網路流量突然暴增。
分析一段時間內的趨勢:您可以評估安全防護機制變化,評估控制措施的有效性或找出待改善的部分,例如監控一段時間內漏洞數量的變化。
搜尋中的 YARA-L 2.0 查詢結構
您可以使用類似於偵測引擎規則中 YARA-L 結構的語法,將 UDM 搜尋查詢結果分組及排序。詳情請參閱 YARA-L 2.0 語言語法。
YARA-L 2.0 查詢結構如下:
篩選陳述式:指定篩選事件的條件。
比對 (選用):定義要分組的欄位。詳情請參閱「比對區段語法」。
結果:指定查詢的輸出內容。詳情請參閱「結果區段語法」。
順序:決定查詢結果的順序,可以是
asc
(遞增) 或desc
(遞減)。如未指定順序 (asc
或desc
),系統會預設為asc
。限制 (選用):設定查詢傳回的資料列數量上限。
以下是訂單和用量限制的範例:
metadata.log_type = "OKTA"
match:
principal.ip
Outcome:
$user_count_by_ip = count(principal.user.userid)
order:
$user_count_by_ip desc
limit:
20
匯總資料
UDM 搜尋支援下列匯總函式:
陣列
array(expression)
說明
array
函式會以清單形式傳回所有值。並將清單截斷為最多 25 個隨機元素。
參數資料類型
STRING
傳回類型
LIST
程式碼範例
範例
傳回包含事件類型的陣列。
$event_type = metadata.event_type
outcome:
$event_type_array = array($event_type)
array_distinct
array_distinct(expression)
說明
array_distinct
函式會以清單形式傳回所有不重複的值。並將清單截斷為最多 25 個隨機元素。系統會在截斷前套用重複資料刪除程序,取得不重複的清單。
參數資料類型
STRING
傳回類型
LIST
程式碼範例
範例
傳回包含不重複事件類型的陣列。
$event_type = metadata.event_type
outcome:
$event_type_array = array_distinct($event_type)
平均
avg(numericExpression)
說明
avg
函式會傳回數值資料欄中的平均值。計算時會忽略 NULL
值。這項函式通常會與 match
搭配使用,計算資料中特定群組的平均值。
參數資料類型
NUMBER
傳回類型
NUMBER
程式碼範例
範例
找出 target.ip
不為空白的所有事件。針對所有符合 principal.ip
的事件,將 metadata.event_timestamp.seconds
的平均值儲存在名為 avg_seconds
的變數中。
target.ip != ""
match:
principal.ip
outcome:
$avg_seconds = avg(metadata.event_timestamp.seconds)
數量
count(expression)
說明
count
函式會傳回群組內的列數。這項函式通常會與 match
搭配使用,取得資料中特定群組的計數。
參數資料類型
STRING
傳回類型
NUMBER
程式碼範例
範例
傳回一段時間內使用者成功登入的次數。
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count(metadata.id)
count_distinct
count_distinct(expression)
說明
count_distinct
函式會傳回群組中具有相異值的列數。這項函式通常會與 match
搭配使用,取得資料中特定群組的計數。
參數資料類型
STRING
傳回類型
NUMBER
程式碼範例
範例
傳回一段時間內成功登入的不重複使用者人數。
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count_distinct(metadata.id)
max
max(numericExpression)
說明
max
函式會傳回數值資料欄中的最大值。這項函式通常會與 match
搭配使用,以取得資料中每個群組的最大值。
參數資料類型
NUMBER
傳回類型
NUMBER
程式碼範例
範例
找出 target.ip
不為空白的所有事件。針對 principal.ip
上符合 principal.ip
的所有事件,將 metadata.event_timestamp.seconds
的最大值儲存在名為 max_seconds
的變數中。
target.ip != ""
match:
principal.ip
outcome:
$max_seconds = max(metadata.event_timestamp.seconds)
分鐘
min(numericExpression)
說明
min
函式會傳回數值資料欄中的最小值。這項函式通常會與 match
搭配使用,以取得資料中每個群組的最小值。
參數資料類型
NUMBER
傳回類型
NUMBER
程式碼範例
範例
找出 target.ip
不為空白的所有事件。針對所有符合 principal.ip
的事件,將 metadata.event_timestamp.seconds
的最小值儲存在名為 min_seconds
的變數中。
target.ip != ""
match:
principal.ip
outcome:
$min_seconds = min(metadata.event_timestamp.seconds)
總和
sum(numericExpression)
說明
sum
函式會傳回數值資料欄中的值總和。計算時會忽略 NULL
值。這項函式通常會與 match
搭配使用,計算資料中不同群組的總和。
參數資料類型
NUMBER
傳回類型
NUMBER
程式碼範例
範例
找出 target.ip
不為空白的所有事件。針對所有符合 principal.ip
的事件,將 network.sent_bytes
的總和儲存在名為 sent_bytes
的變數中。
target.ip != ""
match:
principal.ip
outcome:
$sent_bytes = sum(network.sent_bytes)
stddev
stddev(numericExpression)
說明
stddev
函式會傳回所有可能值的標準差。
參數資料類型
NUMBER
傳回類型
NUMBER
程式碼範例
範例
找出 target.ip
不為空白的所有事件。針對所有符合 principal.ip
的事件,將 metadata.event_timestamp.seconds
的標準差儲存在名為 stddev_seconds
的變數中。
target.ip != ""
match:
principal.ip
outcome:
$stddev_seconds = stddev(metadata.event_timestamp.seconds)
最早
earliest(timestamp)
說明
earliest
函式會從一組記錄中傳回最早的時間戳記,解析度為微秒。
參數資料類型
TIMESTAMP
傳回類型
TIMESTAMP
程式碼範例
範例
針對所有符合 hostname
的事件,將最早的 metadata.event_timestamp
儲存在 start
變數中。
$hostname = principal.hostname
match:
$hostname
outcome:
$start = earliest(metadata.event_timestamp)
最新
latest(timestamp)
說明
latest
函式會從一組記錄中傳回最新的時間戳記,解析度為微秒。
參數資料類型
TIMESTAMP
傳回類型
TIMESTAMP
程式碼範例
範例
針對所有符合 hostname
的事件,將最新的 metadata.event_timestamp
儲存在 end
變數中。
$hostname = principal.hostname
match:
$hostname
outcome:
$end = latest(metadata.event_timestamp)
YARA-L 2.0:搜尋與 UDM 用法
搜尋功能不支援用於搜尋事件視窗的
over
關鍵字。UDM 搜尋查詢不包含
condition
和option
區段。
依時間精細程度分組
您可以在 match
區段中,依指定的時間精細度將事件欄位和預留位置分組,類似於在 SQL 中將資料欄分組。
語法如下:
match:
... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]
如要依時間細微程度分組,可以使用 by
或 over
every
關鍵字。允許的時間精細程度如下:
MINUTE
或m
HOUR
或h
DAY
或d
WEEK
或w
MONTH
或mo
by
和 over every
關鍵字的功能相同。你可以使用其中一個。
範例
依小時分組 IP 位址和主機名稱。
$hostname = principal.hostname
match:
$hostname, target.ip by hour
依主機名稱和事件發生日期,將所有事件的計數分組。
$hostname = target.hostname
match:
$hostname over every day
outcome:
$events_count = count($hostname)
部分資料來源 (例如實體內容) 在時間範圍 (<start_time>
, <end_time>
) 內有效,且沒有單一時間戳記。
first
關鍵字為選用項目,且僅適用於單一時間戳記。也就是說,如果資料來源在一段時間內有效,關鍵字 first
只會考量開始時間 (<start_time>
)。
舉例來說,假設實體的時段為 (1m, 5m
),時間精細程度為 1m
。如果結果是依主機分組 (h1
、h2
),傳回的資料欄會是 (h1
、1m
) 和 (h2
、1m
),其餘時間範圍則會遭到忽略。
first
關鍵字可以同時加入 by
和 over every
,因此兩者會出現相同的行為。使用 by first
等同於 over every first
。
以下範例查詢使用 by
運算子,以及在時間範圍內有效的實體內容資料來源。由於省略了 first
關鍵字,因此系統會將整個時間範圍納入這項查詢。
graph.entity.hostname != ""
match:
graph.entity.ip by hour
outcome:
$min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)
在搜尋中建立及儲存視覺化圖表
本節將說明 Google SecOps 統合式資料模型 (UDM) 搜尋的資料圖表製作功能。這項功能可讓資安營運中心 (SOC) 分析師從搜尋結果建立視覺化圖表,並儲存至資訊主頁,有效偵測、調查及回應威脅。
建立圖表並儲存至資訊主頁
如要建立及儲存視覺化效果,並新增至資訊主頁,請按照下列步驟操作:
編寫含有
match
和outcome
區段的 YARA-L 查詢。選取日期範圍,然後按一下「執行搜尋」執行查詢。 在「統計資料」和「視覺化」分頁中查看結果。
在「Visualize」(視覺化) 分頁中,執行下列操作: a. 從「圖表類型」清單中選取圖表類型。 b. 調整「資料設定」下方的設定,即可自訂圖表。
在「Add to dashboard」(新增至資訊主頁) 畫面中,執行下列操作: a. 輸入圖表名稱、說明和時間範圍。 b. 選擇將圖表新增至現有資訊主頁,或建立新的資訊主頁。
按一下「新增至資訊主頁」,將圖表新增至資訊主頁。
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。