分享方式:


進階搜捕查詢最佳做法

適用於:

  • Microsoft Defender XDR

套用這些建議以更快取得結果,並避免在執行複雜查詢時發生逾時。 如需提高查詢效能的更多指導方針,請參閱 Kusto 查詢最佳做法

瞭解 CPU 資源配額

根據其大小,每個租使用者都可以存取配置給執行進階搜捕查詢的一組 CPU 資源。 如需各種使用方式參數的詳細資訊, 請參閱進階搜捕配額和使用量參數

執行查詢之後,您可以看到運行時間及其資源使用量 (低、中、高) 。 高表示查詢耗費更多資源來執行,而且可以改善以更有效率地傳回結果。

Microsoft Defender 入口網站中 [結果] 索引標籤下的查詢詳細數據

定期執行多個查詢的客戶應該追蹤耗用量,並套用本文中的優化指引,以將超出配額或使用量參數所造成的中斷降至最低。

觀看 優化 KQL 查詢 ,以查看一些改善查詢的最常見方式。

一般優化秘訣

  • 調整新查詢的大小— 如果您懷疑查詢會傳回大型結果集,請先使用 count 運算符來評估它。 使用 限制 或其同義字 take 來避免大型結果集。

  • 提早套用篩選— 套用時間篩選和其他篩選來減少數據集,特別是在使用轉換和剖析函式之前,例如 子字串 () 取代 () 修剪 () toupper () parse_json () 。 在下列範例中,剖析函 式 extractjson () 會在篩選運算符減少記錄數目之後使用。

    DeviceEvents
    | where Timestamp > ago(1d)
    | where ActionType == "UsbDriveMount"
    | where DeviceName == "user-desktop.domain.com"
    | extend DriveLetter = extractjson("$.DriveLetter", AdditionalFields)
    
  • 已包含節點— 若要避免在字組內不必要地搜尋子字串,請使用 has 運算符,而不是 contains瞭解字串運算符

  • 查看特定資料行— 檢視特定資料行,而不是在所有數據行上執行全文搜索。 請勿使用 * 來檢查所有數據行。

  • 區分大小寫的速度— 區分大小寫的搜尋更具體,而且通常效能更高。 區分大小 寫的字串運算符名稱,例如 has_cscontains_cs,通常以 _cs結尾。 您也可以使用區分大小寫的 equals 運算子 ===~而不是 。

  • 剖析,不要擷取— 盡可能使用 剖析運算符 或剖析函 式,例如 parse_json () matches regex避免字串運算符或擷取 () 函式,這兩者都使用正則表達式。 保留使用正則表達式來進行更複雜的案例。 深入瞭解剖析函式

  • 篩選資料表而非表示式 — 如果您可以篩選資料表數據行,請勿篩選匯出數據行。

  • 沒有三個字元的字詞—避免使用三個字元或更少的字詞進行比較或篩選。 這些字詞不會編製索引,而且比對它們需要更多資源。

  • 選擇性地進行專案— 只投影您需要的數據行,讓您的結果更容易瞭解。 在執行 結或類似作業之前投影特定數據行也有助於改善效能。

優化運算 join

