整理適用於 Windows 事件記錄的 Sigma 規則¶
本頁說明 Yamato Security 如何透過將 logsource 欄位去抽象化,並篩除無法使用或難以使用的規則,將上游 Sigma 適用於 Windows 事件記錄的規則整理成更易於使用的形式。這是透過 sigma-to-hayabusa-converter 工具完成的,該工具主要用於建立託管在 hayabusa-rules 的精選 Sigma 規則集。該規則集由 Hayabusa 與 Velociraptor 使用。
來源
本文件與轉換工具一起維護,位於 Yamato-Security/sigma-to-hayabusa-converter。我們希望這些資訊對於其他想要使用 Sigma 規則來偵測 Windows 事件記錄中攻擊的專案也有幫助。另請參閱 建立規則檔案 與 欄位修飾子。
TL;DR¶
- 將
logsource欄位去抽象化,並為內建規則以及原始的 Sysmon 基礎規則建立新的.yml規則檔案,可讓 Sigma 規則更容易完整支援內建事件,也讓分析人員更容易閱讀規則。 - 在為 Windows 事件記錄撰寫 Sigma 規則時,了解原始 Sysmon 基礎記錄與相容的內建記錄之間的差異非常重要,最理想的情況是撰寫能同時相容兩者的規則。
- 許多組織無法或不願意在所有 Windows 端點上安裝並維護 Sysmon 代理程式,因為他們沒有專門的資源來處理,或是想要避免 Sysmon 造成任何速度變慢或當機的風險。因此,盡可能啟用越多內建事件記錄,並使用能夠在這些內建記錄中偵測攻擊的工具,就顯得相當重要。
上游 Sigma 規則在 Windows 事件記錄上的挑戰¶
根據我們的經驗,為 Windows 事件記錄建立原生 Sigma 規則剖析器的主要挑戰,一直是支援 logsource 欄位。目前這是 Hayabusa 少數尚未原生支援的功能之一,因為它仍然非常複雜且正在開發中。目前我們透過將上游規則轉換為更易於使用的格式來解決此問題,詳細說明如下。
關於 logsource 欄位¶
在適用於 Windows 事件記錄的 Sigma 規則中,product 欄位設定為 windows,接著是 service 欄位或 category 欄位。
service 欄位範例:
category 欄位範例:
Service 欄位¶
service 欄位相對容易處理,它會告訴使用該 Sigma 規則的任何後端,根據 Windows XML 事件記錄中的 Channel 欄位搜尋單一通道或多個通道。
單一通道範例
service: application 等同於在 Sigma 規則中加入 Channel: Application 的選擇條件。
多重通道範例
service: applocker 目前產生最多需要搜尋的通道,因為 AppLocker 會將資訊儲存在四個不同的記錄中。為了正確地僅搜尋 AppLocker 記錄,需要在 Sigma 規則邏輯中加入以下條件:
Channel:
- Microsoft-Windows-AppLocker/MSI and Script
- Microsoft-Windows-AppLocker/EXE and DLL
- Microsoft-Windows-AppLocker/Packaged app-Deployment
- Microsoft-Windows-AppLocker/Packaged app-Execution
目前的 service 對應清單
| 服務 | 通道 |
|---|---|
| application | Application |
| application-experience | Microsoft-Windows-Application-Experience/Program-Telemetry, Microsoft-Windows-Application-Experience/Program-Compatibility-Assistant |
| applocker | Microsoft-Windows-AppLocker/MSI and Script, Microsoft-Windows-AppLocker/EXE and DLL, Microsoft-Windows-AppLocker/Packaged app-Deployment, Microsoft-Windows-AppLocker/Packaged app-Execution |
| appmodel-runtime | Microsoft-Windows-AppModel-Runtime/Admin |
| appxpackaging-om | Microsoft-Windows-AppxPackaging/Operational |
| bits-client | Microsoft-Windows-Bits-Client/Operational |
| capi2 | Microsoft-Windows-CAPI2/Operational |
| certificateservicesclient-lifecycle-system | Microsoft-Windows-CertificateServicesClient-Lifecycle-System/Operational |
| codeintegrity-operational | Microsoft-Windows-CodeIntegrity/Operational |
| diagnosis-scripted | Microsoft-Windows-Diagnosis-Scripted/Operational |
| dhcp | Microsoft-Windows-DHCP-Server/Operational |
| dns-client | Microsoft-Windows-DNS Client Events/Operational |
| dns-server | DNS Server |
| dns-server-analytic | Microsoft-Windows-DNS-Server/Analytical |
| driver-framework | Microsoft-Windows-DriverFrameworks-UserMode/Operational |
| firewall-as | Microsoft-Windows-Windows Firewall With Advanced Security/Firewall |
| hyper-v-worker | Microsoft-Windows-Hyper-V-Worker |
| kernel-event-tracing | Microsoft-Windows-Kernel-EventTracing |
| kernel-shimengine | Microsoft-Windows-Kernel-ShimEngine/Operational, Microsoft-Windows-Kernel-ShimEngine/Diagnostic |
| ldap_debug | Microsoft-Windows-LDAP-Client/Debug |
| lsa-server | Microsoft-Windows-LSA/Operational |
| microsoft-servicebus-client | Microsoft-ServiceBus-Client |
| msexchange-management | MSExchange Management |
| ntfs | Microsoft-Windows-Ntfs/Operational |
| ntlm | Microsoft-Windows-NTLM/Operational |
| openssh | OpenSSH/Operational |
| powershell | Microsoft-Windows-PowerShell/Operational, PowerShellCore/Operational |
| powershell-classic | Windows PowerShell |
| printservice-admin | Microsoft-Windows-PrintService/Admin |
| printservice-operational | Microsoft-Windows-PrintService/Operational |
| security | Security |
| security-mitigations | Microsoft-Windows-Security-Mitigations* |
| shell-core | Microsoft-Windows-Shell-Core/Operational |
| smbclient-connectivity | Microsoft-Windows-SmbClient/Connectivity |
| smbclient-security | Microsoft-Windows-SmbClient/Security |
| system | System |
| sysmon | Microsoft-Windows-Sysmon/Operational |
| taskscheduler | Microsoft-Windows-TaskScheduler/Operational |
| terminalservices-localsessionmanager | Microsoft-Windows-TerminalServices-LocalSessionManager/Operational |
| vhdmp | Microsoft-Windows-VHDMP/Operational |
| wmi | Microsoft-Windows-WMI-Activity/Operational |
| windefend | Microsoft-Windows-Windows Defender/Operational |
Service 對應來源
我們建立了將服務對應到通道名稱的 YAML 對應檔案,並定期維護、託管在轉換器儲存庫中。它們是根據 SigmaHQ/sigma tests/thor.yml 中的服務對應資訊而來:雖然這似乎不是供人使用的官方通用設定檔,但它似乎是最新的。
Category 欄位¶
大多數 category 欄位只是在搜尋特定 Channel 之外,額外加入一個條件來檢查 EventID 欄位中的特定事件 ID。這些類別名稱大多以 Sysmon 事件為基礎,並針對內建的 PowerShell 記錄與 Windows Defender 增加了一些額外的類別。
Category 欄位範例
目前的 category 對應清單
有些類別會對應到多個 service/EventID(以粗體顯示)。
| 類別 | 服務 | 事件 ID |
|---|---|---|
| antivirus | windefend | 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1017, 1018, 1019, 1115, 1116 |
| clipboard_change | sysmon | 24 |
| create_remote_thread | sysmon | 8 |
| create_stream_hash | sysmon | 15 |
| dns_query | sysmon | 22 |
| driver_load | sysmon | 6 |
| file_block_executable | sysmon | 27 |
| file_block_shredding | sysmon | 28 |
| file_change | sysmon | 2 |
| file_creation | sysmon | 11 |
| file_delete | sysmon | 23, 26 |
| file_delete_detected | sysmon | 26 |
| file_executable_detected | sysmon | 29 |
| image_load | sysmon | 7 |
| network_connection | sysmon | 3 |
| network_connection | security | 5156 |
| pipe_created | sysmon | 17, 18 |
| process_access | sysmon | 10 |
| process_creation | sysmon | 1 |
| process_creation | security | 4688 |
| process_tampering | sysmon | 25 |
| process_termination | sysmon | 5 |
| ps_classic_provider_start | powershell-classic | 600 |
| ps_classic_start | powershell-classic | 400 |
| ps_module | powershell | 4103 |
| ps_script | powershell | 4104 |
| raw_access_thread | sysmon | 9 |
| registry_add | sysmon | 12 |
| registry_add | security | 4657 |
| registry_delete | sysmon | 12 |
| registry_event | sysmon | 12, 13, 14 |
| registry_event | security | 4657 |
| registry_rename | sysmon | 14 |
| registry_set | sysmon | 13 |
| registry_set | security | 4657 |
| sysmon_error | sysmon | 255 |
| sysmon_status | sysmon | 4, 16 |
| wmi_event | sysmon | 19, 20, 21 |
Category 欄位的挑戰
如上所示,同一個 category 可以使用多個服務與事件 ID(以粗體標示)。這表示,如果規則所使用的欄位也存在於內建事件記錄中,就有可能將某些為 sysmon 設計的 Sigma 規則用於類似的內建 Windows security 事件記錄。在這種情況下,可能需要轉換欄位名稱——有時也包括值——以符合內建 security 事件記錄的欄位名稱與值。雖然對某些類別來說這可能只是重新命名一些欄位名稱那麼簡單,但對其他類別而言,可能還需要對欄位值進行各種轉換。我們如何進行這項轉換,以及 sysmon 記錄與 security 記錄之間的相容性,將在下方詳細說明。
Category 對應來源
類別的 YAML 對應檔案同樣託管在轉換器儲存庫中,也是根據 SigmaHQ/sigma tests/thor.yml 中的資訊而來。
抽象化記錄來源的優點與挑戰¶
在後端抽象化記錄來源,並為不同的 Channel、EventID 與欄位建立對應,既有優點也有挑戰。
優點¶
- 在將 Sigma 規則轉換為其他後端查詢時,將
Channel與EventID欄位名稱轉換為適當的後端欄位名稱可能會更容易。 - 可以將兩條規則整合為一條。例如,處理程序建立事件可以記錄在
Sysmon 1以及Security 4688中。與其撰寫兩條查看不同通道、事件 ID 與欄位但邏輯相同的規則,不如將欄位標準化為 Sysmon 所使用的形式,然後讓後端轉換器加入Channel與EventID欄位,並在必要時轉換其他欄位資訊。這讓規則的維護更容易,因為需要維護的規則數量減少了。 - 雖然非常罕見,但如果某個記錄來源開始將其資料記錄在不同的
Channel或EventID中,只需要更新對應邏輯,而不必更新所有 Sigma 規則,讓維護更容易。
挑戰¶
- 如果原始基於 Sysmon 的 Sigma 規則使用了某個內建記錄中不存在的欄位來過濾誤報,會發生什麼事?你應該還是建立該規則,以偵測能力為優先;還是忽略它,以減少誤報為優先?理想情況下,需要建立兩條具有不同
severity、status與誤報資訊的規則,讓使用者能更好地處理。 - 這會讓篩選規則變得更困難,因為如果檔案尚未建立,你就無法僅根據
.yml檔案中的Channel或EventID欄位,或規則的檔案路徑來篩選——因為它是針對內建記錄的衍生規則,而非原始的 Sysmon 規則。此外,由於規則 ID 相同,你也無法根據規則 ID 進行篩選。 - 當警示來自由 Sysmon 記錄衍生而來、針對內建記錄的規則時,這會讓確認警示變得更困難。欄位名稱與值無法對應,因此分析人員需要理解這個略為複雜的轉換過程。
- 這會讓後端邏輯的建立更複雜。
對於第一個問題,除了在有值得投入心力的重要使用情境時建立並維護新規則之外,我們無能為力;但為了解決第 2 到第 4 個問題,我們決定將 logsource 欄位去抽象化,並為任何能夠產生多條規則的規則建立兩套規則。能夠在內建記錄中偵測攻擊的規則會輸出到 builtin 目錄,而針對 Sysmon 的規則則輸出到 sysmon 目錄。
轉換範例¶
以下是一個簡單的範例,以便更好地理解轉換過程。
轉換前 — 原始的 Sigma 規則:
logsource:
category: process_creation
product: windows
detection:
selection:
- Image|endswith: '.exe'
condition: selection
轉換後 — 適用於 Sysmon 記錄的 Hayabusa 相容規則:
logsource:
category: process_creation
product: windows
detection:
process_creation:
Channel: Microsoft-Windows-Sysmon/Operational
EventID: 1
selection:
- Image|endswith: '.exe'
condition: process_creation and selection
……以及適用於 Windows 內建記錄的 Hayabusa 相容規則:
logsource:
category: process_creation
product: windows
detection:
process_creation:
Channel: Security
EventID: 4688
selection:
- NewProcessName|endswith: '.exe'
condition: process_creation and selection
如你所見,已建立兩條規則:一條用於 Sysmon 1 記錄,一條用於內建的 Security 4688 記錄。新增了一個帶有通道與事件 ID 資訊的 process_creation 條件,並將它加入 condition 欄位以要求符合此條件。此外,原本的 Image 欄位名稱已變更為 NewProcessName。
轉換的共通處理¶
在詳細說明我們如何轉換特定類別之前,以下是適用於所有規則的轉換部分。
- 任何 ID 出現在
ignore-uuid-list.txt中的規則都會被忽略。目前我們只會忽略那些因為含有mimikatz之類關鍵字而在 Windows Defender 上造成誤報的規則。 - 「Placeholder」(佔位)規則會被忽略,因為它們無法直接使用。這些是放在 Sigma 儲存庫中
rules-placeholder資料夾內的規則。 -
使用不相容欄位修飾子的規則會被捨棄。Hayabusa 支援大多數的欄位修飾子,因此為了避免剖析錯誤,轉換器不會輸出任何使用下列以外修飾子的規則(請參閱 欄位修飾子):
all,base64,base64offset,cased,cidr,contains,endswith,endswithfield,equalsfield,exists,fieldref,gt,gte,lt,lte,re,startswith,utf16,utf16be,utf16le,wide,windash -
含有語法錯誤的規則不會被轉換。
deprecated與unsupported規則中的標籤會從 V1 格式更新為 V2 格式,V2 格式使用-而非_,以保持一致並讓 Hayabusa 更容易處理縮寫。例如:initial_access會變成initial-access。-
由於我們會在規則中加入
Channel與EventID資訊,因此我們會使用原始 ID 的 MD5 雜湊值建立一個新的 UUIDv4 ID,在related欄位中指定原始 ID,並將type標記為derived。對於可以轉換成多條規則(sysmon與builtin)的規則,我們也需要為衍生的builtin規則建立新的規則 ID。為此,我們會計算sysmon規則 ID 的 MD5 雜湊值,並將其用於 UUIDv4 ID。例如:原始的 Sigma 規則:
新的
sysmon規則:title: 7Zip Compressing Dump Files id: ec570e53-4c76-45a9-804d-dc3f355ff7a7 related: - id: 1ac14d38-3dfc-4635-92c7-e3fd1c5f5bfc type: derived新的
builtin規則: -
在內建 Windows 事件記錄中進行偵測的規則會輸出到
builtin目錄,而依賴 Sysmon 記錄的規則則輸出到sysmon目錄,其子目錄與上游 Sigma 儲存庫中的目錄相符。
轉換的限制¶
目前只有一個已知的錯誤:Sigma 規則中的註解行不會被包含在輸出規則中,除非這些註解跟在某些原始碼之後。
Sysmon 與內建事件的比較及規則轉換¶
處理程序建立¶
- 類別:
process_creation - Sysmon
- 通道:
Microsoft-Windows-Sysmon/Operational - 事件 ID:
1
- 通道:
- 內建記錄
- 通道:
Security - 事件 ID:
4688
- 通道:
比較
轉換注意事項
User欄位資訊需要拆分為SubjectUserName與SubjectDomainName兩個欄位。LogonId欄位名稱變更為SubjectLogonId,且十六進位值中的任何字母都需要轉為小寫。ProcessId欄位名稱變更為NewProcessId,且值需要轉換為十六進位。Image欄位名稱變更為NewProcessName。ParentProcessId欄位名稱變更為ProcessId,且值需要轉換為十六進位。ParentImage欄位名稱變更為ParentProcessName。IntegrityLevel欄位名稱變更為MandatoryLabel,且需要進行以下值的轉換:Low:S-1-16-4096Medium:S-1-16-8192High:S-1-16-12288System:S-1-16-16384
- 如果規則包含以下僅存在於
Security 4688事件中的欄位,我們就不會建立Sysmon 1規則:SubjectUserSid,TokenElevationType,TargetUserSid,TargetUserName,TargetDomainName,TargetLogonId
- 如果規則包含以下僅存在於
Sysmon 1事件中的欄位,我們就不會建立Security 4688規則:RuleName,UtcTime,ProcessGuid,FileVersion,Description,Product,Company,OriginalFileName,CurrentDirectory,LogonGuid,TerminalSessionId,Hashes,ParentProcessGuid,ParentCommandLine,ParentUser
-
第 8 點與第 9 點有一個例外:即使使用了僅存在於某一種記錄事件中的欄位,只要該欄位位於
OR條件中,你仍然應該建立該規則。例如,以下規則不應產生Security 4688規則,因為OriginalFileName欄位是必要的(選擇項內為AND邏輯):然而,具有以下條件的規則應該建立
Security 4688規則,因為OriginalFileName是選用的(選擇項內為OR邏輯):困難之處在於,你的剖析器不僅要理解選擇項內部的邏輯,還要理解
condition欄位內部的邏輯。例如,以下規則不應建立Security 4688規則,因為它使用AND邏輯:selection_img: Image|endswith: \addinutil.exe selection_orig: OriginalFileName: AddInUtil.exe condition: selection_img and selection_orig然而,以下規則應該建立
Security 4688規則,因為它使用OR邏輯:
其他注意事項
Security 4688中的SubjectUserSid欄位顯示 SID;然而,在轉譯後的事件記錄Message中,它會被轉換為DOMAIN\User。- 視設定而定,
Security 4688事件的CommandLine中可能不包含命令列選項資訊。 TokenElevationType在Message中會原樣顯示,不會被轉譯。MandatoryLabel中的S-1-16-4096等值,在轉譯後的Message中會被轉換為Mandatory Label\Low Mandatory Level等。
內建記錄設定
預設未啟用
重要的內建 Security 4688 處理程序建立事件記錄預設並未啟用。你需要同時啟用 4688 事件與命令列選項記錄,才能使用大多數的 Sigma 規則。
透過群組原則啟用:
Computer Configuration > Policies > Windows Settings > Security Settings > Advanced Audit Configuration > Detailed Tracking > Audit Process Creation:EnabledAdministrative Templates > System > Audit Process Creation > Include command line in process creation events:Enabled
透過命令列啟用:
auditpol /set /subcategory:{0CCE922B-69AE-11D9-BED3-505054503030} /success:enable /failure:enable
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit /v ProcessCreationIncludeCmdLine_Enabled /f /t REG_DWORD /d 1
網路連線¶
- 類別:
network_connection - Sysmon
- 通道:
Microsoft-Windows-Sysmon/Operational - 事件 ID:
3
- 通道:
- 內建記錄
- 通道:
Security - 事件 ID:
5156
- 通道:
比較
轉換注意事項
ProcessId欄位名稱變更為ProcessID。Image欄位名稱變更為Application,且C:\變更為\device\harddiskvolume?\。(注意:由於我們不知道硬碟磁碟區編號,因此以單一字元萬用字元?取代。)Protocol欄位值tcp變更為6,udp變更為17。Initiated欄位名稱變更為Direction,且值true變更為%%14593,false變更為%%14592。SourceIp欄位名稱變更為SourceAddress。DestinationIp欄位名稱變更為DestAddress。DestinationPort欄位名稱變更為DestPort。
內建記錄設定
預設未啟用
內建的 Security 5156 網路連線記錄預設並未啟用。它們會產生大量記錄,可能覆寫 Security 事件記錄中的其他重要記錄,並在系統有大量網路連線時可能拖慢系統。請確保 Security 記錄的最大檔案大小夠大,並進行測試以確認不會對系統造成不良影響。
透過群組原則啟用:
Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Object Access -> Filtering Platform Connection:Success and Failure
透過命令列啟用:
……如果你使用非英文的地區設定,則使用以下命令:
另請參閱
如需更多關於啟用這些規則所依賴之證據所需的內建 Windows 事件記錄的資訊,請參閱 Windows 記錄與 Sysmon 以及 EnableWindowsLogSettings 專案。
Sigma 規則撰寫建議¶
Tip
如果你使用了任何存在於 sysmon 記錄但不存在於 builtin 記錄中的欄位,請務必將該欄位設為選用,這樣仍然可以將該規則用於 builtin 記錄。
例如:
此選擇項會尋找處理程序(Image)名稱為 addinutil.exe 的情況。問題在於攻擊者只要重新命名檔案就能繞過該規則。僅存在於 Sysmon 記錄中的 OriginalFileName 欄位,是在編譯時嵌入二進位檔的檔名。即使攻擊者重新命名檔案,嵌入的名稱也不會改變,因此在使用 Sysmon 時,此規則能夠偵測攻擊者已重新命名檔案的攻擊;而在使用標準內建記錄時,也能偵測未變更檔名的攻擊。
預先轉換的 Sigma 規則¶
以本頁所述方式——透過將 logsource 欄位去抽象化——所整理的 Sigma 規則,託管在 hayabusa-rules 儲存庫的 sigma 資料夾下。
工具環境¶
如果你想在本機將 Sigma 規則轉換為 Hayabusa 相容格式,首先需要安裝 Poetry。請參閱官方 Poetry 安裝文件。
工具使用方式¶
sigma-to-hayabusa-converter.py 是我們用來將 Sigma 規則的 logsource 欄位轉換為 Hayabusa 相容格式的主要工具。執行以下步驟來運行它:
git clone https://github.com/SigmaHQ/sigma.git
git clone https://github.com/Yamato-Security/sigma-to-hayabusa-converter.git
cd sigma-to-hayabusa-converter
poetry install --no-root
poetry run python sigma-to-hayabusa-converter.py -r ../sigma -o ./converted_sigma_rules
執行上述命令後,轉換為 Hayabusa 相容格式的規則會輸出到 ./converted_sigma_rules 目錄。

