1. 部署前先把架构和版本想清楚
Wazuh 这四个字,在开源安全监控圈子里基本属于绕不开的存在。它本质上是一套 SIEM 加 XDR 的平台,核心能力是日志分析、入侵检测、文件完整性监控、漏洞检测和合规检查。很多人第一次接触它,是被“开源免费”这几个字吸引进来的,但真正动手装的时候才发现,这玩意儿不是 apt install 一下就能跑的,它由好几个组件拼成,任何一个环节没对齐,后面就是连环报错。
我在生产环境里部署过至少三套 Wazuh,也帮朋友救过好几台被他折腾到半死的测试机,可以负责任地说:安装 Wazuh 的坑,一半在环境,一半在架构理解。你要是上来就急着复制官方一键脚本,大概率会遇到安装完看不了数据、dashboard 白屏、agent 一直显示 disconnected 这些经典问题。
开始动手前,先把下面这几个问题搞清楚,能帮你省下至少半天排查时间。
1.1 四个核心组件到底干了什么
Wazuh 整体分成四块:Wazuh indexer、Wazuh server、Wazuh dashboard、Wazuh agent。
Wazuh indexer 负责存储和检索数据,它是基于 OpenSearch 做的,底层是 Lucene 那套东西,你可以理解成整个平台的数据库和搜索引擎。Wazuh server 包含两个关键子组件:一个是 wazuh-manager,负责接收 agent 上报的数据、做分析和告警;另一个是 Filebeat,它把 manager 处理后的数据转发给 indexer。Wazuh dashboard 就是那个网页控制台,基于 OpenSearch Dashboards 改的,用来查日志、看告警、管理 agent。Wazuh agent 是需要部署在被监控主机上的轻量客户端,采集系统日志、文件变化、配置信息后发送给 manager。
这四个组件不是互相独立的,它们的依赖关系是:agent -> manager -> Filebeat -> indexer,dashboard 负责把 indexer 里的数据展示出来,同时通过 API 去管理 manager。
很多人装完以后发现 agent 显示 active 但看不到任何告警,问题往往出在 Filebeat 到 indexer 这条链路上,要么是模板没加载,要么是证书不匹配,后面我会细说。
1.2 单机还是分布式:别上来就装全家桶
如果你是在学习测试,或者监控的主机数量在十台以内,我建议用单机模式,把所有组件装在一台机器上,省事也够用。但要注意,这里的“单机”指的是逻辑上的单机部署,不是让你把各个组件当作独立进程随便往系统里塞,而是建议直接用官方准备的 all-in-one 安装方式,让脚本帮你把每个组件的配置和证书都理顺。
如果你是要做生产环境,或者被监控的主机超过二十台,那就老老实实做分布式:indexer 至少三节点,manager 和 dashboard 可以共用一台,agent 按需分发。这么做是为了保证 indexer 的可用性,Wazuh 默认把 indexer 的数据副本数设成 1,单节点挂了数据就没了。
还有个很多人忽略的点:Wazuh 新版本里 manager 和 dashboard 的通信走的是 TCP 55000 端口,这个和早期版本不一样,很多老教程还在写 55000 是 UDP,照着配完你会发现 dashboard 上永远提示无法连接 manager API。
2. 环境准备阶段最容易翻车的细节
这一节我可以说是用血泪教训换来的经验。官方文档对系统要求写得很简单,但实际操作中你会发现,很多问题不是因为软件装错,而是底层环境没铺垫好。
2.1 系统版本和内存别拍脑袋定
Wazuh 官方支持的主流 Linux 发行版包括 CentOS 7/8、RHEL 7/8/9、Ubuntu 16.04/18.04/20.04/22.04、Amazon Linux 2 等。我建议你直接选 Ubuntu 22.04 或者 Rocky Linux 9,这两个系统在兼容性和包源更新上都比较稳,网上遇到问题也更容易搜到答案。
内存是最大的门槛。Wazuh indexer 默认分配的 JVM 堆内存是 1GB,如果是 all-in-one 部署,manager 和 dashboard 还要再吃掉一部分,实际测下来 4GB 内存的机器跑完整套全家桶会非常吃力,indexer 很容易因为内存不足被系统 OOM killer 杀掉。我的建议是学习环境至少 8GB 内存,生产环境 16GB 起步。
硬盘方面需要注意,Wazuh 默认把 OpenSearch 的数据存在 /var/lib/wazuh-indexer,日志存在 /var/ossec/logs,这两个目录会持续增长。如果监控的是 Windows 机器并且开启了 Sysmon 日志采集,一天几个 GB 很正常,最好单独给 /var 或者这两个目录做分区,避免日志把根分区塞满。
2.2 时间同步、hosts 解析和防火墙先搞定
这三个东西看着不起眼,但任何一个出问题都能让你怀疑人生。
时间不同步最典型的症状是:agent 注册成功、数据也在往 manager 发,但在 dashboard 里查不到任何告警,或者告警时间漂移得离谱。因为 Wazuh 在做时间比对和索引的时候依赖系统时钟,客户端和服务端时间差太大会导致数据写入异常。装之前先确认 NTP 或者 chrony 已经配好,保证各节点时间一致。
hosts 解析也很重要。如果你的 indexer 和 dashboard 装在同一台机器上,至少要保证本机 hostname 能解析到本机 IP,尤其是 dashboard 访问 indexer 的时候,它用的是安装时生成的内部域名。我遇到过一次把 hostname 写错,dashboard 一直报 getaddrinfo ENOTFOUND,查了一下午才发现是 /etc/hosts 少了一行。
防火墙方面,如果是学习环境图省事,可以直接关掉 firewalld 或者 ufw,但生产环境千万不要关,要按组件之间的通信关系放行端口。我把常用端口整理成一张表,方便你参考:
| 端口 | 协议 | 用途 |
|---|---|---|
| 55000 | TCP | agent 到 manager 的注册和通信 |
| 1514 | UDP/TCP | agent 事件上报(新版默认 TCP) |
| 1515 | TCP | agent 自动注册 |
| 443 | TCP | dashboard 网页访问 |
| 9200 | TCP | indexer REST API |
| 9300 | TCP | indexer 节点间通信 |
防火墙规则要双向考虑,比如 agent 能连 manager,manager 也要能访问 agent 的 1514 端口,很多人只配了入站规则忽略出站,结果 agent 一直连不上。
3. 安装执行阶段的核心步骤与坑点
接下来进入正题。Wazuh 的安装方式有两种:官方脚本一键安装和手动分步安装。官方脚本适合标准环境,速度快;手动安装适合需要自定义的场景,也更容易排查问题。我这里两个都说,重点讲手动安装里那些配置细节。
3.1 官方脚本安装:适合标准环境快速上手
官方提供了一键安装脚本,4.x 系列的脚本路径是 https://packages.wazuh.com/4.7/wazuh-install.sh,版本号需要对应你下载的版本。
使用方式很简单:
curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh bash wazuh-install.sh --generate-config-files执行完--generate-config-files后,会在当前目录生成一个wazuh-install-files.tar.gz,这个压缩包里包含了所有组件需要的证书、密码等敏感信息。这个压缩包一定要保存好,后面装哪个组件都要用到它。
接着执行:
bash wazuh-install.sh --install-type all-in-one脚本会自动把所有组件装好,最后会输出 dashboard 的访问地址和初始账号密码。
这个脚本看起来省事,但有几个坑:
第一,脚本执行过程中会修改系统的一些配置,比如关闭 swap(具体来说是 indexer 的 JVM 会配置内存锁定)。如果你的机器内存不够,indexer 启动会报memory locking requested for opensearch process but memory is not enough之类的错误。
第二,脚本默认从官方仓库下载包,在国内网络环境下,下载速度慢到让人崩溃,而且容易中断。我建议在跑脚本之前先把官方仓库源替换成可用的镜像源,这个后面单独说。
第三,脚本执行到后期会配置 dashboard 的初始化密码,如果系统对密码复杂度有限制,或者你输入的密码太短,会卡在密码校验这一步。
3.2 手动分步安装:每个组件一次搞明白
如果你已经能通过官方脚本跑通,可以跳过这一节。但如果你跟我一样喜欢掌控每个环节,或者你需要在离线环境部署,那手动分步安装是必须掌握的。
手动安装的顺序是:indexer -> manager -> Filebeat -> dashboard。
第一步,安装和配置 Wazuh indexer。
先添加官方仓库:
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import && chmod 644 /usr/share/keyrings/wazuh.gpg echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | tee /etc/apt/sources.list.d/wazuh.list apt update注意这里用到了[signed-by=...]的写法,这是新版本推荐的方式,防止仓库 key 冲突。旧教程喜欢直接把 key 放到/etc/apt/trusted.gpg.d/,在 Ubuntu 22.04 上会报Key is stored in legacy trusted.gpg keyring的警告,虽然不影响安装,但看着闹心。
安装完成以后要改配置文件/etc/wazuh-indexer/opensearch.yml,核心参数是:
network.host: 0.0.0.0 discovery.type: single-node plugins.security.disabled: false如果配置文件中没有discovery.type: single-node,indexer 会去找其他节点做集群发现,找不到就起不来,启动日志里会一直刷master_not_discovered_exception。
然后需要把之前生成的证书解压,放到/etc/wazuh-indexer/下,并设置权限:
tar -xzf wazuh-install-files.tar.gz cp wazuh-install-files/wazuh-indexer/* /etc/wazuh-indexer/ chown -R wazuh-indexer:wazuh-indexer /etc/wazuh-indexer/启动前还要确认 JVM 堆内存配置,文件在/etc/wazuh-indexer/jvm.options,默认-Xms1g和-Xmx1g,如果机器内存只有 4GB,建议改成 2g,但总堆内存不要超过物理内存的一半,否则系统会卡死。
第二步,安装和配置 Wazuh manager。
manager 是相对容易装的,因为它基本不需要调什么花哨的配置。同样先添加仓库,然后:
apt install wazuh-manager安装完以后需要确认/var/ossec/etc/ossec.conf里<remote>配置的端口和协议。4.x 版本默认是:
<remote> <port>1514</port> <protocol>tcp</protocol> </remote>如果这里写的是 UDP,而 agent 那边默认用的 TCP,两边就连不上,agent 状态会一直是 disconnected。我自己遇到过在测试机上两边协议不一致,排查了好久才发现。
另外要注意/var/ossec/etc/ossec.conf文件权限,安装完成以后,这个目录的所有者应该是ossec用户。之前碰到有人手动改过配置导致文件属主变成 root,manager 启动时会报Permission denied,重启服务也救不回来。
第三步,安装和配置 Filebeat。
Filebeat 的作用前面说过,是把 manager 处理后的数据转发给 indexer。安装完成后,要把证书和配置文件准备好:
apt install filebeat cp wazuh-install-files/filebeat/* /etc/filebeat/这里注意一个细节:wazuh-install-files.tar.gz里已经包含了 Filebeat 的配置文件filebeat.yml,但里面只有证书路径和 output 的地址,你需要手动确认 indexer 的地址是对的。默认生成的配置里写的是https://wazuh-indexer:9200,如果你的 indexer 没有配置对应的 hostname 解析,Filebeat 会一直连接失败。
启动 Filebeat 前,要先把 Wazuh 自带的索引模板加载进去:
filebeat setup --index-management这个命令会把wazuh开头的索引模板写入 indexer,如果没有执行这一步,manager 产生的告警和事件在 dashboard 里可能搜不到,因为 indexer 不知道该怎么索引这些数据。
第四步,安装和配置 Dashboard。
apt install wazuh-dashboardDashboard 的配置核心在/etc/wazuh-dashboard/opensearch_dashboards.yml,主要改两个地方:server.host改成0.0.0.0才能远程访问,opensearch.hosts指向 indexer 地址。
另一个容易被忽略的地方是 dashboard 访问 indexer 时的证书校验。Dashboard 的配置文件里会有opensearch.ssl.certificateAuthorities等参数,如果不把 CA 证书路径填对,dashboard 启动后能访问,但页面里看不到任何数据,打开 F12 会看到unable to verify first certificate的报错。
Dashboard 启动以后,需要去 dashboard 的配置界面把 manager 的 API 地址加进去。这一步如果不是在网页上操作而是在初始安装时配置的,要注意 API 的主机地址不要填 localhost,要填实际 IP,否则 agent 显示的注册信息可能会错乱。
3.3 国内环境下把仓库源换成镜像源
这一节单独拎出来说,是因为我自己在这上面浪费过太多时间。Wazuh 官方仓库在海外,直接下载包确实太慢了,尤其是 Filebeat 这种几十 MB 的包。
国内可用的加速方式有几种:一种是修改/etc/apt/sources.list.d/wazuh.list里的仓库地址,指向镜像源;另一种是在安装前把官方仓库的包下载下来做成离线包,再拷贝到目标机器安装。
我自己用下来比较顺手的是替换仓库源,具体做法是把packages.wazuh.com替换成可用的代理或镜像地址,比如用开源的 ghproxy 类工具代理下载脚本,或者在 /etc/hosts 里把域名指向可达的 IP。如果你用的云服务器有内网镜像源,也可以把 Wazuh 仓库包手动下载后dpkg -i安装。
需要注意,替换源以后要验证 key 是否还能用,否则 apt 会报Signature verification failed。解决方法是先把官方 key 导入,再修改源,顺序不要反。
4. 常见报错与排查技巧实录
以下这些坑,基本覆盖了安装和日常运维中最常遇到的问题。我会把现象、排查步骤和解决方式都写出来,建议你收藏备用。
4.1 indexer 启动失败:内存锁定与 JVM 配置
现象:执行systemctl start wazuh-indexer后,服务状态一直显示 failed,查看日志/var/log/wazuh-indexer/wazuh-indexer.log发现下面这类错误:
[1] bootstrap checks failed memory locking requested for opensearch process but memory is not enough这个报错含义是 indexer 需要锁住内存,但系统满足不了。解决方式有两种:
一种是把/etc/wazuh-indexer/opensearch.yml里的bootstrap.memory_lock: true改成false,并注释掉/etc/wazuh-indexer/jvm.options里的-XX:+UseLargePages相关配置。这种方法简单,但生产环境不建议长期开着。
另一种更治本的方式是调大系统限制,修改/etc/security/limits.conf:
wazuh-indexer soft memlock unlimited wazuh-indexer hard memlock unlimited然后重启。如果还是不行,多半是物理内存确实不够,老老实实用第一种方式关掉内存锁。
4.2 dashboard 白屏或打不开
如果你能访问 dashboard 的 443 端口,但页面一直加载不出来,或者登录后整个界面是空的,通常有两类原因。
第一类是 dashboard 内部的服务没完全启动。执行systemctl status wazuh-dashboard看状态,如果显示 active (running) 但还是白屏,就去看/var/log/wazuh-dashboard/下的日志,常见报错是Saving the configuration of the wazuh API时连不上 manager。这时候要去 dashboard 的“ Settings -> Wazuh API” 里检查 API 地址和端口,确认是否能从 dashboard 机器访问 manager 的 55000 端口。
第二类是证书问题。如果日志里有unable to verify first certificate,多半是 dashboard 在连接 indexer 时,CA 证书路径没配好或者证书过期。回到/etc/wazuh-dashboard/opensearch_dashboards.yml确认证书路径,并且确保证书文件权限是运行 dashboard 的用户能读取的。
4.3 agent 连接显示 active,但没有事件数据
这个问题在测试环境出现得最多。agent 安装完以后,dashboard 上能看到状态是 active,但点进 agent 详情页,事件列表是空的。
排查思路按这条链路来:agent -> manager -> Filebeat -> indexer -> dashboard。
先在 agent 上检查连通性:
/var/ossec/bin/agent_control -l如果这个命令能看到 agent 在线,说明 agent 到 manager 没问题。接着去 manager 上看有没有事件进来:
/var/ossec/bin/wazuh-logtest或者直接查看 manager 的日志/var/ossec/logs/alerts/alerts.json,如果里面有内容,说明事件已经产生。
再往下来看 Filebeat 是否正常输出,执行:
filebeat test output如果对应的 indexer 地址和证书没问题,会返回连接成功。如果这里报错,多半是之前提到的索引模板没加载,重新执行filebeat setup --index-management。
还有一个很容易被忽略的点:agent 默认开启了日志采集,但有些系统上/var/log/auth.log不存在(比如某些精简版系统),这时候 agent 采集不到任何内容,但不会报错。可以先在 agent 上手动往系统日志里写一条测试数据,看是否能在 dashboard 上搜到。
4.4 密码不对、插件异常、版本不一致
Wazuh 在 4.x 里使用了预置密码机制,所有组件的访问密码都记录在安装时生成的wazuh-passwords.txt文件里。如果你改过密码又忘了,或者安装完成后把文件弄丢了,可以用下面的方式重置 indexer 的 admin 密码:
/usr/share/wazuh-indexer/plugins/opensearch-security/tools/wazuh-passwords-tool.sh -u admin -p '新密码'这个工具是官方自带的,对 indexer、dashboard、Filebeat 等组件的密码重置都有效。
版本不一致的问题也很常见。Wazuh manager 是 4.5,Filebeat 是 4.4,dashboard 是 4.6,这种混搭版本在部分接口上会出现兼容性问题。建议所有组件保持同一个大版本,比如都装 4.7.3,不要盲目追新,也不要图省事装旧的。
4.5 完全卸载后重装,残留配置导致新环境出错
很多人习惯把装坏的 Wazuh 卸载了再重装一遍,但卸载不干净的话,新的实例会继承旧的配置,反而更难排查。
比较稳妥的卸载流程是:
systemctl stop wazuh-manager wazuh-indexer wazuh-dashboard filebeat apt purge wazuh-manager wazuh-indexer wazuh-dashboard filebeat -y rm -rf /var/ossec /var/lib/wazuh-indexer /etc/wazuh-indexer /etc/wazuh-dashboard /etc/filebeat /var/log/wazuh-indexer /var/log/wazuh-dashboard只要把这些残留目录清掉,重装一次基本就是干净状态。这里注意/var/lib/wazuh-indexer里存了旧的索引数据,不清掉的话重装后 dashboard 上看到的还是旧数据,容易造成混淆。
5. 安装完以后要做的三件收尾事
很多人装完看到 dashboard 能登录就撒手不管了,等到真正用的时候才发现一堆问题。我建议你在安装完成以后,按下面这几步做一遍收尾验证。
第一,确认所有服务都设成开机自启:
systemctl enable wazuh-manager systemctl enable wazuh-indexer systemctl enable wazuh-dashboard systemctl enable filebeat第二,把 Wazuh 自带的 SCA 安全配置评估和漏洞检测模块打开。默认情况下,这几项检测的周期比较长,你可以先去/var/ossec/etc/ossec.conf里确认有没有<wodle name="syscollector">和<vulnerability-detector>相关的配置,根据自己的需要调整扫描周期。
第三,把第一台 agent 装上,验证从采集到展示的完整链路通不通。这也是我对所有新环境的要求:任何部署都从一台 agent 开始验证,别一次性批量推几百台,到出了问题的时候根本不知道去哪查。
接着再分享一个我自己的习惯:Wazuh 的告警默认是写日志文件,不会主动发短信或者推送通知。如果你希望有实时告警,可以配置它的集成功能,把告警输出到企业微信、钉钉或者 Slack。配置方法不复杂,核心是修改/var/ossec/etc/ossec.conf里的<integration>标签,把 webhook 地址填进去就行。这个我在第一次配置的时候踩过坑,后来发现一个问题:如果 webhook 地址填错,Wazuh 不会报错,只是静默地把告警丢弃。所以配置完以后一定要先触发一条测试告警,确认通知真的能收到再收工。
Wazuh 的安装过程说难也难,说简单也简单。我个人的感觉是,绝大多数问题都出在组件之间通信的细节上,而不是平台本身多复杂。只要按照 indexer -> manager -> Filebeat -> dashboard 的顺序,把证书、端口、内存、权限这几个方面一一核对清楚,一次成功的概率很高。如果你部署过程中卡在哪一步,先从组件日志入手看,尽量不要靠猜,日志文件会把真实原因告诉你。