結運算子 會藉由比對指定數據行中的值,合併兩個數據表中的數據列。 套用這些秘訣,以優化使用此運算子的查詢。

  • 左側較小的數據表— 運算 join 符會將join語句左側數據表中的記錄與右邊的記錄進行比對。 若左邊有較小的數據表,就需要比對較少的記錄,因而加快查詢速度。

    在下表中,我們將左側數據表 DeviceLogonEvents 縮減為只涵蓋三個特定裝置,然後再依帳戶 SID 將它聯 IdentityLogonEvents 結。

    DeviceLogonEvents
    | where DeviceName in ("device-1.domain.com", "device-2.domain.com", "device-3.domain.com")
    | where ActionType == "LogonFailed"
    | join
        (IdentityLogonEvents
        | where ActionType == "LogonFailed"
        | where Protocol == "Kerberos")
    on AccountSid
    
  • 使用內部聯結類別— 預設 聯結類別innerunique 聯 結會依聯結索引鍵刪除左數據表中的數據列,然後再傳回右側數據表每個相符項目的數據列。 如果左側數據表有多個數據列具有相同的索引鍵值 join ,這些數據列將會重複數據刪除,以保留每個唯一值的單一隨機數據列。

    此預設行為可能會省略左側數據表中的重要資訊,以提供有用的深入解析。 例如,下列查詢只會顯示一封包含特定附件的電子郵件,即使使用多個電子郵件訊息傳送相同的附件也一樣:

    EmailAttachmentInfo
    | where Timestamp > ago(1h)
    | where Subject == "Document Attachment" and FileName == "Document.pdf"
    | join (DeviceFileEvents | where Timestamp > ago(1h)) on SHA256
    

    為了解決這項限制,我們藉由指定 kind=inner 來顯示左側數據表中具有右側相符值的所有數據列,以套用內部聯結類別:

    EmailAttachmentInfo
    | where Timestamp > ago(1h)
    | where Subject == "Document Attachment" and FileName == "Document.pdf"
    | join kind=inner (DeviceFileEvents | where Timestamp > ago(1h)) on SHA256
    
  • 從時間範圍聯結記錄— 調查安全性事件時,分析師會尋找大約在相同時間週期內發生的相關事件。 使用時套用 join 相同的方法也可藉由減少要檢查的記錄數目來提升效能。

    下列查詢會在收到惡意檔案的 30 分鐘內檢查登入事件:

    EmailEvents
    | where Timestamp > ago(7d)
    | where ThreatTypes has "Malware"
    | project EmailReceivedTime = Timestamp, Subject, SenderFromAddress, AccountName = tostring(split(RecipientEmailAddress, "@")[0])
    | join (
    DeviceLogonEvents
    | where Timestamp > ago(7d)
    | project LogonTime = Timestamp, AccountName, DeviceName
    ) on AccountName
    | where (LogonTime - EmailReceivedTime) between (0min .. 30min)
    
  • 在兩端套用時間篩選-即使您未調查特定的時間範圍,在左右兩個數據表上套用時間篩選可以減少記錄數目,以檢查並改善 join 效能。 下列查詢適用於 Timestamp > ago(1h) 這兩個數據表,因此它只會聯結過去一小時的記錄:

    EmailAttachmentInfo
    | where Timestamp > ago(1h)
    | where Subject == "Document Attachment" and FileName == "Document.pdf"
    | join kind=inner (DeviceFileEvents | where Timestamp > ago(1h)) on SHA256
    
  • 使用提示來提升效能— 使用提示搭配 join 運算子,指示後端在執行大量資源的作業時分散負載。 深入了解聯結提示

    例如,使用具有高基數的索引鍵來聯結數據表時, 隨機顯示提示 有助於改善查詢效能,這是具有許多唯一值的索引鍵,例如 AccountObjectId 下列查詢中的 :

    IdentityInfo
    | where JobTitle == "CONSULTANT"
    | join hint.shufflekey = AccountObjectId
    (IdentityDirectoryEvents
        | where Application == "Active Directory"
        | where ActionType == "Private data retrieval")
    on AccountObjectId
    

    當左數據表很小 (最多 100,000 筆記錄) 且右數據表非常大時, 廣播提示 會有所説明。 例如,下列查詢嘗試聯結一些具有特定主旨的電子郵件,以及數據表中EmailUrlInfo包含連結的所有訊息:

    EmailEvents
    | where Subject in ("Warning: Update your credentials now", "Action required: Update your credentials now")
    | join hint.strategy = broadcast EmailUrlInfo on NetworkMessageId
    

優化運算 summarize

summarize 運算符 會匯總數據表的內容。 套用這些秘訣,以優化使用此運算子的查詢。

  • 尋找相異值 — 一般而言,使用 summarize 來尋找可重複的相異值。 您可能不需要使用它來匯總沒有重複值的數據行。

    雖然單一電子郵件可以是多個事件的一部分,但下列範例 並不是 有效率的 summarize 使用方式,因為個別電子郵件的網路訊息標識符一律會隨附唯一發件者位址。

    EmailEvents
    | where Timestamp > ago(1h)
    | summarize by NetworkMessageId, SenderFromAddress
    

    運算 summarize 子可以輕鬆地取代為 project,產生可能相同的結果,同時耗用較少的資源:

    EmailEvents
    | where Timestamp > ago(1h)
    | project NetworkMessageId, SenderFromAddress
    

    下列範例會更有效率地使用 summarize ,因為寄件者位址可能會有多個不同的實例,而寄件者位址會將電子郵件傳送至相同的收件者位址。 這類組合比較不相異,而且可能會有重複專案。

    EmailEvents
    | where Timestamp > ago(1h)
    | summarize by SenderFromAddress, RecipientEmailAddress
    
  • 隨機查詢— 雖然 summarize 最適合用於具有重複值的數據行,但相同的數據行也可以有 高基數 或大量的唯一值。 和運算子一join樣,您也可以使用 套用隨機顯示提示summarize,以散發處理負載,並在具有高基數的數據行上操作時提升效能。

    下列查詢會使用 summarize 來計算不同的收件者電子郵件位址,這可以在數十萬大型組織中執行。 為了改善效能,它會納入 hint.shufflekey

    EmailEvents
    | where Timestamp > ago(1h)
    | summarize hint.shufflekey = RecipientEmailAddress count() by Subject, RecipientEmailAddress
    

查詢案例

使用進程識別碼識別唯一的進程

程序識別碼 (PID) 會在 Windows 中回收,並針對新程序重複使用。 它們本身不能充當特定程序的唯一識別碼。

若要為特定電腦上的程序取得唯一識別碼,請使用程序識別碼與程序建立時間。 結合或摘要處理程序中的資料時,需包含電腦識別碼的欄位 (DeviceIdDeviceName)、程序識別碼 (ProcessIdInitiatingProcessId) 以及程序建立時間 (ProcessCreationTimeInitiatingProcessCreationTime)

