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

Wazuh Windows Agent 升級後權限損毀的批次修復方式

Jason Cheng 發布 瀏覽 1 次
Wazuh Windows Agent 升級後權限損毀的批次修復方式
本文目錄
  1. 問題根因
  2. 一律使用 SID 授權
  3. 修復方式
  4. PowerShell 版本
  5. 權限修好但服務仍無法啟動
  6. 後續建議
  7. 指令參數速查
  8. 結論
  9. 參考資料

最近一個環境透過 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-544Administrators本機系統管理員群組
S-1-5-18SYSTEMWazuh 服務的執行帳號,務必授予,否則服務還是起不來

修復方式

三種方式擇一,依環境選擇。

方式一:AD 網域環境用 GPO 啟動指令碼(建議)

GPO 的電腦啟動指令碼是以 SYSTEM 身分執行,權限最高,不會出現存取被拒,一次就能涵蓋整個網域。

  1. 將下方腳本存成 fix-wazuh-acl.bat,放在網域可存取的共用路徑,例如 \\example.com\NETLOGON\fix-wazuh-acl.bat
  2. 開啟「群組原則管理」,新增或編輯 GPO:電腦設定 → Windows 設定 → 指令碼(啟動/關機)→ 啟動,加入這支腳本
  3. 將 GPO 連結到目標電腦所在的 OU
  4. 目標電腦下次開機時自動套用,也可以在用戶端執行 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 從管理機批次執行。管理機要對所有目標電腦有系統管理員權限與檔案分享存取。

  1. 下載 Sysinternals PsExec
  2. 建立 pcs.txt,每行一個目標電腦名稱或 IP
  3. 在管理機以系統管理員身分執行:
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 批次升級。

參考資料

Jason Cheng

Jason Cheng

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

關於作者 →

延伸閱讀