本文目錄
這次要把 pfSense 納入既有的 Wazuh Manager,收集防火牆、OpenVPN、登入與系統記錄,同時監控設定檔變更、定期檢查套件漏洞。
pfSense 的官方套件庫裡沒有 Wazuh Agent,所以我改用 FreeBSD 維護的 security/wazuh-agent。過程中踩到不少問題:套件庫分支不存在、FreeBSD 基底版本差異、pkg 被意外升級、下載檔案的路徑和預期不同,還有註冊密碼與記錄來源重複設定。
如果用的是 OPNsense,就不需要這麼麻煩:OPNsense 官方外掛就有 os-wazuh-agent,到 System > Firmware > Plugins 直接安裝,在 Services > Wazuh Agent 設定 Manager 位址與註冊密碼即可。記錄來源可以在介面上勾選,入侵偵測事件也能一併送出,還附有可封鎖來源位址的 opnsense-fw Active Response 動作。pfSense 沒有對應的套件,才需要走下面這一長串流程。
這篇先整理出一份可以照著做的安裝步驟,再把實際遇到的問題與處理方式列在後面。後面那些是出錯時用過的指令,新安裝不需要照著跑一遍。
注意:這是在指定版本上手動安裝的實測記錄,不是 Netgate 官方支援的部署方式。FreeBSD 16-CURRENT 的套件庫會持續變動,同樣的指令以後不一定拿得到相同的套件與相依關係。正式環境的防火牆請先備份,VM 先建立快照,並保留 Console 的存取方式。
實測環境與驗證範圍
| 項目 | 本次實測值 |
|---|---|
| pfSense | CE 2.9.0-RELEASE |
| FreeBSD 基底 | 16.0-CURRENT |
| 架構 | amd64 |
| pfSense userland 版本編號 | 1600018 |
| FreeBSD 套件的編譯版本編號 | 1600029 |
| pfSense 原有的 pkg | 2.7.5_4(pkg -v 顯示 2.7.5) |
| Wazuh Agent 套件版本 | 4.14.9 |
| Wazuh 執行檔回報版本 | 4.14.8,說明見問題排除 |
| 額外新增的相依套件 | libepoll-shim-0.0.20240608 |
| Wazuh Manager | 192.168.1.20(範例位址) |
| Agent 名稱 | pfsense-01(範例名稱) |
| Agent 安裝目錄 | /var/ossec |
Wazuh 官方的相容條件是 Manager 版本要大於或等於 Agent。部署前先確認 Manager 版本,並以套件標示的 4.14.9 來比對,比較保險。
已驗證與尚未驗證的項目
| 項目 | 結果 |
|---|---|
| 從本機套件檔安裝 Agent 與 libepoll-shim | 成功 |
| 以密碼註冊並取得金鑰 | 成功,收到 Valid key received |
| Agent 五個主要程序啟動 | 成功 |
| 連線到 Manager TCP 1514 | 成功 |
| 開始監看指定的記錄檔 | 啟動記錄已確認 |
| 設定檔完整性監控 | 已啟動,掃描間隔 43,200 秒 |
| Manager 下發 pkg audit 指令 | Agent 已接受,間隔 86,400 秒 |
| 手動執行 pkg audit | 成功,8 個套件命中 14 筆漏洞公告 |
| Dashboard 顯示 Agent、系統與套件清單 | 已確認,見「啟動與驗證」的截圖 |
| Dashboard 收到每一種測試事件 | 本次未逐項驗證 |
| CVE 解析、自訂規則與告警顯示 | 尚未完成端到端驗證 |
| 重新開機後自動啟動 | 提供設定方式,本次未實測重新開機 |
| pfSense 韌體升級後仍可運作 | 尚未驗證 |
部署方式與必要條件
整體做法如下:
- 保留 pfSense 原本的套件庫設定與
pkg - 用暫存的設定檔查詢 FreeBSD 套件庫
- 先把需要的套件下載下來,再從本機用
pkg add安裝 - Agent 本機管理
userlog、filter.log與 Agent 自己的 Active Response 記錄 - Manager 的 pfSense 專用群組統一管理
auth.log、system.log、openvpn.log與套件漏洞檢查
Netgate 官方文件明確表示不建議也不支援在 pfSense 上安裝 FreeBSD 套件庫的軟體,可能遇到的問題包括缺少函式庫、與系統元件衝突、增加攻擊面,而且這些軟體的設定不在 pfSense 的設定備份裡,韌體升級後可能遺失。要這樣做,就要自己承擔維護。
這樣做是為了避開對 FreeBSD 套件庫執行 pkg install 時,pkg 會先把自己升級的流程。要說明的是,這只能避開這次踩到的自動升級,ABI、函式庫與日後維護的相容性風險仍然存在。
連線需求
| 方向 | 目的通訊埠 | 用途 |
|---|---|---|
| pfSense → Wazuh Manager | TCP 1515 | 註冊並取得 Agent 金鑰 |
| pfSense → Wazuh Manager | TCP 1514 | Agent 持續傳送資料 |
| pfSense → 套件與漏洞資料來源 | DNS、HTTPS | 下載套件、更新漏洞資料庫 |
文中的 192.168.1.20、pfsense-01 請換成自己環境的值。每台裝置要用不同的 Agent 名稱與金鑰,請勿複製另一台的 client.keys。
安裝前的備份與現況記錄
先到 pfSense 的 Diagnostics > Backup & Restore 匯出設定。注意手動安裝的 Wazuh 設定不在 pfSense 的設定備份裡,後面要另外備份。
SSH 登入後選 8) Shell。pfSense 預設的互動 shell 可能是 tcsh,本文的條件判斷、變數與 heredoc 都是 POSIX sh 的寫法,所以先切換:
sh
記錄系統與套件版本:
cat /etc/version
freebsd-version -ku
uname -m
pkg query '%n-%v' pkg
pkg -v
建立備份目錄,保存套件清單、套件資料庫與套件庫設定:
umask 077
mkdir -p /root/wazuh-install-backup
pkg info > /root/wazuh-install-backup/packages-before.txt
pkg shell .dump > /root/wazuh-install-backup/pkg-database-before.sql
cp -p /conf/config.xml /root/wazuh-install-backup/config-before.xml
cp -Rp /usr/local/etc/pkg/repos /root/wazuh-install-backup/repos-before
套件資料庫用 pkg shell .dump 匯出。舊文件常見的 pkg backup -d 在 pkg 1.19 已經移除,2.x 版沒有這個指令。
設定檔與備份可能含有帳號、金鑰或憑證,要放在受控的位置。匯出的套件資料庫只用於事後追查,不能取代磁碟快照,也請勿拿舊的資料庫直接覆蓋已經變更過的系統。
建立獨立的 FreeBSD 套件庫設定
不要改 pfSense 原本的設定去永久啟用 FreeBSD 套件庫。這次用 REPOS_DIR 指定一個暫存目錄,只有明確帶這個參數的指令才會讀它:
mkdir -p /tmp/wazuh-repos
cat > /tmp/wazuh-repos/FreeBSD.conf <<'EOF'
FreeBSD: {
url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}
EOF
注意 heredoc 用的是加了單引號的 'EOF',這樣 ${ABI} 才會原樣寫進設定檔交給 pkg 判斷,不會被 shell 先展開。
FreeBSD:16:amd64 的官方目錄只有 latest,沒有 quarterly。寫成 quarterly 會遇到 meta.txz、data.pkg、packagesite.pkg 找不到的 404 錯誤。
基底版本差異的處理
先正常更新一次,看實際的回報:
pkg -o REPOS_DIR=/tmp/wazuh-repos update -r FreeBSD
這次出現套件庫是 1600029、pfSense userland 是 1600018 的版本差異。為了取得索引、下載套件,我在單一指令加上 IGNORE_OSVERSION=yes:
env IGNORE_OSVERSION=yes pkg -o REPOS_DIR=/tmp/wazuh-repos update -f -r FreeBSD
IGNORE_OSVERSION=yes 只是略過版本檢查,不會補上缺少的函式庫,也不會修正 ABI,不是每台 pfSense 都適合直接套用。這次是同一個 FreeBSD 16/amd64 大版本,評估過相依套件後才進行安裝測試;其他基底版本或正式環境請先在複本上驗證,必要時用相符的建置環境重新編譯套件。
請勿改寫 ABI 假裝成 FreeBSD 14、15,也不要把 IGNORE_OSVERSION=yes 設成全域設定。
查詢、下載與檢查套件
查詢可用版本
pkg -o REPOS_DIR=/tmp/wazuh-repos -o REPO_AUTOUPDATE=false search -r FreeBSD wazuh-agent
這次查到的是:
wazuh-agent-4.14.9
只下載 Agent
mkdir -p /tmp/wazuh-download
env IGNORE_OSVERSION=yes pkg \
-o REPOS_DIR=/tmp/wazuh-repos \
-o REPO_AUTOUPDATE=false \
fetch -r FreeBSD -o /tmp/wazuh-download wazuh-agent
這裡沒有加 -d,不會把全部相依套件一起下載。先確認下載的版本符合 Manager 的相容條件再往下做。
找到實際的檔案
find /tmp/wazuh-download -type f
這次下載的路徑是:
/tmp/wazuh-download/All/Hashed/wazuh-agent-4.14.9~2$j8fut4wa.pkg
檔案不在 All/ 底下,而是 All/Hashed/,檔名還帶了雜湊值。檔名裡有 $,請勿直接貼進沒有加單引號的 shell 指令。
核對 ABI、編譯基底與相依套件
find /tmp/wazuh-download -type f -name 'wazuh-agent-*' \
-exec pkg info -F '{}' --raw \; \
| grep -E '(^name:|^version:|^abi:|^arch:|osversion|FreeBSD_version)'
結果:
name: "wazuh-agent"
version: "4.14.9"
abi: "FreeBSD:16:amd64"
arch: "freebsd:16:x86:64"
FreeBSD_version: "1600029",
再看相依套件:
find /tmp/wazuh-download -type f -name 'wazuh-agent-*' \
-exec pkg info -d -F '{}' \;
列出的是:
libepoll-shim-0.0.20240608
libnghttp2-1.70.0
perl5-5.42.3
readline-8.3.6
sqlite3-3.53.4,1
預覽變更
env IGNORE_OSVERSION=yes pkg \
-o REPOS_DIR=/tmp/wazuh-repos \
-o REPO_AUTOUPDATE=false \
install -n -r FreeBSD wazuh-agent
預覽結果只新增兩個套件:
libepoll-shim: 0.0.20240608
wazuh-agent: 4.14.9
但實際拿掉 -n 執行時,pkg 卻先要求把自己從 pfSense 版的 2.7.5_4 升級成 FreeBSD 版的 2.8.4。
所以預覽只用來檢查相依關係,請勿接著拿掉 -n 直接安裝,後面一律從本機的套件檔安裝。預覽如果要求替換既有的函式庫、移除 pfSense 元件,就先停下來評估。
下載缺少的相依套件
這次只有 libepoll-shim 還沒安裝:
env IGNORE_OSVERSION=yes pkg \
-o REPOS_DIR=/tmp/wazuh-repos \
-o REPO_AUTOUPDATE=false \
fetch -r FreeBSD -o /tmp/wazuh-download libepoll-shim
以後的相依清單可能不同,不要一次下載並替換所有函式庫;系統上已經有的套件也不需要為了照抄步驟而重新安裝。
從本機安裝,保留 pfSense 的 pkg
先檢查下載目錄,每個套件只保留一個要安裝的版本。下面的 find -exec 會安裝每個符合條件的檔案,目錄裡混了多個版本時不能直接執行:
find /tmp/wazuh-download -type f -name 'libepoll-shim-*' -print
find /tmp/wazuh-download -type f -name 'wazuh-agent-*' -print
先裝相依套件:
find /tmp/wazuh-download -type f -name 'libepoll-shim-*' \
-print -exec env IGNORE_OSVERSION=yes pkg add '{}' \;
成功後再裝 Agent:
find /tmp/wazuh-download -type f -name 'wazuh-agent-*' \
-print -exec env IGNORE_OSVERSION=yes pkg add '{}' \;
這樣裝完新增了兩個套件,pkg 沒有再被自動升級。如果出現版本、相依或檔案衝突的錯誤,請勿加 -f 或略過相依性強制安裝。
安裝後確認:
pkg query '%n-%v' pkg wazuh-agent libepoll-shim
ldd /var/ossec/bin/wazuh-agentd
ldd /var/ossec/bin/wazuh-modulesd
ldd /var/ossec/bin/wazuh-syscheckd
ldd 不應出現 not found 或載入錯誤。不過 ldd 通過只代表函式庫找得到,還是要以實際啟動、連線與收集結果為準。
建立 Agent 本機設定
複製範本與時區
一樣在 sh 裡執行:
test -f /var/ossec/etc/ossec.conf ||
cp -p /var/ossec/etc/ossec.conf.sample /var/ossec/etc/ossec.conf
test -f /var/ossec/etc/client.keys ||
cp -p /var/ossec/etc/client.keys.sample /var/ossec/etc/client.keys
cp /etc/localtime /var/ossec/etc/localtime
cp -p /var/ossec/etc/ossec.conf /root/wazuh-install-backup/ossec.conf.initial
已經註冊過的 Agent,請勿覆蓋它的 client.keys。
設定 Manager 位址
vi /var/ossec/etc/ossec.conf
修改 <client> 裡現有的 <server>,不要另外再加一組:
<server>
<address>192.168.1.20</address>
<port>1514</port>
<protocol>tcp</protocol>
</server>
記錄來源的分工
Agent 本機的設定和 Manager 下發的設定會合併,所以要先決定每個來源由哪一邊管理:
| 來源 | 管理位置 |
|---|---|
/var/log/auth.log | Manager 的 pfSense 專用群組 |
/var/log/system.log | Manager 的 pfSense 專用群組 |
/var/log/openvpn.log | Manager 的 pfSense 專用群組 |
/var/log/userlog | Agent 本機 |
/var/log/filter.log | Agent 本機 |
/var/ossec/logs/active-responses.log | Agent 本機 |
pkg-static audit -F | Manager 的 pfSense 專用群組 |
先確認檔案都存在:
ls -l /var/log/auth.log /var/log/system.log /var/log/openvpn.log /var/log/userlog /var/log/filter.log
pfSense 從 2.5.0 起記錄檔改成純文字,2.9.0 可以直接讀取,不需要像舊版那樣轉換 clog 格式。
FreeBSD 的範本預設會讀下面這些路徑,pfSense 上都不存在,要把對應的整個 <localfile>...</localfile> 區塊刪掉:
/var/log/messages
/var/log/cron
/var/log/daemon.log
/var/log/debug.log
其他不存在的來源也一樣先核對再移除,不要建立空的記錄檔來掩蓋設定錯誤。
依照上面的分工,本機設定裡所有 auth.log、system.log、openvpn.log 的 <localfile> 也一併移除,交給 Manager 管理。
本機只保留以下三個,放在 <ossec_config> 裡,已經有的就不要重複加:
<localfile>
<log_format>syslog</log_format>
<location>/var/ossec/logs/active-responses.log</location>
</localfile>
<localfile>
<log_format>syslog</log_format>
<location>/var/log/userlog</location>
</localfile>
<localfile>
<log_format>syslog</log_format>
<location>/var/log/filter.log</location>
</localfile>
Active Response 的記錄檔還沒產生,先建立並設定權限:
touch /var/ossec/logs/active-responses.log
chown root:wazuh /var/ossec/logs/active-responses.log
chmod 660 /var/ossec/logs/active-responses.log
這個檔案只用來收集 Active Response 的記錄,建立它不代表已經設定了自動封鎖。
移除舊式的 Unix audit 設定
在 <rootcheck> 區塊裡,移除舊式的 <system_audit> 項目。這次的範本有這三行:
<system_audit>/var/ossec/etc/shared/system_audit_rcl.txt</system_audit>
<system_audit>/var/ossec/etc/shared/system_audit_ssh.txt</system_audit>
<system_audit>/var/ossec/etc/shared/cis_freebsd16.yml</system_audit>
如果另外有 <check_unixaudit>...</check_unixaudit>,也一起移除。其餘的 Rootcheck 與 SCA 設定保留,不需要停用整個模組。
Wazuh 從 3.9.0 起由 SCA(Security Configuration Assessment)模組取代 Rootcheck 的組態稽核,要做組態稽核應該用適合這個平台的 SCA policy。只把 YAML 檔複製到舊的 system_audit 路徑,並不等於完成了 CIS 稽核。
檔案完整性監控
這次的啟動記錄確認 /conf/config.xml 等路徑已經納入監控,掃描間隔 43200 秒,也就是 12 小時。
需要補上時,修改現有的 <syscheck> 區塊,例如:
<frequency>43200</frequency>
<scan_on_start>yes</scan_on_start>
<directories check_all="yes">/conf/config.xml</directories>
不要為了加一個路徑就另外建立一個 <syscheck> 區塊。這裡用的是定期掃描,設定檔修改後不會即時告警;config.xml 含有敏感資訊,也不需要開啟內容差異回報。
註冊 Agent
在 Manager 查詢註冊密碼
在 Manager 主機上執行:
sudo cat /var/ossec/etc/authd.pass
如果 Manager 沒有用固定的密碼檔,而是啟動時產生隨機密碼,可以從記錄裡找最近一次:
sudo grep 'Random password' /var/ossec/logs/ossec.log | tail -n 1
要用的是目前生效的註冊密碼,不是 Dashboard 或 Wazuh API 的登入密碼。容器部署的話,在 Manager 容器內或對應的掛接目錄操作。兩種都查不到時,先檢查 Manager 的 <auth> 設定,請勿為了註冊就關掉密碼驗證。
在 pfSense 寫入密碼檔
vi /var/ossec/etc/authd.pass
把註冊密碼寫成一行,不加引號,再設定權限:
chown root:wazuh /var/ossec/etc/authd.pass
chmod 640 /var/ossec/etc/authd.pass
用編輯器寫入,密碼才不會留在指令歷程裡。密碼與 client.keys 的內容不要貼到公開的地方或問題回報裡。
執行註冊
/var/ossec/bin/agent-auth -m 192.168.1.20 -p 1515 -A pfsense-01
agent-auth 預設就會讀 etc/authd.pass。成功的訊息如下:
Using password specified on file: etc/authd.pass
Using agent name as: pfsense-01
Valid key received
註冊一次就好,之後重新啟動不需要再執行 agent-auth。
在 Manager 下發 pfSense 專用設定
我建議在 Manager 建立獨立的 pfsense 群組,避免這些設定套用到所有 Linux、Windows Agent 上:
- 在 Dashboard 的 Agent 群組管理建立
pfsense群組 - 把
pfsense-01加入這個群組 - 檢查這台 Agent 還屬於哪些群組,避免同一個來源也在
default或其他群組定義 - 編輯這個群組的
agent.conf,把下面的內容合併進去;原本的設定先備份,不要整份覆蓋
群組設定在 Manager 的 /var/ossec/etc/shared/pfsense/agent.conf;Agent 上的 etc/shared/agent.conf 是同步過來的副本,不要直接改它。
<agent_config>
<localfile>
<log_format>syslog</log_format>
<location>/var/log/auth.log</location>
</localfile>
<localfile>
<log_format>syslog</log_format>
<location>/var/log/system.log</location>
</localfile>
<localfile>
<log_format>syslog</log_format>
<location>/var/log/openvpn.log</location>
</localfile>
<localfile>
<log_format>command</log_format>
<command>/usr/local/sbin/pkg-static audit -F</command>
<frequency>86400</frequency>
</localfile>
</agent_config>
在 Manager 的 shell 編輯的話,存檔後可以先驗證語法:
sudo /var/ossec/bin/verify-agent-conf -f /var/ossec/etc/shared/pfsense/agent.conf
等設定同步後,在 Agent 上確認有沒有收到:
grep -nE '<location>|<command>|<frequency>' /var/ossec/etc/shared/agent.conf
允許 Manager 下發的指令監看
指令類型的 localfile 預設不接受從 Manager 下發。要執行上面的套件漏洞檢查,先檢查這台 Agent 所屬群組裡有哪些指令,再到 pfSense 編輯:
vi /var/ossec/etc/local_internal_options.conf
加入這一行:
logcollector.remote_commands=1
注意這個選項開了之後,Manager 下發的任何指令監看都會被接受,不只 pkg audit。所以 Manager 的管理權限要控管好,也不要把不適用的群組設定指派給 pfSense。
如果不想開放遠端指令,另一個做法是把這個指令區塊放到 Agent 本機的 ossec.conf,並從 Manager 的群組設定移除。兩邊擇一,不要同時設定。
啟動與驗證
第一次啟動:
service wazuh-agent onestart
/var/ossec/bin/wazuh-control status
tail -n 80 /var/ossec/logs/ossec.log
五個程序都應該是 running:
wazuh-modulesd is running...
wazuh-logcollector is running...
wazuh-syscheckd is running...
wazuh-agentd is running...
wazuh-execd is running...
連線成功的訊息:
Connected to the server ([192.168.1.20]:1514/tcp).
記錄來源載入成功:
Analyzing file: '/var/log/userlog'.
Analyzing file: '/var/log/filter.log'.
Analyzing file: '/var/log/auth.log'.
Analyzing file: '/var/log/system.log'.
Analyzing file: '/var/log/openvpn.log'.
Manager 下發的指令監看載入成功:
Monitoring output of command(86400): /usr/local/sbin/pkg-static audit -F
之後修改本機設定,要用這個指令重新啟動:
/var/ossec/bin/wazuh-control restart
onestart 是啟動服務用的,程序已經在執行時再跑一次不會重新載入設定。
另外,舊的錯誤訊息會一直留在 ossec.log 裡。問題排除時要看這次重新啟動之後的訊息,不要搜尋整個檔案看到舊的 ERROR 就以為沒修好。
確認資料有送到 Manager
Agent 出現 Analyzing file 只代表開始讀取這個來源,不代表 Manager 已經收到或產生告警。還要做以下確認:
- 在 Dashboard 確認
pfsense-01的狀態是 Active - 用正常的 SSH、OpenVPN 登入登出產生新事件
- 確認 pfSense 上的記錄檔有新增內容,再到 Manager 搜尋這台 Agent 的事件
- Agent 與網路都正常,Dashboard 卻找不到時,檢查 decoder、rule 與儲存設定;預設沒有觸發告警的事件不會出現在告警搜尋裡
這次裝好後,Dashboard 的 Agent 頁面顯示狀態 active、版本 Wazuh v4.14.8、作業系統 BSD 16.0,系統清單也收到了 CPU 與記憶體資訊,事件、MITRE ATT&CK 與 PCI DSS 合規統計都已經開始出現。

