最近一個環境透過 Wazuh 的 WPK(遠端 agent 升級)把 Windows Agent 批次升級到 4.14.5,結果有 30 台同時出狀況:ossec.conf 連系統管理員都打不開、也刪不掉,Wazuh 服務一啟動就立即停止。
查到最後,原因是 WPK 升級過程中斷,把 ossec-agent 資料夾的權限(ACL)弄壞了。好消息是不用一台一台重裝,在資料夾層級把權限補回來就能修好,這篇整理批次修復的做法。
問題根因
| 現象 | 原因 |
|---|---|
ossec.conf 連系統管理員都無法開啟、刪除 | 升級中途 ACL 損毀,Administrators 與 SYSTEM 的權限都不見了 |
| 服務啟動後立即停止 | Wazuh 服務以 SYSTEM 帳號執行,讀不到設定檔就初始化失敗自行結束 |
| 很多台同時發生 | WPK 批次派送在同一時間中斷,造成相同的 ACL 損毀 |
修復的重點只有一個:在 C:\Program Files (x86)\ossec-agent 資料夾層級,重新授予 Administrators 與 SYSTEM 完整控制權,並讓子項目繼承。
一律使用 SID 授權
繁體中文版 Windows 的群組名稱會顯示成中文(例如「系統管理員」),直接用英文名稱 Administrators 授權常常會失敗。所以一律使用 SID,不管什麼語系都能正確套用:
| SID | 對應帳號 | 說明 |
|---|---|---|
S-1-5-32-544 | Administrators | 本機系統管理員群組 |
S-1-5-18 | SYSTEM | Wazuh 服務的執行帳號,務必授予,否則服務還是起不來 |
修復方式
三種方式擇一,依環境選擇。
方式一:AD 網域環境用 GPO 啟動指令碼(建議)
GPO 的電腦啟動指令碼是以 SYSTEM 身分執行,權限最高,不會出現存取被拒,一次就能涵蓋整個網域。
- 將下方腳本存成
fix-wazuh-acl.bat,放在網域可存取的共用路徑,例如\\example.com\NETLOGON\fix-wazuh-acl.bat - 開啟「群組原則管理」,新增或編輯 GPO:電腦設定 → Windows 設定 → 指令碼(啟動/關機)→ 啟動,加入這支腳本
- 將 GPO 連結到目標電腦所在的 OU
- 目標電腦下次開機時自動套用,也可以在用戶端執行
gpupdate /force後重新開機
@echo off
setlocal
set TARGET=C:\Program Files (x86)\ossec-agent
set LOG=C:\Windows\Temp\fix-wazuh-acl.log
echo [%date% %time%] === Fix Wazuh ACL start on %COMPUTERNAME% === >> "%LOG%"
:: 先嘗試停止服務(起不來也無妨,忽略錯誤)
sc stop Wazuh >nul 2>&1
:: 取得擁有權(ACL 嚴重損毀時要先取得擁有權)
takeown /f "%TARGET%" /r /d y >> "%LOG%" 2>&1
:: 授予 Administrators 與 SYSTEM 完整控制權,並讓子項目繼承
icacls "%TARGET%" /grant *S-1-5-32-544:(OI)(CI)F /t /c >> "%LOG%" 2>&1
icacls "%TARGET%" /grant *S-1-5-18:(OI)(CI)F /t /c >> "%LOG%" 2>&1
:: 啟動服務
sc start Wazuh >> "%LOG%" 2>&1
:: 記錄服務狀態,方便事後彙整成功與失敗清單
sc query Wazuh | find "STATE" >> "%LOG%"
echo [%date% %time%] === Done === >> "%LOG%"
endlocal
每台的修復結果會記錄在 C:\Windows\Temp\fix-wazuh-acl.log,可以集中回收,快速找出哪幾台還沒修好。
方式二:沒有網域或需要立即處理,用 PsExec 批次執行
沒有 AD、或不想等重新開機時,可以用 Sysinternals 的 PsExec 從管理機批次執行。管理機要對所有目標電腦有系統管理員權限與檔案分享存取。
- 下載 Sysinternals PsExec
- 建立
pcs.txt,每行一個目標電腦名稱或 IP - 在管理機以系統管理員身分執行:
psexec @pcs.txt -s -h cmd /c "takeown /f \"C:\Program Files (x86)\ossec-agent\" /r /d y & icacls \"C:\Program Files (x86)\ossec-agent\" /grant *S-1-5-32-544:(OI)(CI)F /t /c & icacls \"C:\Program Files (x86)\ossec-agent\" /grant *S-1-5-18:(OI)(CI)F /t /c & sc start Wazuh"
-s:以 SYSTEM 身分執行-h:以提升的權限執行@pcs.txt:對清單內所有電腦批次執行
方式三:既有的派送工具
有 SCCM、PDQ Deploy 這類派送工具的環境,把方式一的腳本包成套件,以 SYSTEM(本機系統)身分派送即可,這些工具本身就有集中回報,可以直接看成功率。
PowerShell 版本
習慣用 PowerShell、或需要比較清楚的成功與失敗回報時,可以改用這個版本:
$ErrorActionPreference = 'SilentlyContinue'
$Target = 'C:\Program Files (x86)\ossec-agent'
$Log = 'C:\Windows\Temp\fix-wazuh-acl.log'
function Write-Log($msg) {
"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') $msg" | Out-File $Log -Append
}
Write-Log "=== Fix Wazuh ACL start on $env:COMPUTERNAME ==="
# 停止服務
Stop-Service -Name Wazuh -Force
# 取得擁有權
& takeown.exe /f $Target /r /d y | Out-Null
# 以 SID 授權(不受語系影響)
& icacls.exe $Target /grant '*S-1-5-32-544:(OI)(CI)F' /t /c | Out-Null # Administrators
& icacls.exe $Target /grant '*S-1-5-18:(OI)(CI)F' /t /c | Out-Null # SYSTEM
# 啟動服務並回報
Start-Service -Name Wazuh
Start-Sleep -Seconds 3
$svc = Get-Service -Name Wazuh
Write-Log "Service status: $($svc.Status)"
if ($svc.Status -eq 'Running') {
Write-Log "RESULT: SUCCESS"
} else {
Write-Log "RESULT: FAILED - ossec.conf 可能已損毀,需要重新安裝"
}
Write-Log "=== Done ==="
權限修好但服務仍無法啟動
補完權限,sc start Wazuh 還是失敗的話,代表那台的 ossec.conf 內容本身已經在升級過程中被截斷或損毀,不只是權限問題。
確認設定檔狀態
:: 檢查是否有殘留檔案(.tmp、.bak,或大小為 0)
dir "C:\Program Files (x86)\ossec-agent\ossec.conf*"
:: 查看 agent 記錄,通常會明確指出設定錯誤
type "C:\Program Files (x86)\ossec-agent\ossec.log"
覆蓋正常的設定檔
從一台正常的 Agent 取得乾淨的 ossec.conf,連同修復腳本一起派送覆蓋。
注意:覆蓋前要保留各台原本的個別設定,例如 Manager 位址、群組設定。
保留金鑰重新安裝
最乾淨的做法是重新安裝,但記得先備份 client.keys,這樣重新安裝後就能沿用原本的註冊金鑰,不用在 Manager 端重新註冊:
:: 備份金鑰
copy "C:\Program Files (x86)\ossec-agent\client.keys" C:\Temp\
:: 移除(GUID 請以實際安裝的產品代碼替換)
msiexec /x {Wazuh-Agent-GUID} /qn
:: 重新安裝
msiexec /i wazuh-agent-4.14.5-1.msi /qn
:: 還原金鑰並啟動
copy C:\Temp\client.keys "C:\Program Files (x86)\ossec-agent\"
net start Wazuh
後續建議
- Windows Agent 改用 GPO 或派送工具推 MSI 升級:不要再用 WPK 批次派送,WPK 中斷就是這次 ACL 損毀的原因
- Linux Agent 改用套件管理員升級:WPK 在 Linux 上支援有限,常因作業系統版本或 SELinux 比對失敗而無聲中止
yum update wazuh-agent
systemctl daemon-reload
systemctl restart wazuh-agent
- 升級前先在少量測試機驗證,確認成功再全面派送
- 建立升級前自動備份
ossec.conf與client.keys的機制,降低類似事件的復原成本
指令參數速查
| 參數 | 說明 |
|---|---|
takeown /f <路徑> /r /d y | 遞迴取得資料夾與子項目的擁有權 |
icacls <路徑> /grant <SID>:(OI)(CI)F | 授予完整控制權,(OI) 物件繼承、(CI) 容器繼承 |
/t | 套用到所有現有的子目錄與檔案 |
/c | 遇到錯誤繼續執行 |
psexec -s | 以 SYSTEM 身分執行 |
psexec @檔案.txt | 對清單內所有電腦批次執行 |
結論
這次的問題看起來很嚇人:30 台 Agent 同時掛掉,設定檔連系統管理員都打不開。但查清楚之後,原因只是升級中斷造成的權限損毀,用一支腳本補回 Administrators 與 SYSTEM 的權限就解決了。
兩個重點:授權一律用 SID,不要用群組名稱;以及 Windows Agent 升級改走 MSI 派送,不要再用 WPK 批次升級。
參考資料
- Wazuh 官方文件:Remote upgrading Wazuh agents
https://documentation.wazuh.com/current/user-manual/agent/agent-management/remote-upgrading/index.html - Wazuh 官方文件:Upgrading the Wazuh agent
https://documentation.wazuh.com/current/upgrade-guide/wazuh-agent/index.html - Microsoft Learn:icacls
https://learn.microsoft.com/windows-server/administration/windows-commands/icacls - Microsoft Learn:Well-known SIDs
https://learn.microsoft.com/windows/win32/secauthz/well-known-sids - Sysinternals:PsExec
https://learn.microsoft.com/sysinternals/downloads/psexec



