企业级Wazuh生产部署需解耦Indexer与Manager、强制证书认证注册、适配nftables的主动响应、确保规则路径/解码器/ID完整,所有组件须明确执行身份、日志位置及回滚路径。

直接上生产环境能扛住 50+ 端点、持续告警不丢、规则可维护、响应能闭环的 Wazuh 配置,核心不在“装得全”,而在「组件解耦 + 权限收口 + 日志路径可控 + 主动响应真实生效」。All-in-One 脚本装出来的默认环境,离企业级运维差三步:索引器与 Manager 分离、Agent 注册流程强制认证、主动响应脚本必须验证 iptables/nftables 实际执行权限。
怎么让 Wazuh Indexer 和 Manager 不跑在同一台机器上
单机部署在测试阶段没问题,但企业级场景下,Indexer(即 OpenSearch)吃内存、占磁盘、写入压力大,和 Manager 共用资源会导致告警延迟甚至 ossec-analysisd 进程 OOM。必须拆开。
- 先在独立服务器(推荐 Ubuntu 24.04 或 RHEL 9)安装
wazuh-indexer,不要运行wazuh-install.sh -a—— 那是 All-in-One 的快捷方式,不是生产配置 - 编辑
/etc/wazuh-indexer/opensearch.yml,关键项必须显式设置:network.host改为监听内网 IP(如192.168.10.10),discovery.seed_hosts只填自身 IP,cluster.initial_master_nodes填node-1(与config.yml中定义一致) - Manager 侧配置
/var/ossec/etc/ossec.conf,在下加块:,并确保https://192.168.10.10:9200 指向已同步的证书/var/ossec/etc/indexer/certs/http.pem - 证书必须用
wazuh-certs-tool.sh统一生成,不能手动生成或复用 Nginx 证书 —— 否则wazuh-manager启动时会报SSL handshake failed并静默退出
为什么 wazuh-agent 注册失败总卡在 “Waiting for registration”
不是网络不通,也不是端口没开,而是默认的预共享密钥(PSK)模式在跨网段或 NAT 后失效。企业环境必须关掉 PSK,启用基于证书的注册。
- 停掉所有 Agent:
sudo systemctl stop wazuh-agent - 在 Manager 上关闭 PSK:编辑
/var/ossec/etc/ossec.conf,删掉或注释掉整个块里的和yes 行... - 启用证书认证:在
块内只保留:和/var/ossec/etc/auth/server-ca.pem yes - Agent 重装时必须带
WAZUH_MANAGER和WAZUH_AGENT_NAME,且不能用 IP 直连 —— 要用 Manager 的 FQDN(如wazuh-mgr.internal.company.com),否则证书校验失败
主动响应 firewall-drop 为什么封不了攻击 IP
因为 firewall-drop 脚本默认调用 iptables,而现代 Linux(Ubuntu 22.04+/RHEL 9+)默认用 nftables,脚本根本找不到命令,也不报错,只是静默跳过。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 确认系统实际防火墙后端:
sudo update-alternatives --list iptables,如果输出含nft,说明走的是 nftables - 修改
/var/ossec/active-response/bin/firewall-drop:把所有iptables -I INPUT替换为nft add rule inet filter input ip saddr @wazuh-blocked tcp dport {22,3389} drop(注意适配你开放的服务端口) - 创建地址集:
sudo nft add set inet filter wazuh-blocked { type ipv4_addr\; },并确保该命令在firewall-drop脚本开头执行一次 - 最关键一步:Agent 必须以 root 权限运行,且
/var/ossec/active-response/bin/下所有脚本需有+x权限,否则ossec-execd会拒绝执行
如何让自定义规则真正触发告警而不是只进日志
很多用户写了 local_rules.xml 放进 /var/ossec/etc/rules/,却看不到 Dashboard 告警,原因是没做两件事:规则 ID 未被 Manager 加载、解码器未匹配日志格式。
- 规则文件名必须以
local_开头,且 Manager 重启后要检查sudo /var/ossec/bin/ossec-control status | grep rules是否列出你的文件 - 每个
必须有唯一id(建议从 100000 开始),且必须对应一个已存在的解码器名(比如sshd、apache),不能自己瞎写 - 最常踩的坑:日志路径没在
ossec.conf的里声明 —— 比如你监控/var/log/auth.log,但没加和syslog ,那再好的规则也收不到数据/var/log/auth.log
企业级不是堆配置项,而是每一条规则、每一次响应、每一个 Agent 注册,都要能回答“它在哪执行、以谁身份执行、失败时日志打在哪、怎么快速回滚”。Wazuh 的 ossec-logcollector 和 ossec-analysisd 进程没有健康检查接口,所以必须定期 tail -f /var/ossec/logs/ossec.log | grep -E "(error|failed|denied)" —— 这才是运维的真实手感。










