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

Wazuh all-in-one 新增 Worker 節點

Jason Cheng 發布 瀏覽 1 次
Wazuh all-in-one 新增 Worker 節點
本文目錄
  1. 架構
  2. 重新產生憑證
  3. 在 wazuh1 部署新憑證
  4. 把 127.0.0.1 改成實際 IP
  5. wazuh1 設定為 master
  6. wazuh2 安裝 manager 與 filebeat
  7. wazuh2 設定 filebeat
  8. wazuh2 設定為 worker
  9. 驗證
  10. 讓 agent 連到 worker
  11. 問題排除
  12. 結論
  13. 參考資料

Wazuh 剛導入時,大多是用官方安裝助理裝成一台 all-in-one:indexer、server、dashboard 全部在同一台。代理程式(agent)一多,server 的負擔越來越重,就會想再加一台分擔。

這篇記錄我實際操作的流程:保留原本的 all-in-one 不改架構,新增一台 worker 節點,組成 Wazuh server 叢集。過程中踩到的問題放在最後的問題排除,正文照著做就能完成。

架構

主機IP角色
wazuh1192.168.10.21既有 all-in-one:indexer+server(master)+dashboard
wazuh2192.168.10.22新增:server(worker)+filebeat,資料送到 wazuh1 的 indexer

需要開放的連線:

來源目的通訊埠用途
wazuh2wazuh11516/TCP叢集同步
wazuh2wazuh19200/TCPfilebeat 寫入 indexer
agentwazuh21514/TCPagent 回報事件
agentwazuh11515/TCPagent 註冊

注意:兩台的 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.ymloutput.elasticsearch.hosts["192.168.10.21:9200"]
/etc/wazuh-dashboard/opensearch_dashboards.ymlopensearch.hostshttps://192.168.10.21:9200
/usr/share/wazuh-dashboard/data/wazuh/config/wazuh.ymlAPI 的 urlhttps://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 模組與範本。這三件做好,叢集基本上一次就會起來。

參考資料

Jason Cheng

Jason Cheng

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

關於作者 →

延伸閱讀