跳到主要內容
節省工具箱Jason Tools
經驗分享

Wazuh 偵測 Windows USB 儲存裝置

Jason Cheng 發布
Wazuh 偵測 Windows USB 儲存裝置
本文目錄
  1. 兩種做法比較
  2. 方法一:指令監控 USBSTOR
  3. 方法二:稽核事件 6416
  4. 區分授權與未授權裝置
  5. 驗收清單
  6. 注意事項
  7. 結論
  8. 參考資料

很多企業有「禁止使用 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 做白名單。指令監控的做法因為登錄檔記錄的是「曾經接過」的裝置,比較適合拿來盤點環境中出現過哪些新裝置。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