
1. 为什么我决定写这篇Wazuh安装踩坑指南如果你正在找开源的安全监控方案Wazuh的大名大概率已经听过很多遍了。它能做入侵检测、文件完整性监控、日志分析、漏洞检测还集成了SIEM和XDR能力单凭开源免费这一条就足够让很多运维和安全团队心动。我最初也是在帮客户做等保合规项目时接触Wazuh本以为按照官方文档一步步来就行结果真正动手安装才发现坑比想象中多得多。这篇文章记录的是我在裸机环境、虚拟机环境以及云主机上反复安装Wazuh后踩过和填平的坑。从硬件规划、系统初始化、仓库配置到索引器Indexer、管理器Manager、仪表板Dashboard的部署再到Agent接入和常见故障排查我把能踩的坑都替你踩了一遍。如果你正打算部署Wazuh或者已经装上但遇到了各种莫名其妙的问题这篇文章应该能帮你省下好几个通宵。先说明一下我的环境基线操作系统是Rocky Linux 9.3Wazuh版本为4.7.x采用all-in-one单机部署模式仅部署核心服务Agent端走标准安装流程。我尽量把所有命令和配置写清楚方便你直接对照操作。2. 装Wazuh之前先把架构和版本选型搞清楚2.1 Wazuh全家桶到底包含哪几个组件很多人一上来就执行安装命令对Wazuh的组件构成缺乏基本概念结果出了错连日志都不知道去哪里看。Wazuh 4.x的核心组件主要有三个Wazuh Indexer底层基于OpenSearch负责存储和索引所有安全事件数据对外提供RESTful API供查询。你可以把它理解成整个系统的心脏数据全在这儿。Wazuh Server由Manager进程管理、规则匹配、告警生成和Filebeat把Manager产生的告警数据转发到Indexer两部分组成。它负责接收Agent上报的数据进行实时分析。Wazuh Dashboard基于OpenSearch Dashboards二次开发的可视化界面你通过浏览器看到的所有仪表盘、告警详情、Agent管理页面都是它渲染出来的。如果采用分布式部署还会拆出Wazuh Agent作为终端数据采集器单独装在被监控的服务器上。Agent本身不带任何规则库所有规则匹配都在Server端完成。选型时先想清楚你的规模。节点数量少于50台、对高可用没有硬性要求的话all-in-one单机部署完全够用如果Agent数量在200台以上或者你对数据可靠性有要求就得考虑Indexer集群加Manager集群的分布式方案了。我第一次部署就吃了贪大的亏明明只有20台服务器要监控非要用三节点集群结果配置不当Indexer集群起不来白白折腾了两天。2.2 版本选择背后的关键考量Wazuh版本更新速度很快小版本几乎每个月都有迭代。安装时选择哪个版本直接关系到后续升级和插件兼容性。官方安装助手默认拉取最新稳定版比如当前是4.7.x。如果你生产环境有其他组件依赖建议指定版本安装比如curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh这里把路径中的4.7换成你需要的版本号即可。要注意版本号路径和安装脚本内部默认使用的版本必须一致否则可能出现安装助手下载了A版本的包但配置文件按B版本生成的尴尬情况。另外提醒一点CentOS 7虽然还能安装Wazuh 4.7但底层OpenSearch对操作系统glibc版本有要求CentOS 7上跑Wazuh 4.x性能表现并不好而且后续可能不再支持。能用Rocky Linux 9、Ubuntu 22.04这些现代系统就尽量别用老系统了。2.3 硬件规划不达标安装一半就翻车Wazuh官方给出的硬件建议是all-in-one部署最低4核CPU、8GB内存、50GB磁盘生产环境建议8核、16GB内存、100GB以上磁盘。以我的实测经验这些数字不是拍脑袋定的Wazuh Indexer启动阶段会一次性加载大量索引分片到内存8GB内存的机器装完启动后可用内存常常只剩下几百MB。如果你实在拿不出大内存机器至少保证swap空间足够大。我在2核4GB的云主机上装过一次特意分配了4GB swap虽然能跑起来但Dashboard打开页面明显卡顿查询告警时响应时间在3秒以上。所以建议低于8GB内存的机器要么加配置要么老老实实放弃all-in-one拆成独立组件部署到不同机器上。磁盘方面除了系统盘至少留50GBIndexer数据目录和日志目录最好单独挂载磁盘。Wazuh的日志增长速度远超你想象尤其是开启了FIM文件完整性监控之后一台生产服务器一天产生500MB到1GB的日志很正常。数据目录如果不独立系统盘被写满是迟早的事。3. 初始化环境的细节决定了你后面能少踩多少坑3.1 主机名、hosts解析和时区同步Wazuh安装助手在生成证书时会把主机名写入证书的subject字段。这意味着如果你安装完成后再去修改主机名Indexer之间的HTTPS通信会因为证书主机名不匹配直接报错。所以装之前先确定好最终使用的主机名hostnamectl set-hostname wazuh-server echo 192.168.1.100 wazuh-server /etc/hosts如果有多台节点所有节点上的hosts文件都要写上所有节点的IP和主机名映射否则集群节点之间互相找不到对方。时区同步这块容易被忽视。Wazuh告警时间戳默认使用UTC如果系统时区不一致你通过Dashboard筛选时间范围时会发现告警时间和实际时间差了8个小时定位问题时会很痛苦。建议统一设置时区并启用NTPtimedatectl set-timezone Asia/Shanghai systemctl enable --now chronyd3.2 开放防火墙端口别让服务之间互相“失联”Wazuh各组件之间通信端口比较多安装前最好一次性放行。我习惯用firewalld管理端口规则不只是因为Rocky Linux默认装了firewalld更重要的是它比iptables直观出问题的时候排查规则也方便。按all-in-one部署场景需要放行的端口如下端口服务用途443/TCPWazuh DashboardWeb管理界面1514/TCP、UDPWazuh AgentAgent远程syslog上报1515/TCPWazuh ManagerAgent注册服务1516/TCPWazuh ManagerAgent主动响应通道55000/TCPWazuh ManagerWazuh API9200/TCPWazuh IndexerRESTful API数据查询9300/TCPWazuh Indexer集群节点间通信具体执行命令firewall-cmd --permanent --add-port443/tcp firewall-cmd --permanent --add-port1514/tcp firewall-cmd --permanent --add-port1514/udp firewall-cmd --permanent --add-port1515/tcp firewall-cmd --permanent --add-port1516/tcp firewall-cmd --permanent --add-port55000/tcp firewall-cmd --permanent --add-port9200/tcp firewall-cmd --permanent --add-port9300/tcp firewall-cmd --reload这里有个坑如果你之前自己装过Elasticsearch或者OpenSearch注意9200和9300端口可能已被占用。Wazuh Indexer启动时如果发现端口在监听状态会直接报“Address already in use”并退出。检查端口占用可以用ss -lntp | grep -E 9200|9300如果占用进程是你之前的老服务果断先停掉或者换端口如果查下来没进程但端口仍在监听多半是socket处于TIME_WAIT状态等几分钟再启动Indexer通常就好了。3.3 关闭SELinux或者学会正确配置它SELinux是个让很多安装教程头疼的东西。Wazuh官方安装脚本本身并不强制要求关闭SELinux但Filebeat和Indexer在SELinux enforcing模式下经常会因为文件上下文不对而启动失败。我实测过在enforcing模式下用包管理器安装Wazuh组件Indexer服务能起来但Filebeat偶尔会因为无法读取某个配置文件而报Permission denied。如果你是安全敏感场景不打算关SELinux最稳妥的方法是安装完Wazuh后用audit2allow工具根据审计日志生成对应的SELinux策略模块并加载。但说实话这个操作比较繁琐对多数中小团队来说性价比不高。我个人建议是在实验环境或内网环境直接 禁用SELinuxsed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config reboot重启后确认状态getenforce输出应为Disabled。注意只执行setenforce 0临时关闭是不够的重启后SELinux会恢复enforcing到时候你又得排查一遍。修改配置文件是必须的。4. 动手安装Wazuh全过程以及我在哪个环节差点崩溃4.1 用官方安装助手还是手动逐步安装Wazuh提供两种安装方式官方安装助手wazuh-install.sh和手动逐步安装。第一次部署的话强烈建议用官方安装助手它能自动完成证书生成、组件安装、配置文件初始化、服务启动这一整套流程大大降低出错概率。手动逐步安装适合需要对每个组件做深度定制的场景比如要求把Indexer数据目录改到特定路径或者客户端证书走了自建CA体系。诚实的说我最初用官方安装助手也踩了不少坑但对比后来在某台机器上手动安装的经历官方助手真香。手动安装所有组件差不多要敲100多条命令任何一步路径写错、参数漏了排错的时间都是几何级数上升的。安装助手下载方式curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh chmod x wazuh-install.sh4.2 生成配置文件阶段要注意的仓库问题安装助手执行--generate-config-files参数时会先尝试从官方YUM仓库拉取一些元数据。如果你所在网络环境无法直接访问官方仓库比如在国内服务器上这一步会卡很久然后报超时。我当时的处理方式是配置国内镜像源cat /etc/yum.repos.d/wazuh.repo EOF [wazuh] gpgcheck1 gpgkeyhttps://packages.wazuh.com/key/GPG-KEY-WAZUH enabled1 nameWAZUH OSSEC Repository baseurlhttps://mirrors.aliyun.com/wazuh/yum/ EOF如果你没有可用的国内镜像也可以直接用官方源但建议把下载超时时间调大echo timeout120 /etc/yum.repos.d/wazuh.repo4.3 正式安装命令与内部逻辑生成配置文件之后正式安装只需要一条命令bash wazuh-install.sh --install安装助手会依次做这些事情检查系统环境和依赖包。安装Wazuh Indexer加载初始安全配置启动服务。安装Wazuh Manager和Filebeat配置Filebeat证书使其与Indexer建立信任连接并把Manager告警输出传给Indexer。安装Wazuh Dashboard配置它与Indexer的通信、设置初始管理员账号。这个过程耗时取决于网络和硬件性能通常在5到15分钟之间。如果一切顺利最后看到Installation completed字样并会在/etc/wazuh-dashboard/certs、/etc/wazuh-indexer/certs、/etc/filebeat/certs下生成对应的证书文件。安装完成后终端会输出Wazuh Dashboard的访问地址和初始管理员密码。这个密码务必立刻保存到一个安全的地方。我遇到不少同学装完顺手把终端清掉事后想登录发现密码忘了只能去重置。4.4 模块级安装方式适合个别组件需要重装如果只想重装某一个组件比如Dashboard安装助手也支持bash wazuh-install.sh --install dashboard同理Indexer和Manager也支持单独指定。注意如果单独重装某个节点证书文件不会重新生成而是沿用安装助手生成的现有证书。有些同学重装完发现组件之间连不上第一反应是去重新生成证书这是不对的。正确做法是检查对应目录下证书文件是否还在、权限是否正确。4.5 Agent接入的正确姿势Dashboard装好后你还需要把Agent安装到被监控的主机上。Agent安装脚本官方提供了简化方式curl -s https://packages.wazuh.com/4.7/wazuh-agent.sh | bash -s -- -a -i Wazuh-Manager-IP这条命令会自动安装Agent并注册到Manager。如果Agent和Manager之间网络不通或者Agent的注册请求被防火墙拦截了你会看到Agent在Dashboard上一直处于disconnected状态。此时先检查1515端口是否可达telnet Manager-IP 1515另外Agent注册成功后会拿到一个随机的代理名称在Dashboard的Agents页面能看到新节点自动出现。如果Agent最终状态显示为Active说明整个链路——Agent到Manager再到Indexer再到Dashboard——已经打通了。5. 升级、卸载和备份这些“隐藏关卡”同样要学会5.1 升级Wazuh的正确顺序和注意事项Wazuh升级的顺序是先升级Indexer集群再升级Manager/Server最后升级DashboardAgent可以在任意时间升级但要尽早。升级前务必做好索引快照备份。Indexer的数据如果丢了告警历史全没了那种感觉比系统宕机还难受。官方提供了索引快照的创建方式curl -k -X PUT https://localhost:9200/_snapshot/wazuh-snapshot-repo/snapshot_$(date %Y%m%d) -u admin:密码 -H Content-Type: application/json -d { type: fs, settings: { location: /var/backups/wazuh } }升级命令基本就是重新下载对应新版本的安装助手然后执行--upgrade参数。但这里有个坑如果跨了大版本升级比如从4.5升到4.7证书、索引映射、Dashboard插件可能都不兼容。官方文档给出的路径是逐版本升级4.5先升4.6再升4.7跳版本后出现诡异问题我不负责。这条规则本身就是教训。5.2 卸载Wazuh组件要干净否则重装全是问题卸载比安装更容易踩坑。有些同学装到一半失败直接rm -rf相关目录然后在同一台机器上重新安装结果安装助手检测到残留的配置或证书文件直接报错退出。官方提供的卸载方式是bash wazuh-install.sh --uninstall但注意这个卸载命令不一定会删除所有数据目录。为了彻底干净我通常还会手动删除这些路径rm -rf /var/lib/wazuh-indexer rm -rf /var/lib/wazuh-dashboard rm -rf /var/lib/filebeat rm -rf /etc/wazuh-* rm -rf /var/ossec同时清理包管理器的缓存yum clean all清理完再检查一下系统里是否还有残留进程ps -ef | grep -E wazuh|filebeat|opensearch有的话用kill命令终止。这一步做完再重新安装才能保证是在一个干净的环境里。5.3 日常备份清单出事故时能救命Wazuh日常运维至少应该定期备份以下内容/etc/wazuh-indexer下的配置文件和数据快照。/etc/wazuh-manager下的ossec.conf、rules、decoders目录。/etc/filebeat/filebeat.yml。/etc/wazuh-dashboard/opensearch_dashboards.yml和证书目录。Wazuh Manager的API用户和Dashboard的admin账号密码信息。我之前吃过一次亏Manager的ossec.conf里自定义了一堆规则重装系统后没有备份几周心血直接归零。从那以后我都是把这些配置打包放到独立备份服务器上每周自动拉取一次。6. 安装过程中踩过的典型坑与排查思路6.1 索引器启动失败十次里有八次是内存不足Wazuh Indexer基于Java启动时需要向操作系统申请大量堆内存。如果你机器内存只有4GB默认的JVM堆配置可能会超过物理内存导致进程直接OOM或被OOM Killer杀掉。这时去查Indexer日志journalctl -u wazuh-indexer -n 100 --no-pager常见的关键错误是OpenSearchException: Not enough memory或java.lang.OutOfMemoryError。解决办法是调整Indexer的JVM堆大小vi /etc/wazuh-indexer/jvm.options找到-Xms和-Xmx参数设置为系统物理内存的50%左右但不要超过8GB。比如8GB内存机器设置为4G-Xms4g -Xmx4g改完重启systemctl restart wazuh-indexer这里还有一个隐藏坑JVM配置完毕后确认一下/etc/sysctl.conf中的vm.max_map_count是否满足要求。OpenSearch要求这个值至少为262144否则会报max virtual memory areas vm.max_map_count [65530] is too low错误。临时设置sysctl -w vm.max_map_count262144永久生效echo vm.max_map_count262144 /etc/sysctl.conf6.2 证书相关错误多半是主机名/节点名对不上证书错误在Wazuh安装中非常常见典型表现是Indexer启动失败日志里出现OpenSearchException[Error while initializing transport SSL layer]或者Filebeat无法连上Indexer日志报x509: certificate is valid for wazuh-indexer, not for localhost这都是因为安装助手生成证书时把主机名写进了证书的CN及SAN字段。如果你机器的主机名和生成配置时的节点名不一致或者你用了IP地址访问但证书里只有主机名就会出这种问题。最彻底的解决办法是重新生成证书。实际操作中我会先把Wazuh相关服务全部停止清理掉/etc下的证书目录然后重新执行bash wazuh-install.sh --generate-config-files bash wazuh-install.sh --install这里和前面说到的“单独重装不要重新生成证书”要注意区别当证书本身出错需要重建时重新生成是唯一出路。6.3 Filebeat连不上Indexer90%是output配置问题Filebeat配置文件在/etc/filebeat/filebeat.yml它负责把Wazuh Manager产生的告警事件投递到Indexer。如果Filebeat日志中反复出现connection refused先检查Indexer的9200端口是否监听、防火墙是否放行然后再检查配置文件中的hosts指向output.elasticsearch: hosts: - 127.0.0.1:9200如果你改了Indexer的监听地址这里也要同步修改。Filebeat和Indexer之间使用HTTPS加密通信ssl配置段里的证书路径如果填错同样会导致连接失败。检查ssl.certificate_authorities: - /etc/filebeat/certs/ca.pem ssl.certificate: /etc/filebeat/certs/filebeat.pem ssl.key: /etc/filebeat/certs/filebeat-key.pem证书文件是否存在可以用ls确认权限问题也不容忽视。Filebeat进程以root运行但出于最小权限考虑官方建议证书目录权限为750。6.4 Dashboard页面一直转圈检查索引模式Dashboard能打开但页面上的索引数据或仪表盘一直加载不出来多半是Dashboard的索引模式Index Pattern没有正确初始化。这种情况发生在手动安装或者配置被改动过的情况下。打开Dashboard进入Stack Management找到Index Patterns确认是否存在名为wazuh-alerts-*的索引模式。如果没有手动创建一个然后重新加载Dashboard页面。如果有了还是不行在Dev Tools里执行GET _cat/indices?v看看是否有wazuh-alerts-*相关的索引存在。如果索引不存在说明Filebeat到Indexer的数据链路上还有问题优先排查Filebeat日志。6.5 常见问题速查表我把安装过程中可能遇到的高频问题整理成了表格方便对照排查症状可能原因排查/解决方式wazuh-indexer启动失败JVM堆过大/内存不足检查jvm.options调整-Xms/-Xmxvm.max_map_count报错内核参数未满足要求执行sysctl -w vm.max_map_count262144Filebeat连接被拒绝端口未放行/IP配置错误检查9200端口和filebeat.yml中的hosts证书报错主机名不匹配、证书缺失清空证书目录后重新生成Dashboard无法登录密码遗忘重置admin密码或查看安装日志找回初始密码Agent显示disconnectedAgent注册失败或1515端口不通telnet测试1515端口检查Agent配置磁盘空间爆满索引数据增长过快清理索引快照、调整ILM策略、定期清理旧索引这张表只覆盖了高频问题实际场景中还会遇到各种组合坑比如多个问题叠加出现。排查时记住一个原则从下往上查先把Indexer服务弄健康再查Manager/Filebeat最后查Dashboard。这条路径定位问题会快很多。7. 最后几条实在话安装Wazuh本质上不算难难点在于它是一个由多个组件拼起来的系统任何一个环节配置不对都会让你误以为整个系统有问题。我自己的体会是遇到问题不要急着重装先冷静下来看日志。Wazuh每个组件的日志都在/var/log下对应目录里Indexer日志、Manager日志、Filebeat日志、Dashboard日志每个都是独立的顺着日志追线索比盲目重装高效得多。另外如果你的环境是内网离线环境安装前务必把Wazuh的RPM包、依赖包提前下载好离线安装又是一个大坑后续有机会我再专门写一篇。最后再提醒一句安装完成后第一时间修改Dashboard的默认管理员密码并启用HTTPS访问。日志和告警里可能包含敏感信息安全产品的自身安全同样不能放松。