很多企業有「禁止使用 USB 隨身碟」或「只能用公司配發的隨身碟」的規定,但規定歸規定,有沒有人在用、用的是哪一支,總要有辦法知道。Wazuh 可以在 Windows 端點偵測 USB 儲存裝置的接入,產生告警,甚至區分「授權」與「未授權」的裝置。
官方有兩種做法:一種是用指令監控查登錄檔,另一種是用 Windows 的稽核事件。這篇把兩種都整理起來,也說明它們的差異。
兩種做法比較
| 項目 | 方法一:指令監控 | 方法二:稽核事件 6416 |
|---|---|---|
| 原理 | 定期執行 reg QUERY 查 USBSTOR 登錄機碼 | Windows 記錄「偵測到新的外接裝置」事件 |
| 需要 | 端點開啟遠端指令執行 | 端點開啟「稽核 PNP 活動」 |
| 即時性 | 依指令的執行間隔 | 插入當下就產生事件 |
| 每次插入都偵測 | 否,登錄檔記錄的是曾經接過的裝置 | 是 |
| 區分授權/未授權 | 不容易 | 可以搭配 CDB list |
| 適用版本 | Windows 都可以 | Windows 10、Windows Server 2016 以上 |
我比較推薦方法二:每次插入都會產生事件,資訊也比較完整,還能做白名單。方法一的限制在後面會說明。
方法一:指令監控 USBSTOR
原理
Windows 會把接過的 USB 儲存裝置記錄在登錄機碼 HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR。讓 Wazuh agent 定期執行 reg QUERY 查這個機碼,有輸出就產生告警。
Windows 端:允許遠端指令
指令是從 manager 的集中設定下發的,端點要先允許執行。以系統管理員身分編輯 C:\Program Files (x86)\ossec-agent\local_internal_options.conf,加入:
logcollector.remote_commands=1
重新啟動 agent:
Restart-Service -Name wazuh
注意:開啟遠端指令執行之後,manager 下發的任何指令都會在端點上執行。manager 被入侵的話,攻擊者就能在所有開啟這個選項的端點執行指令,請評估風險,只在需要的端點開啟。
Manager 端:下發指令設定
編輯 /var/ossec/etc/shared/default/agent.conf(或該端點所屬的群組):
<agent_config os="Windows">
<localfile>
<log_format>command</log_format>
<command>reg QUERY HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR</command>
<alias>check_usb_connectivity</alias>
</localfile>
</agent_config>
log_format為command:指令的輸出每一行都當成一筆事件alias:替指令取一個名稱,規則用它來比對
Manager 端:規則
編輯 /var/ossec/etc/rules/local_rules.xml:
<group name="detect_usb_storage,">
<rule id="100016" level="7">
<if_sid>530</if_sid>
<match>^ossec: output: 'check_usb_connectivity':</match>
<description>New USB device connected</description>
</rule>
</group>
530 是 Wazuh 內建「指令輸出」的基礎規則,match 裡的名稱要和 alias 完全一致。
systemctl restart wazuh-manager
這個做法的限制
USBSTOR記錄的是所有曾經接過的裝置,不是現在插著的裝置。只要接過一次,之後每次執行指令都會有輸出,也就每次都會產生告警- 同一支隨身碟拔掉再插,登錄檔的內容不會改變,看不出「這次又插了」
- 告警間隔取決於指令的執行頻率,不是插入的當下
比較實際的用法是改成 full_command,搭配規則的 check_diff,只在輸出內容改變時(出現新的裝置)告警:
<localfile>
<log_format>full_command</log_format>
<command>reg QUERY HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR</command>
<alias>check_usb_connectivity</alias>
<frequency>300</frequency>
</localfile>
<rule id="100016" level="7">
<if_sid>530</if_sid>
<match>^ossec: output: 'check_usb_connectivity'</match>
<check_diff />
<description>New USB storage device appeared in USBSTOR</description>
</rule>
這樣就變成「偵測第一次接上的新裝置」,適合拿來掌握環境裡出現過哪些隨身碟。
方法二:稽核事件 6416
原理
Windows 10、Windows Server 2016 起,開啟「稽核 PNP 活動」後,系統偵測到新的外接裝置時會記錄事件 6416,內容包含裝置描述與 Device ID(含廠牌、型號、序號)。Wazuh agent 預設就會收集安全性事件記錄,只要加上規則即可。
Windows 端:開啟稽核 PNP 活動
單機可以用本機安全性原則:「進階稽核原則設定 → 系統稽核原則 → 詳細追蹤 → 稽核 PNP 活動」,勾選「成功」。
或用指令設定(英文版 Windows):
auditpol /set /subcategory:"Plug and Play Events" /success:enable
auditpol /get /subcategory:"Plug and Play Events"
中文版 Windows 的子類別名稱是中文的,可以先用 auditpol /list /subcategory:* /v 列出所有子類別與它們的 GUID,再用 GUID 設定,就不受語系影響。
網域環境建議用群組原則統一套用到所有電腦,不用一台一台設定。
Manager 端:偵測規則
<group name="windows-usb-detect,">
<rule id="111000" level="7">
<if_sid>60103</if_sid>
<field name="win.system.eventID">^6416$</field>
<match>USBSTOR\\Disk</match>
<options>no_full_log</options>
<description>Windows: A PNP device $(win.eventdata.deviceDescription) was connected to $(win.system.computer)</description>
</rule>
</group>
if_sid 60103:Windows 安全性稽核成功事件的基礎規則- 事件 ID 6416 且內容包含
USBSTOR\\Disk:只抓 USB 儲存裝置,不會連滑鼠、鍵盤都告警
systemctl restart wazuh-manager
插入隨身碟,就能在威脅狩獵(Threat Hunting)看到 111000 的告警。
區分授權與未授權裝置
方法二可以進一步用 CDB list 做白名單。
取得裝置的 Device ID
在告警的詳細資料中展開 data.win.eventdata.deviceId,複製它的值,例如:
USBSTOR\Disk&Ven_Vendor&Prod_USB_Flash_Drive&Rev_1100\0123456789ABCDEF&0
Device ID 包含廠牌、型號與序號,所以可以精確到「某一支」隨身碟。
建立白名單
touch /var/ossec/etc/lists/usb-drives
echo 'USBSTOR\\Disk&Ven_Vendor&Prod_USB_Flash_Drive&Rev_1100\\0123456789ABCDEF&0:' >> /var/ossec/etc/lists/usb-drives
每一行是一個 Device ID,結尾加 :(CDB list 的格式是 key:value,這裡只用 key)。在 /var/ossec/etc/ossec.conf 的 <ruleset> 裡加入:
<list>etc/lists/usb-drives</list>
授權與未授權規則
<rule id="111001" level="5">
<if_sid>111000</if_sid>
<options>no_full_log</options>
<description>Windows: Authorized PNP device $(win.eventdata.deviceDescription) was connected to $(win.system.computer).</description>
</rule>
<rule id="111002" level="8">
<if_sid>111000</if_sid>
<list field="win.eventdata.deviceId" lookup="not_match_key">etc/lists/usb-drives</list>
<options>no_full_log</options>
<description>Windows: Unauthorized PNP device $(win.eventdata.deviceDescription) was connected to $(win.system.computer).</description>
</rule>
systemctl restart wazuh-manager
白名單裡的裝置觸發 111001(等級 5),不在清單裡的觸發 111002(等級 8),可以只針對 111002 設定通知。
日常維護
- 新增授權裝置:把 Device ID 加進清單,重新啟動 manager
- 撤銷授權:從清單移除,重新啟動後就會被判定為未授權
- 清單變大之後,可以參考〈Wazuh 上傳 CDB list 的檔案大小限制〉
Wazuh 官方部落格也提供了現成的視覺化檔案(.ndjson),可以在「Dashboard management → Saved objects → Import」匯入,直接看到授權與未授權的統計。
驗收清單
- 插入任一 USB 隨身碟,產生
111000 - 把它加入白名單,再插一次,產生
111001 - 插入不在清單裡的隨身碟,產生
111002
注意事項
- 偵測不等於阻擋:Wazuh 只能告訴你有人插了隨身碟,要真正禁止使用,要搭配群組原則(禁止可卸除式存放裝置)或端點防護軟體
- 序號可能重複或為空:便宜的隨身碟有些沒有唯一序號,Device ID 可能和同型號的其他隨身碟一樣,白名單就無法精確到單一支
- 事先告知使用者:監控 USB 使用屬於員工監控的一部分,建議在公司的資訊安全政策中明確說明
結論
要偵測 USB 隨身碟,稽核事件 6416 是比較好的做法:每次插入都會記錄,還能依 Device ID 做白名單。指令監控的做法因為登錄檔記錄的是「曾經接過」的裝置,比較適合拿來盤點環境中出現過哪些新裝置。
參考資料
- Wazuh 文件:Detect USB storage(指令監控)
https://documentation.wazuh.com/current/user-manual/capabilities/command-monitoring/use-cases/detect-usb-storage.html - Wazuh 部落格:Monitoring USB drives in Windows using Wazuh
https://wazuh.com/blog/monitoring-usb-drives-in-windows-using-wazuh/ - Microsoft Learn:6416(S) A new external device was recognized by the System
https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-6416 - Wazuh 上傳 CDB list 的檔案大小限制
https://blog.jason.tools/2025/10/wazuh-cdb-upload-size.html