下列範例查詢發現透過連接埠 445 (SMB) 存取 10 個以上 IP 位址的程序,可能是因為掃描檔案共用。

例如查詢:

DeviceNetworkEvents
| where RemotePort == 445 and Timestamp > ago(12h) and InitiatingProcessId !in (0, 4)
| summarize RemoteIPCount=dcount(RemoteIP) by DeviceName, InitiatingProcessId, InitiatingProcessCreationTime, InitiatingProcessFileName
| where RemoteIPCount > 10

查詢會以 InitiatingProcessIdInitiatingProcessCreationTime 進行彙總,因此它會檢查單一程序,而不會將多個具有相同程序識別碼的程序混合在一起。

查詢命令行

有許多方法可以建構命令列來完成工作。 例如,攻擊者可以參考沒有路徑、不含擴展名、使用環境變數或加上引號的圖像檔案。 攻擊者也可以變更參數的順序,或加入多個引號和空格。

若要在命令行周圍建立更持久的查詢,請套用下列做法:

  • 藉由比對檔名字段,而不是在命令行本身進行篩選,來識別 (的已知進程 ,例如net.exe 或psexec.exe) 。
  • 使用 parse_command_line () 式剖析命令行區段
  • 查詢命令列引數時,請勿以特定順序尋找多個不相關引數上完全相符的內容。 請改用規則運算式或使用多個不同的包含運算子。
  • 使用不區分大小寫對比。 例如,使用 =~in~contains== 而不是、 incontains_cs
  • 若要減輕命令行混淆技術,請考慮移除引號、以空格取代逗號,以及以單一空格取代多個連續空格。 有更複雜的混淆技術需要其他方法,但這些調整有助於解決常見的問題。

下列範例示範各種建構查詢的方式,該查詢會尋找檔案 net.exe 來停止防火牆服務 “MpsSvc”:

// Non-durable query - do not use
DeviceProcessEvents
| where ProcessCommandLine == "net stop MpsSvc"
| limit 10

// Better query - filters on file name, does case-insensitive matches
DeviceProcessEvents
| where Timestamp > ago(7d) and FileName in~ ("net.exe", "net1.exe") and ProcessCommandLine contains "stop" and ProcessCommandLine contains "MpsSvc"

// Best query also ignores quotes
DeviceProcessEvents
| where Timestamp > ago(7d) and FileName in~ ("net.exe", "net1.exe")
| extend CanonicalCommandLine=replace("\"", "", ProcessCommandLine)
| where CanonicalCommandLine contains "stop" and CanonicalCommandLine contains "MpsSvc"

從外部來源內嵌數據

若要將長清單或大型數據表併入查詢中,請使用 externaldata運算子 從指定的URI內嵌資料。 您可以從 TXT、CSV、JSON 或其他格式的檔案取得數據。 下列範例示範如何利用 MalwareBazaar (abuse.ch) 所提供的大量惡意代碼 SHA-256 哈希清單來檢查電子郵件上的附件:

let abuse_sha256 = (externaldata(sha256_hash: string)
[@"https://bazaar.abuse.ch/export/txt/sha256/recent/"]
with (format="txt"))
| where sha256_hash !startswith "#"
| project sha256_hash;
abuse_sha256
| join (EmailAttachmentInfo
| where Timestamp > ago(1d)
) on $left.sha256_hash == $right.SHA256
| project Timestamp,SenderFromAddress,RecipientEmailAddress,FileName,FileType,
SHA256,ThreatTypes,DetectionMethods

剖析字串

您可以使用各種函式來有效率地處理需要剖析或轉換的字串。

字串 函數 使用範例
命令行 parse_command_line () 擷取命令和所有自變數。
Paths parse_path () 擷取檔案或資料夾路徑的區段。
版本號碼 parse_version () 解構版本號碼,其中最多包含四個區段,每個區段最多有八個字元。 使用剖析的數據來比較版本存留期。
IPv4 位址 parse_ipv4 () 將IPv4位址轉換成長整數。 若要比較 IPv4 位址而不進行轉換,請使用 ipv4_compare ()
IPv6 位址 parse_ipv6 () 將IPv4或IPv6位址轉換為標準IPv6表示法。 若要比較 IPv6 位址,請使用 ipv6_compare ()

若要瞭解所有支援的剖析函式, 請參閱 Kusto 字串函式

注意事項

本文中的某些數據表可能無法在 適用於端點的 Microsoft Defender 中使用。 開啟 Microsoft Defender 全面偵測回應,以使用更多數據源來搜捕威脅。 您可以遵循從 適用於端點的 Microsoft Defender 移轉進階搜捕查詢中的步驟,將進階搜捕工作流程從 適用於端點的 Microsoft Defender 移至 Microsoft Defender 全面偵測回應

提示

想要深入了解? 請到我們的技術社群中與 Microsoft 安全性社群互動: Microsoft Defender 全面偵測回應技術社群