企業導入 Wazuh 之後,Dashboard 的登入帳號往往是一個一個開本機帳號,人一多就難管理,有人離職還得記得回來刪帳號。
這篇整理讓使用者直接用公司的 AD 帳號密碼登入 Wazuh Dashboard,並依照 AD 群組自動取得對應的權限(管理者或唯讀)的完整步驟,不必再為每個人開一組 Wazuh 本機帳號。
適用範圍
| 項目 | 內容 |
|---|---|
| 適用產品 | Wazuh 4.x(indexer/dashboard 分離或 All-in-one 皆適用) |
| 適用情境 | 使用 Microsoft Active Directory 或標準 LDAP 作為 Wazuh Dashboard 登入來源 |
| 預估工時 | 約 1.5~2 小時(含驗證) |
| 需要權限 | AD 網域管理者、Wazuh indexer 主機 root、Wazuh Dashboard 管理者帳號 |
| 主要依據 | Wazuh 官方文件〈Active Directory and LDAP integration〉 |
完成後的效果:
- 使用者用 AD 帳號登入 Wazuh Dashboard
- 人員離職時停用 AD 帳號,Wazuh 的存取權同步失效
- 權限調整只需異動 AD 群組成員,不必登入 Wazuh
設定位置:Wazuh Indexer
這是最多人卡住的地方:設定不是做在 Dashboard 上。
Wazuh Dashboard 只是前端網頁,不負責驗證帳號密碼;認證設定是寫在 Wazuh Indexer(OpenSearch Security plugin),由它向 Active Directory 驗證帳號密碼,流程可以參考本文首圖。
所以本文的設定檔,全部位於 Wazuh Indexer 主機的:
/etc/wazuh-indexer/opensearch-security/
另外,權限對應要做兩層,兩層都完成才會正常:
| 層級 | 位置 | 控制什麼 |
|---|---|---|
| 第一層 Indexer 角色 | roles_mapping.yml | 能不能讀取索引、看到資料 |
| 第二層 Wazuh RBAC 角色 | Dashboard 介面設定 | 能不能管理 Agent、看設定等 Wazuh 功能 |
只做第一層的典型症狀:登入成功,但 Wazuh 功能頁面出現權限不足。
環境參數登記表
施作前請先確認以下資訊,後續指令直接代入即可,避免邊做邊問。
| 代號 | 說明 | 範例 |
|---|---|---|
<DC_IP> | 網域控制站 IP | 192.168.1.10 |
<DC_FQDN> | 網域控制站完整名稱 | DC01.example.org |
<BIND_DN> | 查詢用帳號的 DN | cn=ldap,ou=people,dc=example,dc=org |
<BIND_PW> | 查詢用帳號密碼 | your-password |
<USER_BASE> | 使用者所在的 OU | ou=people,dc=example,dc=org |
<ROLE_BASE> | 群組所在的 OU | ou=groups,dc=example,dc=org |
<ADMIN_GROUP> | 管理者群組名稱 | wazuh-admins |
<READONLY_GROUP> | 唯讀群組名稱 | wazuh-readonly |
<INDEXER_IP> | Wazuh Indexer IP | 192.168.1.20 |
注意:<BIND_PW> 會以明文寫入設定檔,請使用權限最低、僅供查詢的專用帳號,請勿使用網域管理者帳號。
施作步驟
步驟 0:施作前備份(必做)
在 Wazuh Indexer 主機執行:
/usr/share/wazuh-indexer/bin/indexer-security-init.sh \
--options "-backup /etc/wazuh-indexer/opensearch-security -icl -nhnv"
同時手動再備份一份設定檔:
cp /etc/wazuh-indexer/opensearch-security/config.yml \
/etc/wazuh-indexer/opensearch-security/config.yml.bak.$(date +%F)
cp /etc/wazuh-indexer/opensearch-security/roles_mapping.yml \
/etc/wazuh-indexer/opensearch-security/roles_mapping.yml.bak.$(date +%F)
✅ 驗證:ls -l /etc/wazuh-indexer/opensearch-security/*.bak.* 可看到備份檔。
步驟 1:AD 端建立帳號與群組
在網域控制站上,開啟「Active Directory 使用者和電腦」:
- 建立(或沿用)存放使用者的 OU,例如
People - 在該 OU 下建立查詢專用帳號,例如登入名稱
ldap - 建立(或沿用)存放群組的 OU,例如
Groups - 在該 OU 下建立兩個群組:
wazuh-admins(成員取得管理者權限)、wazuh-readonly(成員取得唯讀權限) - 將測試用的管理者帳號、唯讀帳號分別加入上述群組
✅ 驗證:在網域控制站以系統管理員身分開啟 PowerShell 執行:
Get-ADUser -SearchBase "OU=People,DC=example,DC=org" -Filter * -Properties cn |
Select-Object cn, sAMAccountName
Get-ADGroup -SearchBase "OU=Groups,DC=example,DC=org" -Filter * -Properties cn |
Select-Object cn
應可列出剛建立的帳號與群組。登入名稱(sAMAccountName)就是之後登入 Wazuh 用的帳號。
取得網域控制站的 FQDN:
[System.Net.Dns]::GetHostEntry($env:computerName).HostName
步驟 2:確認 AD 已啟用 LDAPS(建議)
若不啟用 LDAPS,帳號密碼會以明文在網路上傳輸。若已有企業 CA 憑證,可跳過本步驟。
若沒有 CA,可在網域控制站建立自簽憑證:
New-SelfSignedCertificate -DnsName <DC_FQDN>, <HOSTNAME> `
-CertStoreLocation cert:\LocalMachine\My
接著執行 certlm.msc,將「個人 → 憑證」中新建立的憑證複製到「受信任的根憑證授權單位 → 憑證」,等待約一分鐘讓 LDAPS 綁定 636 埠。
✅ 驗證:執行 ldp.exe → 連線 → 輸入 <DC_FQDN>、通訊埠 636、勾選 SSL,應顯示連線成功並列出網域資訊。
步驟 3:Indexer 取得 AD 憑證並設定名稱解析
在 Wazuh Indexer 主機執行。
若環境沒有 DNS 可解析網域控制站,先編輯 /etc/hosts:
<DC_IP> <DC_FQDN>
取得 AD 的憑證:
echo -n | openssl s_client -connect <DC_FQDN>:636 \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ldapcacert.pem
mv ldapcacert.pem /etc/wazuh-indexer/opensearch-security/
chown wazuh-indexer:wazuh-indexer /etc/wazuh-indexer/opensearch-security/ldapcacert.pem
chmod 640 /etc/wazuh-indexer/opensearch-security/ldapcacert.pem
✅ 驗證:
openssl x509 -in /etc/wazuh-indexer/opensearch-security/ldapcacert.pem -noout -subject -dates
應顯示憑證的主體名稱與有效期限,且主體名稱需與 <DC_FQDN> 一致。
步驟 4:編輯認證設定檔
編輯 /etc/wazuh-indexer/opensearch-security/config.yml。
認證區段(authc):負責驗證帳號密碼
authc:
ldap:
description: "Authenticate via LDAP or Active Directory"
http_enabled: true
transport_enabled: false
order: 1
http_authenticator:
type: basic
challenge: false
authentication_backend:
type: ldap
config:
enable_ssl: true # 未啟用 LDAPS 請改 false
pemtrustedcas_filepath: /etc/wazuh-indexer/opensearch-security/ldapcacert.pem
enable_start_tls: false
enable_ssl_client_auth: false
verify_hostnames: true
hosts:
- <DC_FQDN>:636 # LDAP 為 389,LDAPS 為 636
bind_dn: <BIND_DN>
password: <BIND_PW>
userbase: '<USER_BASE>'
usersearch: (sAMAccountName={0})
username_attribute: cn
授權區段(authz):負責取回 AD 群組
authz:
roles_from_myldap:
description: "Authorize via LDAP or Active Directory"
http_enabled: true
transport_enabled: false
authorization_backend:
type: ldap
config:
enable_ssl: true
pemtrustedcas_filepath: /etc/wazuh-indexer/opensearch-security/ldapcacert.pem
enable_start_tls: false
enable_ssl_client_auth: false
verify_hostnames: true
hosts:
- <DC_FQDN>:636
bind_dn: <BIND_DN>
password: <BIND_PW>
rolebase: <ROLE_BASE>
rolesearch: '(member={0})'
userrolename: memberof
username_attribute: cn
rolename: cn
resolve_nested_roles: true # 支援巢狀群組
userbase: '<USER_BASE>'
usersearch: (sAMAccountName={0})
skip_users:
- admin
- kibanaserver
注意:skip_users 中的 admin 與 kibanaserver 務必保留,這是系統內建帳號,若被送去 AD 查詢會導致服務異常。
設定檔權限收斂:
chown wazuh-indexer:wazuh-indexer /etc/wazuh-indexer/opensearch-security/config.yml
chmod 640 /etc/wazuh-indexer/opensearch-security/config.yml
✅ 驗證:YAML 縮排正確性可用下列指令檢查(不報錯即通過):
python3 -c "import yaml,sys; yaml.safe_load(open('/etc/wazuh-indexer/opensearch-security/config.yml'))" \
&& echo "YAML 格式正確"
步驟 5:套用設定
export JAVA_HOME=/usr/share/wazuh-indexer/jdk/ && \
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh \
-f /etc/wazuh-indexer/opensearch-security/config.yml -icl \
-key /etc/wazuh-indexer/certs/admin-key.pem \
-cert /etc/wazuh-indexer/certs/admin.pem \
-cacert /etc/wazuh-indexer/certs/root-ca.pem \
-h <INDEXER_IP> -nhnv
✅ 驗證:畫面最後應出現 SUCC: Configuration for 'config' created or updated 與 Done with success。
叢集環境只需在任一節點執行一次,設定會寫入 .opendistro_security 索引並同步至全叢集。
步驟 6:第一層權限對應(Indexer 角色)
編輯 /etc/wazuh-indexer/opensearch-security/roles_mapping.yml,把 AD 管理者群組加入 all_access:
all_access:
reserved: false
hidden: false
backend_roles:
- "admin"
- "<ADMIN_GROUP>"
description: "Maps admin to all_access"
套用:
export JAVA_HOME=/usr/share/wazuh-indexer/jdk/ && \
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh \
-f /etc/wazuh-indexer/opensearch-security/roles_mapping.yml -icl \
-key /etc/wazuh-indexer/certs/admin-key.pem \
-cert /etc/wazuh-indexer/certs/admin.pem \
-cacert /etc/wazuh-indexer/certs/root-ca.pem \
-h <INDEXER_IP> -nhnv
✅ 驗證:出現 SUCC: Configuration for 'rolesmapping' created or updated。
唯讀角色(若需要)
在 Dashboard 以管理者登入 → ☰ → Indexer management → Security → Roles → Create role:
| 欄位 | 設定值 |
|---|---|
| Name | 自訂,例如 wazuh-readonly-role |
| Cluster permissions | cluster_composite_ops_ro |
| Index | * |
| Index permissions | read |
| Tenant permissions | global_tenant,選 Read only |
建立後點進該角色 → Mapped users → Manage mapping → 在 Backend roles 填入 <READONLY_GROUP> → Map。
步驟 7:第二層權限對應(Wazuh RBAC)
確認 run_as 已開啟
編輯 /usr/share/wazuh-dashboard/data/wazuh/config/wazuh.yml:
hosts:
- default:
url: https://localhost
port: 55000
username: wazuh-wui
password: "<WAZUH_WUI_PASSWORD>"
run_as: true
注意:這個值預設常為 false,未改成 true 的話,下一步建立的角色對應不會生效。
建立角色對應
Dashboard → ☰ → Server management → Security → Roles mapping → Create Role mapping:
| 欄位 | 管理者 | 唯讀 |
|---|---|---|
| Role mapping name | 自訂,例如 ad-admins | 自訂,例如 ad-readonly |
| Roles | administrator | readonly |
| User field | backend_roles | backend_roles |
| Search operation | FIND | FIND |
| Value | <ADMIN_GROUP> | <READONLY_GROUP> |
儲存後重新啟動服務:
systemctl restart wazuh-dashboard
驗收檢核表
建議與使用單位一起逐項確認。
| # | 驗收項目 | 驗證方式 | 通過 |
|---|---|---|---|
| 1 | 設定檔已備份 | ls -l /etc/wazuh-indexer/opensearch-security/*.bak.* | ☐ |
| 2 | LDAPS 連線正常 | 網域控制站 ldp.exe 連 636 埠成功 | ☐ |
| 3 | 憑證有效且名稱相符 | openssl x509 -noout -subject -dates | ☐ |
| 4 | 認證設定套用成功 | securityadmin 顯示 Done with success | ☐ |
| 5 | 角色對應套用成功 | securityadmin 顯示 rolesmapping ... updated | ☐ |
| 6 | AD 管理者可登入 | 以 <ADMIN_GROUP> 成員帳號登入,可進入 Agents 管理頁 | ☐ |
| 7 | AD 唯讀帳號可登入 | 以 <READONLY_GROUP> 成員帳號登入,可看資料但無法修改設定 | ☐ |
| 8 | 未授權帳號無法登入 | 以不屬於任一群組的 AD 帳號登入,應被拒絕 | ☐ |
| 9 | 原本機管理帳號仍可用 | 以 admin 本機帳號登入成功(備援路徑) | ☐ |
| 10 | 停用 AD 帳號後即時失效 | 停用測試帳號後重新登入,應被拒絕 | ☐ |
注意:測試登入前請清除瀏覽器快取與 Cookie,或使用無痕視窗,避免舊 Session 干擾判斷。
還原程序
若設定後無法登入,可依下列方式還原:
# 1. 還原設定檔
cp /etc/wazuh-indexer/opensearch-security/config.yml.bak.YYYY-MM-DD \
/etc/wazuh-indexer/opensearch-security/config.yml
cp /etc/wazuh-indexer/opensearch-security/roles_mapping.yml.bak.YYYY-MM-DD \
/etc/wazuh-indexer/opensearch-security/roles_mapping.yml
# 2. 重新套用
export JAVA_HOME=/usr/share/wazuh-indexer/jdk/ && \
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh \
-cd /etc/wazuh-indexer/opensearch-security/ -icl \
-key /etc/wazuh-indexer/certs/admin-key.pem \
-cert /etc/wazuh-indexer/certs/admin.pem \
-cacert /etc/wazuh-indexer/certs/root-ca.pem \
-h <INDEXER_IP> -nhnv
# 3. 重新啟動 Dashboard
systemctl restart wazuh-dashboard
還原期間,內建 admin 帳號仍可正常登入,不會失去對系統的控制。
常見問題排解
| 症狀 | 可能原因 | 處理方式 |
|---|---|---|
| 登入顯示帳號密碼錯誤 | usersearch 或 userbase 不正確 | 在 AD 用 Get-ADUser 確認帳號確實位於 userbase 指定的 OU 之下 |
| 登入成功但看不到任何資料 | 第一層角色對應未完成 | 檢查 roles_mapping.yml 是否已加入 AD 群組並重新套用 |
| 登入成功但 Wazuh 功能顯示權限不足 | 第二層 RBAC 未設定,或 run_as 為 false | 確認 wazuh.yml 的 run_as: true,並完成 Roles mapping |
| 憑證錯誤、連線失敗 | hosts 填 IP 但憑證為 FQDN | verify_hostnames: true 時,hosts 必須填與憑證一致的 FQDN |
| 群組成員抓不到 | 使用巢狀群組 | 確認 resolve_nested_roles: true |
| 內建帳號異常 | skip_users 遺漏 | 補回 admin 與 kibanaserver |
記錄檔位置:/var/log/wazuh-indexer/wazuh-cluster.log
維運注意事項
- 查詢帳號密碼為明文儲存於
config.yml,請確保該檔案權限為640、擁有者為wazuh-indexer,並限制主機登入權限。 - 升級 Wazuh 時,
config.yml與roles_mapping.yml可能被套件覆蓋,升級前請先備份,升級後確認設定仍在,必要時重新執行securityadmin.sh。 - 憑證到期:自簽憑證預設一年到期,到期前需重新產生並更新 Indexer 上的
ldapcacert.pem,否則登入會失敗。建議設定到期提醒。 - 權限異動流程:日後調整使用者權限,只需在 AD 中調整群組成員,Wazuh 端不需異動。
- 保留備援登入路徑:請勿刪除或停用 Wazuh 內建的
admin帳號,當 AD 或網路故障時,這是唯一的管理入口。
結論
Wazuh 整合 AD 最容易卡住的地方有兩個:一是設定要做在 Indexer,不是 Dashboard;二是權限要做兩層對應,少做一層就會出現「登入成功卻什麼都不能做」的狀況。
照著步驟做,並在每一步完成後驗證,大約一兩個小時就能完成。之後人員異動只要調整 AD 群組,不必再到 Wazuh 開帳號、刪帳號。
如果不希望查詢帳號的密碼以明文存在設定檔裡,也可以改用 SSO(SAML)整合,例如 Keycloak、Microsoft Entra ID 或 authentik。
參考資料
- Wazuh 官方文件:Active Directory and LDAP integration
https://documentation.wazuh.com/current/user-manual/user-administration/ldap.html - OpenSearch 官方文件:Active Directory and LDAP
https://docs.opensearch.org/latest/security/authentication-backends/ldap/ - OpenSearch 官方文件:Authentication backends
https://docs.opensearch.org/latest/security/authentication-backends/authc-index/ - Wazuh 官方文件:Single sign-on
https://documentation.wazuh.com/current/user-manual/user-administration/single-sign-on/index.html



