本文目錄
Wazuh 剛導入時,大多是用官方安裝助理裝成一台 all-in-one:indexer、server、dashboard 全部在同一台。代理程式(agent)一多,server 的負擔越來越重,就會想再加一台分擔。
這篇記錄我實際操作的流程:保留原本的 all-in-one 不改架構,新增一台 worker 節點,組成 Wazuh server 叢集。過程中踩到的問題放在最後的問題排除,正文照著做就能完成。
架構
| 主機 | IP | 角色 |
|---|---|---|
wazuh1 | 192.168.10.21 | 既有 all-in-one:indexer+server(master)+dashboard |
wazuh2 | 192.168.10.22 | 新增:server(worker)+filebeat,資料送到 wazuh1 的 indexer |
需要開放的連線:
| 來源 | 目的 | 通訊埠 | 用途 |
|---|---|---|---|
| wazuh2 | wazuh1 | 1516/TCP | 叢集同步 |
| wazuh2 | wazuh1 | 9200/TCP | filebeat 寫入 indexer |
| agent | wazuh2 | 1514/TCP | agent 回報事件 |
| agent | wazuh1 | 1515/TCP | agent 註冊 |
注意:兩台的 Wazuh 版本必須完全一致,連小版本都要一樣,否則 worker 會連不上 master(見問題排除的 Error 3031)。先在 wazuh1 用 /var/ossec/bin/wazuh-control info 確認版本。
重新產生憑證
all-in-one 安裝時產生的憑證只有 wazuh1 的節點,要把 wazuh2 加進去重新產生。
在 wazuh1 建立 /root/config.yml:
nodes:
indexer:
- name: wazuh1-indexer
ip: 192.168.10.21
server:
- name: wazuh1-server
ip: 192.168.10.21
node_type: master
- name: wazuh2-server
ip: 192.168.10.22
node_type: worker
dashboard:
- name: wazuh1-dashboard
ip: 192.168.10.21
產生憑證並打包,送到 wazuh2:
cd /root
curl -sO https://packages.wazuh.com/4.14/wazuh-certs-tool.sh
bash wazuh-certs-tool.sh -A
tar -cvf ./wazuh-certificates.tar -C ./wazuh-certificates/ .
scp /root/wazuh-certificates.tar root@192.168.10.22:/root/
注意:-A 會產生新的 root CA,所有元件的憑證都要換成這一批,不能只換一部分。動手前先備份 /etc/wazuh-indexer/certs、/etc/filebeat/certs、/etc/wazuh-dashboard/certs,萬一出問題可以還原。
在 wazuh1 部署新憑證
把憑證放到 indexer、filebeat、dashboard。以下的檔名要和各元件設定檔裡指定的一致,安裝助理裝的環境可以先用 grep -r 'certs/' /etc/wazuh-indexer/opensearch.yml /etc/filebeat/filebeat.yml /etc/wazuh-dashboard/opensearch_dashboards.yml 確認。
cd /root
# indexer
rm -rf /etc/wazuh-indexer/certs && mkdir -p /etc/wazuh-indexer/certs
tar -xf ./wazuh-certificates.tar -C /etc/wazuh-indexer/certs/ \
./wazuh1-indexer.pem ./wazuh1-indexer-key.pem ./admin.pem ./admin-key.pem ./root-ca.pem
mv -n /etc/wazuh-indexer/certs/wazuh1-indexer.pem /etc/wazuh-indexer/certs/wazuh-indexer.pem
mv -n /etc/wazuh-indexer/certs/wazuh1-indexer-key.pem /etc/wazuh-indexer/certs/wazuh-indexer-key.pem
chmod 500 /etc/wazuh-indexer/certs
chmod 400 /etc/wazuh-indexer/certs/*
chown -R wazuh-indexer:wazuh-indexer /etc/wazuh-indexer/certs
# filebeat
rm -rf /etc/filebeat/certs && mkdir -p /etc/filebeat/certs
tar -xf ./wazuh-certificates.tar -C /etc/filebeat/certs/ \
./wazuh1-server.pem ./wazuh1-server-key.pem ./root-ca.pem
mv -n /etc/filebeat/certs/wazuh1-server.pem /etc/filebeat/certs/wazuh-server.pem
mv -n /etc/filebeat/certs/wazuh1-server-key.pem /etc/filebeat/certs/wazuh-server-key.pem
chmod 500 /etc/filebeat/certs
chmod 400 /etc/filebeat/certs/*
chown -R root:root /etc/filebeat/certs
# dashboard
rm -rf /etc/wazuh-dashboard/certs && mkdir -p /etc/wazuh-dashboard/certs
tar -xf ./wazuh-certificates.tar -C /etc/wazuh-dashboard/certs/ \
./wazuh1-dashboard.pem ./wazuh1-dashboard-key.pem ./root-ca.pem
mv -n /etc/wazuh-dashboard/certs/wazuh1-dashboard.pem /etc/wazuh-dashboard/certs/wazuh-dashboard.pem
mv -n /etc/wazuh-dashboard/certs/wazuh1-dashboard-key.pem /etc/wazuh-dashboard/certs/wazuh-dashboard-key.pem
chmod 500 /etc/wazuh-dashboard/certs
chmod 400 /etc/wazuh-dashboard/certs/*
chown -R wazuh-dashboard:wazuh-dashboard /etc/wazuh-dashboard/certs
我實際操作時,indexer 的憑證目錄權限設 500/400 後 indexer 起不來,改成以下才正常:
chown -R wazuh-indexer:wazuh-indexer /etc/wazuh-indexer/certs
chmod 750 /etc/wazuh-indexer/certs
chmod 640 /etc/wazuh-indexer/certs/*
把 127.0.0.1 改成實際 IP
這是最容易漏掉的一步。新憑證是簽給 192.168.10.21 的,不包含 127.0.0.1。原本 all-in-one 裡各元件都是用 127.0.0.1 連 indexer,換憑證之後主機名稱驗證就會失敗。
wazuh1 上要改的地方:
| 檔案 | 設定 | 改成 |
|---|---|---|
/etc/filebeat/filebeat.yml | output.elasticsearch.hosts | ["192.168.10.21:9200"] |
/etc/wazuh-dashboard/opensearch_dashboards.yml | opensearch.hosts | https://192.168.10.21:9200 |
/usr/share/wazuh-dashboard/data/wazuh/config/wazuh.yml | API 的 url | https://192.168.10.21 |
/var/ossec/etc/ossec.conf | <indexer> 裡的 <host> | https://192.168.10.21:9200 |
最後一項是 Vulnerability Detection 模組寫入 indexer 用的。我一開始漏改,叢集都正常了,弱點偵測卻一直沒有資料,查了才發現它也是用 127.0.0.1 在連:
<indexer>
<enabled>yes</enabled>
<hosts>
<host>https://192.168.10.21:9200</host>
</hosts>
...
</indexer>
wazuh1 設定為 master
產生叢集金鑰(兩台要用同一把,32 個字元):
openssl rand -hex 16
在 wazuh1 的 /var/ossec/etc/ossec.conf 裡,找到原本的 <cluster> 區塊(預設是停用的)改成:
<cluster>
<name>wazuh</name>
<node_name>wazuh1-server</node_name>
<node_type>master</node_type>
<key>your-32-char-cluster-key</key>
<port>1516</port>
<bind_addr>0.0.0.0</bind_addr>
<nodes>
<node>192.168.10.21</node>
</nodes>
<hidden>no</hidden>
<disabled>no</disabled>
</cluster>
<node_name>要和憑證的 server 名稱一致<nodes>裡只填 master 的位址,master 和 worker 都一樣
重新啟動 wazuh1 的服務:
systemctl restart wazuh-indexer
systemctl restart wazuh-manager
systemctl restart filebeat
systemctl restart wazuh-dashboard
確認 dashboard 可以登入、filebeat 連線正常(filebeat test output)再繼續。
wazuh2 安裝 manager 與 filebeat
apt update
apt install -y curl apt-transport-https gnupg
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --dearmor -o /usr/share/keyrings/wazuh.gpg
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" \
> /etc/apt/sources.list.d/wazuh.list
apt update
# 指定和 wazuh1 相同的版本
apt-cache madison wazuh-manager | head
apt install -y wazuh-manager=4.14.1-1 filebeat
裝完之後建議鎖住版本,避免日常更新時兩台版本不一致:
apt-mark hold wazuh-manager filebeat
wazuh1 那台也一樣要鎖。之後要升級時,先升 master、再升 worker。
wazuh2 設定 filebeat
設定檔、範本與模組
# 官方 filebeat 設定範本
curl -so /etc/filebeat/filebeat.yml https://packages.wazuh.com/4.14/tpl/wazuh/filebeat/filebeat.yml
# 告警的 index 範本,版本號換成實際的 Wazuh 版本
curl -so /etc/filebeat/wazuh-template.json \
https://raw.githubusercontent.com/wazuh/wazuh/v4.14.1/extensions/elasticsearch/7.x/wazuh-template.json
chmod go+r /etc/filebeat/wazuh-template.json
# Wazuh 的 filebeat 模組
curl -s https://packages.wazuh.com/4.x/filebeat/wazuh-filebeat-0.5.tar.gz | tar -xvz -C /usr/share/filebeat/module
這一步在我原本的筆記裡漏掉了。只裝 filebeat 套件不夠,沒有 Wazuh 模組,filebeat 不知道要讀哪個檔案、送到哪個 index。
編輯 /etc/filebeat/filebeat.yml,把輸出指向 wazuh1:
output.elasticsearch:
hosts: ["192.168.10.21:9200"]
protocol: https
帳密
filebeat 用 keystore 存放連 indexer 的帳密,密碼就是 wazuh1 indexer 的 admin 密碼(all-in-one 安裝時產生的那組)。沒改過預設密碼的話,可以在 wazuh1 上從安裝檔取出:
tar -O -xvf wazuh-install-files.tar wazuh-install-files/wazuh-passwords.txt
在 wazuh2 建立 keystore:
filebeat keystore create
echo admin | filebeat keystore add username --stdin --force
echo 'your-admin-password' | filebeat keystore add password --stdin --force
憑證
cd /root
NODE_NAME=wazuh2-server
mkdir -p /etc/filebeat/certs
tar -xf ./wazuh-certificates.tar -C /etc/filebeat/certs/ ./$NODE_NAME.pem ./$NODE_NAME-key.pem ./root-ca.pem
mv -n /etc/filebeat/certs/$NODE_NAME.pem /etc/filebeat/certs/filebeat.pem
mv -n /etc/filebeat/certs/$NODE_NAME-key.pem /etc/filebeat/certs/filebeat-key.pem
chmod 500 /etc/filebeat/certs
chmod 400 /etc/filebeat/certs/*
chown -R root:root /etc/filebeat/certs
官方範本裡的憑證檔名是 filebeat.pem、filebeat-key.pem,這裡就照它命名。
測試
systemctl enable --now filebeat
filebeat test output
看到 talk to server... OK 才代表 wazuh2 到 wazuh1 indexer 的連線與憑證都正確。
wazuh2 設定為 worker
/var/ossec/etc/ossec.conf 的 <cluster>:
<cluster>
<name>wazuh</name>
<node_name>wazuh2-server</node_name>
<node_type>worker</node_type>
<key>your-32-char-cluster-key</key>
<port>1516</port>
<bind_addr>0.0.0.0</bind_addr>
<nodes>
<node>192.168.10.21</node>
</nodes>
<hidden>no</hidden>
<disabled>no</disabled>
</cluster>
<key> 要和 master 同一把,<nodes> 填 master 的位址。
systemctl enable wazuh-manager
systemctl restart wazuh-manager
驗證
在 wazuh1 上:
/var/ossec/bin/cluster_control -l
NAME TYPE VERSION ADDRESS
wazuh1-server master 4.14.1 192.168.10.21
wazuh2-server worker 4.14.1 192.168.10.22
兩台都出現就完成了。dashboard 的「Server management → Cluster」也看得到兩個節點。
讓 agent 連到 worker
叢集組好之後,agent 不會自動分散到 worker,要調整 agent 的設定。可以填多個 server,第一個連不上時自動切到下一個:
<client>
<server>
<address>192.168.10.22</address>
<port>1514</port>
<protocol>tcp</protocol>
</server>
<server>
<address>192.168.10.21</address>
<port>1514</port>
<protocol>tcp</protocol>
</server>
</client>
agent 多的話,前面放一台負載平衡器(例如 HAProxy、Nginx stream)分散到兩台,會比逐台改 agent 設定好管理。
問題排除
以下是我實際遇到的狀況,正常照上面步驟做不一定會遇到,有遇到再處理。
Error 3012:Cluster is not running
在 wazuh2 執行 cluster_control -l 出現這個錯誤,先看記錄:
grep -i cluster /var/ossec/logs/ossec.log | tail -50
tail -50 /var/ossec/logs/cluster.log
如果有 queue/cluster/c-internal.sock Connection refused,通常是叢集的執行期檔案殘留或權限不對,重建:
systemctl stop wazuh-manager
rm -rf /var/ossec/queue/cluster
mkdir -p /var/ossec/queue/cluster
chown -R root:wazuh /var/ossec/queue/cluster
chmod 770 /var/ossec/queue/cluster
systemctl start wazuh-manager
Error 3031:Worker and master versions are not the same
cluster.log 出現這個,就是兩台版本不一致,唯一的解法是把版本調成一樣,再重新啟動兩邊的 wazuh-manager。
服務起不來、記錄裡一堆 Permission denied
例如 wazuh-apid did not start correctly、wdb-http.sock Permission denied、queue/fts/hostinfo Permission denied。這類錯誤通常是曾經用 root 手動執行過 Wazuh 的程式,產生了 root 擁有的檔案。
可以逐一把擁有者改回來:
systemctl stop wazuh-manager
chown -R root:wazuh /var/ossec/queue /var/ossec/var
rm -f /var/ossec/var/run/*.pid
systemctl start wazuh-manager
如果權限已經亂到不知道從何改起,新建的 worker 上直接移除重裝 wazuh-manager 通常比一個一個修快。
注意:網路上有些做法會對 Wazuh 的程式加 setuid(chmod u+s),這不是必要步驟,而且有安全疑慮,請勿使用。
systemd 啟動逾時,但程式其實都起來了
worker 第一次同步大量檔案時,啟動時間可能超過 systemd 的預設等待時間,被判定失敗。可以延長逾時:
mkdir -p /etc/systemd/system/wazuh-manager.service.d
cat > /etc/systemd/system/wazuh-manager.service.d/override.conf <<'EOF2'
[Service]
TimeoutStartSec=5min
TimeoutStopSec=2min
EOF2
systemctl daemon-reload
systemctl restart wazuh-manager
Vulnerability Detection 沒有資料
見第三步:ossec.conf 的 <indexer> 還是 127.0.0.1,改成實際 IP 後重新啟動 wazuh-manager:
systemctl restart wazuh-manager
sleep 30 && grep -i vulnerability /var/ossec/logs/ossec.log | tail -10
結論
從 all-in-one 加一台 worker,官方文件其實都有,但散在好幾個章節。我覺得最關鍵的三件事是:版本完全一致、重新產生憑證後把所有 127.0.0.1 改成實際 IP、worker 的 filebeat 要裝 Wazuh 模組與範本。這三件做好,叢集基本上一次就會起來。
參考資料
- Wazuh 文件:Wazuh server cluster
https://documentation.wazuh.com/current/user-manual/wazuh-server-cluster/index.html - Wazuh 文件:Wazuh server installation(step by step)
https://documentation.wazuh.com/current/installation-guide/wazuh-server/step-by-step.html - Wazuh 文件:Adding Wazuh server nodes(All-in-one deployment)
https://documentation.wazuh.com/current/user-manual/wazuh-server-cluster/adding-new-server-nodes/all-in-one-deployment.html - Wazuh 叢集節點連線紀錄查詢方式
https://blog.jason.tools/2026/06/wazuh-cluster-node-history.html - Wazuh 文件:cluster_control
https://documentation.wazuh.com/current/user-manual/reference/tools/cluster-control.html



