跳到主要內容
節省工具箱Jason Tools
技術文章

Wazuh Dashboard 整合 Active Directory 認證

Jason Cheng 發布 瀏覽 1 次
Wazuh Dashboard 整合 Active Directory 認證
本文目錄
  1. 適用範圍
  2. 設定位置:Wazuh Indexer
  3. 環境參數登記表
  4. 施作步驟
  5. 驗收檢核表
  6. 還原程序
  7. 常見問題排解
  8. 維運注意事項
  9. 結論
  10. 參考資料

企業導入 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>網域控制站 IP192.168.1.10
<DC_FQDN>網域控制站完整名稱DC01.example.org
<BIND_DN>查詢用帳號的 DNcn=ldap,ou=people,dc=example,dc=org
<BIND_PW>查詢用帳號密碼your-password
<USER_BASE>使用者所在的 OUou=people,dc=example,dc=org
<ROLE_BASE>群組所在的 OUou=groups,dc=example,dc=org
<ADMIN_GROUP>管理者群組名稱wazuh-admins
<READONLY_GROUP>唯讀群組名稱wazuh-readonly
<INDEXER_IP>Wazuh Indexer IP192.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 使用者和電腦」:

  1. 建立(或沿用)存放使用者的 OU,例如 People
  2. 在該 OU 下建立查詢專用帳號,例如登入名稱 ldap
  3. 建立(或沿用)存放群組的 OU,例如 Groups
  4. 在該 OU 下建立兩個群組:wazuh-admins(成員取得管理者權限)、wazuh-readonly(成員取得唯讀權限)
  5. 將測試用的管理者帳號、唯讀帳號分別加入上述群組

✅ 驗證:在網域控制站以系統管理員身分開啟 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 permissionscluster_composite_ops_ro
Index*
Index permissionsread
Tenant permissionsglobal_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
Rolesadministratorreadonly
User fieldbackend_rolesbackend_roles
Search operationFINDFIND
Value<ADMIN_GROUP><READONLY_GROUP>

儲存後重新啟動服務:

systemctl restart wazuh-dashboard

驗收檢核表

建議與使用單位一起逐項確認。

#驗收項目驗證方式通過
1設定檔已備份ls -l /etc/wazuh-indexer/opensearch-security/*.bak.*☐
2LDAPS 連線正常網域控制站 ldp.exe 連 636 埠成功☐
3憑證有效且名稱相符openssl x509 -noout -subject -dates☐
4認證設定套用成功securityadmin 顯示 Done with success☐
5角色對應套用成功securityadmin 顯示 rolesmapping ... updated☐
6AD 管理者可登入以 <ADMIN_GROUP> 成員帳號登入,可進入 Agents 管理頁☐
7AD 唯讀帳號可登入以 <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 但憑證為 FQDNverify_hostnames: true 時,hosts 必須填與憑證一致的 FQDN
群組成員抓不到使用巢狀群組確認 resolve_nested_roles: true
內建帳號異常skip_users 遺漏補回 admin 與 kibanaserver

記錄檔位置:/var/log/wazuh-indexer/wazuh-cluster.log

維運注意事項

  1. 查詢帳號密碼為明文儲存於 config.yml,請確保該檔案權限為 640、擁有者為 wazuh-indexer,並限制主機登入權限。
  2. 升級 Wazuh 時,config.yml 與 roles_mapping.yml 可能被套件覆蓋,升級前請先備份,升級後確認設定仍在,必要時重新執行 securityadmin.sh。
  3. 憑證到期:自簽憑證預設一年到期,到期前需重新產生並更新 Indexer 上的 ldapcacert.pem,否則登入會失敗。建議設定到期提醒。
  4. 權限異動流程:日後調整使用者權限,只需在 AD 中調整群組成員,Wazuh 端不需異動。
  5. 保留備援登入路徑:請勿刪除或停用 Wazuh 內建的 admin 帳號,當 AD 或網路故障時,這是唯一的管理入口。

結論

Wazuh 整合 AD 最容易卡住的地方有兩個:一是設定要做在 Indexer,不是 Dashboard;二是權限要做兩層對應,少做一層就會出現「登入成功卻什麼都不能做」的狀況。

照著步驟做,並在每一步完成後驗證,大約一兩個小時就能完成。之後人員異動只要調整 AD 群組,不必再到 Wazuh 開帳號、刪帳號。

如果不希望查詢帳號的密碼以明文存在設定檔裡,也可以改用 SSO(SAML)整合,例如 Keycloak、Microsoft Entra ID 或 authentik。

參考資料

Jason Cheng

Jason Cheng

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

關於作者 →

延伸閱讀