注意群組欄位:這台同時屬於 default 與 pfsense 兩個群組,default 的 agent.conf 就不能再定義相同的記錄來源,否則會出現後面提到的重複設定警告。
Syscollector 也正常運作。到 IT Hygiene 的 Software 分頁,可以看到 pfSense 上的 207 個 pkg 套件與各自的版本,套件維護者分別來自 FreeBSD 與 pfSense。

驗證時不需要觸發漏洞,也不需要去改正式環境的 /conf/config.xml。
套件漏洞檢查與結果判讀
在 pfSense 上手動執行:
/usr/local/sbin/pkg-static audit -F
-F 是先更新漏洞資料庫,不是升級套件。發現漏洞時指令會以非零狀態結束,這不代表執行失敗,要看輸出內容判讀。
這次的結果:
| 套件 | 已安裝版本 |
|---|---|
| unbound | 1.26.1 |
| nginx | 1.30.4,3 |
| openvpn | 2.7.5 |
| python311 | 3.11.15_3 |
| brotli | 1.2.0,1 |
| curl | 8.20.0 |
| mysql84-client | 8.4.9 |
| expat | 2.8.2 |
14 problem(s) in 8 package(s) found.
意思是 8 個套件命中 14 筆漏洞公告,不是只有 14 個 CVE,也不代表裝置已經被入侵。很多公告要特定功能、編譯選項或資料輸入途徑才能利用。例如 mysql84-client 是用戶端函式庫,不能解讀成防火牆對外提供了 MySQL 服務。
其中和 OpenVPN 直接相關的是:
openvpn-2.7.5 is vulnerable:
OpenVPN: denial of service
CVE: CVE-2026-84732
CVE-2026-84732 是 OpenVPN 控制通道可靠性層處理 ACK 封包重送時的整數溢位,可造成服務阻斷,影響 2.6.22 以前與 2.7.6 以前的版本。CVSS v4.0 基本分數為 8.7(High),Ubuntu 自己的處理優先等級則標為 Medium。FreeBSD 的公告列出受影響範圍是 openvpn < 2.7.7,目前 FreeBSD 套件庫的 openvpn 已經是修正後的版本。
pkg audit 是依 FreeBSD VuXML 的套件版本規則比對,pfSense 有沒有回補修正,還是要對照 Netgate 的公告與實際的套件修訂版本。反過來說,掃描沒列出的 CVE,也不能據此說一定不受影響。
收進 Wazuh 不等於完成漏洞告警
<log_format>command</log_format> 會把輸出的每一行當成一筆事件;要整份輸出當成一筆事件,要用 full_command。
所以直接收集 pkg audit 的原始文字,套件名稱、CVE、公告網址不一定能正確關聯成結構化的告警。要做到完整的漏洞告警,還需要:
- 檢查 Manager 現有的 decoder、rule 有沒有涵蓋這種輸出
- 用 Ruleset Test 驗證實際事件
- 必要時自己寫解析與規則,或寫一支包裝程式把結果轉成逐筆的 JSON
- 驗證最後的告警欄位、等級與 Dashboard 的顯示
這部分這次還沒完成實測,所以本文不提供未驗證的自訂規則。這種做法也不等於 Wazuh 原生的弱點偵測(Vulnerability Detection)功能。
修補走 pfSense 官方管道
請到 System > Update 檢查官方版本、更新與安全公告。請勿因為掃出漏洞,就對 FreeBSD 套件庫執行 pkg upgrade,也不要逐一替換 nginx、OpenVPN、Unbound、OpenSSL、PHP 這些 pfSense 系統元件。
開機自動啟動與備份
用 Shellcmd 設定開機啟動
- 從 pfSense 的套件管理員安裝 Shellcmd
- 到
Services > Shellcmd新增一筆 - 類型選
shellcmd,指令填入下面這行
/usr/sbin/service wazuh-agent onestart
shellcmd 類型會在開機較後段執行,而且會存進 pfSense 的設定檔。不過存進設定檔的只是這一行指令,Agent 套件本身與它的設定並不在 pfSense 的備份裡。
FreeBSD 套件的安裝訊息會建議用 sysrc wazuh_agent_enable="YES",但 pfSense 有自己的開機與設定管理方式,所以我改用 Shellcmd。正式採用前,請排維護時段實際重新開機一次,確認程序、Manager 連線與資料收集都會恢復。
額外要備份的檔案
至少包含:
/var/ossec/etc/ossec.conf/var/ossec/etc/local_internal_options.conf/var/ossec/etc/client.keys:Agent 的身分金鑰/var/ossec/etc/authd.pass:如果有保留註冊密碼- 自訂的 SCA policy、指令腳本與其他額外設定
- Manager 上對應群組的
agent.conf、自訂的 decoder 與 rule - 驗證過的 Agent 與相依套件檔,日後在相同基底重建時使用
含金鑰的備份不要當成公開附件。韌體升級後,要重新確認套件、函式庫、開機啟動與群組設定;手動加入的套件不保證能跨 pfSense 版本沿用。
本次遇到的問題與解法
FreeBSD 16 沒有 quarterly 套件庫
錯誤訊息:
FreeBSD:16:amd64/quarterly/meta.txz: Not Found
Unable to update repository FreeBSD
指定了不存在的分支,把暫存設定改成 latest 即可:
sed -i '' 's|/quarterly|/latest|' /tmp/wazuh-repos/FreeBSD.conf
這只是 FreeBSD 16 目前的狀況,不代表所有 FreeBSD 版本都沒有 quarterly。
套件庫比 pfSense userland 新
錯誤訊息:
Newer FreeBSD version for package zxfer:
- package: 1600029
- running userland: 1600018
repository FreeBSD contains packages for wrong OS version
第一個被點名的是索引裡的 zxfer,光憑這個不能判斷 Wazuh 相不相容。後來檢查 Agent 套件的 manifest,確認 Wazuh 本身也是用 1600029 建置的。
處理方式是評估之後,用單次的 IGNORE_OSVERSION=yes 取得索引、下載套件並從本機安裝。這次能正常啟動、連線與收集,但不代表所有模組與日後的版本都沒問題。
預覽只有兩個套件,實際卻升級了 pkg
預覽:
New packages to be INSTALLED:
libepoll-shim
wazuh-agent
實際執行 pkg install:
New version of pkg detected; it needs to be installed first.
pkg: 2.7.5_4 -> 2.8.4
這次我選了繼續,結果 pkg 被升級了,Wazuh 卻還沒裝起來。這就是前面的步驟改成從本機安裝、不再對 FreeBSD 套件庫直接 install 的原因。
已經被升級時的還原方式,先回到 pfSense 原本的套件庫更新索引:
pkg update -f
預覽從 pfSense 套件庫還原 pkg:
pkg -o REPO_AUTOUPDATE=false install -n -f -r pfSense pkg
這次確認只有這一項變更:
pkg: 2.8.4 -> 2.7.5_4 [pfSense]
清單沒問題再實際執行:
pkg -o REPO_AUTOUPDATE=false install -f -r pfSense pkg
pkg -v
pkg update -f
pkg -v 顯示 2.7.5 是正常的,_4 是套件修訂編號,可以用 pkg query '%n-%v' pkg 確認。
這段只適用這次的情況。如果官方套件庫的版本不同、還原清單牽動其他元件,或新的資料庫不再向下相容,請停下來改用快照或原廠支援的方式復原。
repository schema 變更,要求重建索引
訊息:
need to re-create repo FreeBSD to upgrade schema version
Repository FreeBSD cannot be opened. 'pkg update' required
切換過不同版本的 pkg,遠端索引的資料庫需要重建。還原 pfSense 的 pkg 之後,先用 pkg update -f 重建 pfSense 的索引;之後要用暫存的 FreeBSD 套件庫時,再執行:
env IGNORE_OSVERSION=yes pkg -o REPOS_DIR=/tmp/wazuh-repos update -f -r FreeBSD
這裡的 -f 是重新取得索引,不是強制安裝。
本機資料庫版本比 libpkg 新
訊息:
database version 42 is newer than libpkg(3) version 39, but still compatible
這是 pkg 升級又降回之後留下的資料庫版本差異。訊息本身寫明仍然相容,之後的查詢、安裝與校驗也都正常。
請勿為了消掉這個警告再升級一次 pkg,也不要刪除 /var/db/pkg/local.sqlite。這次沒有再動資料庫。
env: No match
原本的指令假設檔案在 All/ 底下:
pkg add /tmp/wazuh-download/All/libepoll-shim-*.pkg
env: No match.
實際檔案在 All/Hashed/,檔名還帶有雜湊值。這是 shell 的萬用字元沒有對到檔案,pkg 根本還沒執行。
解法是用 find 找檔案,直接把路徑交給 -exec,不要把檔名重新組成 shell 指令:
find /tmp/wazuh-download -type f -name 'libepoll-shim-*' \
-print -exec env IGNORE_OSVERSION=yes pkg add '{}' \;
Agent 也用一樣的方式安裝,記得先確認目錄裡只有一個要安裝的版本。
No packages matching wazuh-agen
這是我少打了最後一個 t,正確的套件名稱是 wazuh-agent,不是套件庫沒有提供。
Invalid password,無法註冊
No authentication password provided
Invalid password. Unable to add agent (from manager)
TCP 1515 是通的,Manager 也有回應,只是要求註冊密碼。把目前生效的註冊密碼寫進 Agent 的 /var/ossec/etc/authd.pass,權限設成 root:wazuh、640 後重新註冊,就收到 Valid key received。
這不是防火牆擋住,也不能拿 Dashboard 的密碼代替。
Cannot set timeout
Cannot set timeout: Numerical argument out of domain (33).
agent-auth 執行時出現這個警告,但仍然完成了和 Manager 的往返並取得金鑰。這次沒有針對它處理,根本原因也還沒確認。如果有遇到卡住或逾時,要針對 FreeBSD 移植版的實際執行檔追查。
預設的記錄檔不存在
Could not open file '/var/log/messages'
Could not open file '/var/log/cron'
Could not open file '/var/log/daemon.log'
Could not open file '/var/log/debug.log'
FreeBSD 的範本路徑和 pfSense 實際的記錄檔不同。移除不存在來源的整個 localfile 區塊,改收 pfSense 實際使用的記錄檔即可。
active-responses.log 則是 Wazuh 自己的記錄檔,依前面的步驟建立並設定權限。
同一個記錄來源被設定多次
Log file '/var/log/auth.log' is duplicated.
Log file '/var/log/openvpn.log' is duplicated.
這次同時有兩種重複:本機設定自己重複加了,以及本機和 Manager 群組重複。
查本機:
grep -nE '<location>|<command>|<log_format>' /var/ossec/etc/ossec.conf
查 Manager 下發到 Agent 的設定:
find /var/ossec/etc/shared -type f -name '*.conf' \
-exec grep -nHE '<location>|<command>|<log_format>' '{}' \;
依前面的分工整理。注意本機 ossec.conf 裡只看到一筆 auth.log,還是可能和 Manager 那一筆重複。重複如果來自多個 Manager 群組,要在 Manager 上整理群組設定,不要直接改 Agent 上的副本。
Remote commands are not accepted
Remote commands are not accepted from the manager. Ignoring it on the agent.conf
被拒絕的就是 Manager 下發的 /usr/local/sbin/pkg-static audit -F。檢查過指令與所屬群組後,在 Agent 的 local_internal_options.conf 設定 logcollector.remote_commands=1 並重新啟動,之後的啟動記錄就確認指令已載入,間隔 86,400 秒。
只收一般記錄檔不需要開這個選項;不要沒看指令內容,就為了消掉警告直接打開。
check_unixaudit 已棄用,找不到 cis_freebsd16.yml
The check_unixaudit option is deprecated in favor of the SCA module.
No unixaudit file: '/var/ossec/etc/shared/cis_freebsd16.yml'
移除本機舊的 system_audit 設定後,最後一次的啟動記錄就沒有再出現這個警告。其他的 Rootcheck、SCA 設定保留即可。
套件版本是 4.14.9,程式卻顯示 4.14.8
比對方式:
pkg query '%n-%v' wazuh-agent
/var/ossec/bin/wazuh-agentd -V
pkg check -s wazuh-agent
結果:
wazuh-agent-4.14.9
Wazuh v4.14.8
校驗只列出兩個檔案不符:
checksum mismatch for /var/ossec/etc/localtime
checksum mismatch for /var/ossec/etc/shared/rootkit_trojans.txt
執行檔沒有出現在校驗不符的清單裡,可見回報 4.14.8 的就是套件原本的執行檔,不是被 Manager 降版或替換過。
localtime:前面複製系統時區檔造成的,屬於預期中的變更rootkit_trojans.txt:可能是 Manager 同步更新的,光看校驗碼無法確認來源
這也代表不能假設 4.14.9 的所有安全修正都在裡面,實際的程式版本與修補內容要對照 FreeBSD ports 的來源與維護者說明。需要做版本稽核時,套件版號和執行檔回報的版本都要記錄。
Could not clean up shared directory
中途出現過這個警告,最後一次啟動記錄沒有再出現。這次沒有足夠的資訊確認原因,也沒有做權限修正。
如果持續出現,先檢查:
ls -ld /var/ossec/etc /var/ossec/etc/shared
ls -la /var/ossec/etc/shared
再核對程序的執行身分、檔案旗標、目錄權限與同步記錄。請勿直接對整個 /var/ossec 執行 chmod -R 777,也不要一律改成同一個擁有者。
安裝訊息建議刪除 pkg.conf
You may need to manually remove /usr/local/etc/pkg.conf if it is no longer needed.
這是 pkg 的通用訊息,在 pfSense 上不需要照做。這次保留原本的設定,正常更新 pfSense 官方索引即可。
同樣地,certctl 提示可以移除舊的 blacklisted 目錄,也和安裝 Wazuh 無關,這次沒有修改憑證管理的設定。
收尾與驗收清單
pkg仍是 pfSense 官方提供的版本- 一般的
pkg update只使用 pfSense 原本的套件庫 - 已核對 Agent 與 Manager 的版本相容條件
- Wazuh 五個程序正常,Manager 上顯示 Active
- 註冊金鑰已保存,沒有複製其他 Agent 的身分
- 所有
localfile路徑都存在,每個來源只有一個管理位置 - OpenVPN、登入、系統與防火牆記錄都已用新事件驗證收集
- 沒有舊式 Unix audit 與記錄來源重複的警告
/conf/config.xml的檔案完整性監控已啟用,並了解它的掃描間隔pkg audit手動執行成功;需要告警的話,已另外驗證 Manager 的解析與規則- Shellcmd 已設定,並在維護時段完成重新開機驗證
- Agent 設定、身分金鑰與 Manager 群組設定都有受控的備份
下載的套件另外保存好之後,就可以移除暫存的套件庫設定:
rm -f /tmp/wazuh-repos/FreeBSD.conf
rmdir /tmp/wazuh-repos
這不會移除已安裝的 Agent,也不會動到 pfSense 原本的套件庫設定。以後要更新 Agent,要重新評估當時的 pfSense 基底、相依套件與版本,不要直接重跑 pkg install。
結論
pfSense 本身是 FreeBSD,裝 FreeBSD 的 Wazuh Agent 看起來只是一行 pkg install,實際上卡關的地方幾乎都在套件管理:分支不存在、基底版本差異,以及 pkg 會先升級自己。最後的做法是暫存套件庫設定、先下載再從本機安裝,pfSense 原本的 pkg 與套件庫完全不動。
Agent 裝起來之後,記錄來源要先分好由本機還是 Manager 管理,否則很容易出現重複設定;pkg audit 的結果收進 Wazuh 之後,還需要另外做解析與規則,才會變成真正有用的漏洞告警。
這終究不是 Netgate 支援的方式,韌體升級後要重新確認一次。如果還在選防火牆平台,又需要接 Wazuh,OPNsense 有官方外掛,安裝與日後維護都單純得多。正式環境導入前,建議先在 VM 或備援機上照著做一遍。
參考資料
- OPNsense:Wazuh Agent 外掛
https://docs.opnsense.org/manual/wazuh-agent.html - Netgate:Using Software from FreeBSD
https://docs.netgate.com/pfsense/en/latest/recipes/freebsd-pkg-repo.html - Netgate:Working with Log Files
https://docs.netgate.com/pfsense/en/latest/monitoring/logs/manage.html - Netgate:Executing Commands at Boot
https://docs.netgate.com/pfsense/en/latest/development/boot-commands.html - FreeBSD:pkg.conf(5)
https://man.freebsd.org/cgi/man.cgi?query=pkg.conf&sektion=5 - FreeBSD:pkg-fetch(8)
https://man.freebsd.org/cgi/man.cgi?query=pkg-fetch&sektion=8 - FreeBSD 16 amd64 套件目錄
https://pkg.freebsd.org/FreeBSD:16:amd64/ - FreeBSD Ports:security/wazuh-agent
https://cgit.freebsd.org/ports/tree/security/wazuh-agent/Makefile - FreeBSD VuXML:OpenVPN denial of service(CVE-2026-84732)
https://vuxml.freebsd.org/freebsd/25012057-a886-11f1-a836-b42e991fc52e.html - Ubuntu:CVE-2026-84732
https://ubuntu.com/security/CVE-2026-84732 - Wazuh:Wazuh agent 安裝與版本相容條件
https://documentation.wazuh.com/current/installation-guide/wazuh-agent/index.html - Wazuh:Centralized configuration
https://documentation.wazuh.com/current/user-manual/reference/centralized-configuration.html - Wazuh:Using password authentication
https://documentation.wazuh.com/current/user-manual/agent/agent-enrollment/security-options/using-password-authentication.html - Wazuh:agent-auth
https://documentation.wazuh.com/current/user-manual/reference/tools/agent-auth.html - Wazuh:localfile
https://documentation.wazuh.com/current/user-manual/reference/ossec-conf/localfile.html - Wazuh:rootcheck
https://documentation.wazuh.com/current/user-manual/reference/ossec-conf/rootcheck.html



