1. 项目概述:为什么我们需要一个“企业安全哨兵”?
最近在帮一个朋友的公司做安全基线加固,他们之前的安全事件响应基本靠“人肉”排查日志,效率低不说,还容易遗漏关键告警。我第一时间就想到了Wazuh——这个集成了主机入侵检测(HIDS)、日志管理和安全信息与事件管理(SIEM)能力的开源平台。它就像一个7x24小时在线的企业安全哨兵,能自动分析系统日志、监控文件完整性、检测漏洞和异常行为。网上虽然有不少安装教程,但要么版本老旧,要么步骤跳跃,对于刚接触安全运维或者想快速搭建一个可用的生产环境的朋友来说,踩坑成本太高。所以,我决定结合最近在Ubuntu 22.04 LTS上的实战经验,写一份从零开始、手把手式的超详细安装指南。这份指南的目标是让你即便没有深厚的Linux或安全背景,也能跟着步骤,成功部署一个功能完整的Wazuh单节点服务器(All-in-One),并理解每一个操作背后的意图。
2. 环境准备与规划:打好地基是关键
在动手安装之前,清晰的规划和合适的环境是成功的一半。Wazuh的架构通常分为管理端(Wazuh Server)、索引端(Elastic Stack)和前端(Wazuh Dashboard),对于中小型环境或测试学习,我们采用All-in-One部署,将所有组件安装在同一台服务器上。
2.1 服务器规格与系统要求
我选择的测试环境是一台运行Ubuntu 22.04 LTS的云服务器,配置为4核CPU、8GB内存、100GB SSD硬盘。这是运行Wazuh All-in-One的最低推荐配置。内存是关键,因为Elasticsearch(Wazuh的索引和搜索引擎)比较吃内存,4GB是底线,8GB才能保证在接入少量代理后仍流畅运行Dashboard。
注意:如果你计划在生产环境监控超过50台主机,强烈建议将Elasticsearch集群与Wazuh管理端分离部署,并相应增加资源。
首先,确保系统是最新的:
sudo apt update && sudo apt upgrade -y更新完成后,建议重启一次。
2.2 关键依赖安装:构建运行环境
Wazuh的运行依赖于一些基础软件,我们需要提前安装好。
安装curl和gnupg:用于下载软件包和验证签名。
sudo apt install curl gnupg lsb-release -y安装Docker和Docker Compose(推荐方式):从Wazuh 4.3版本开始,官方强烈推荐使用Docker Compose进行部署,这能极大简化安装和管理流程,避免复杂的依赖冲突。
# 安装Docker官方GPG密钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # 设置Docker仓库 echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎 sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y # 验证安装 sudo docker run hello-world如果看到“Hello from Docker!”的输出,说明Docker安装成功。
配置非root用户运行Docker(可选但推荐):为了避免每次都要用
sudo执行docker命令,可以将当前用户加入docker组。sudo usermod -aG docker $USER操作后需要退出当前终端会话并重新登录,这个改动才会生效。
2.3 下载Wazuh安装包与配置文件
我们将使用官方提供的Docker Compose文件,这是目前最简洁、最不易出错的方式。
创建一个专用的目录来存放所有Wazuh相关文件:
mkdir ~/wazuh-docker && cd ~/wazuh-docker下载官方的最新版Docker Compose配置文件和环境变量文件:
curl -sO https://packages.wazuh.com/4.7/docker/docker-compose.yml curl -sO https://packages.wazuh.com/4.7/docker/config.env这里的
4.7是当前最新的稳定版本号,你可以随时在 Wazuh官方文档 查看最新版本并替换URL中的版本号。下载下来的
docker-compose.yml文件定义了Elasticsearch、Wazuh管理端、Wazuh索引器、Wazuh Dashboard等多个服务及其关联关系。config.env文件则包含了一些重要的配置参数,如默认密码。
3. 核心部署流程:一键启动安全中枢
有了Docker Compose文件,部署过程变得异常简单。但简单不代表不需要理解,我们一步步来。
3.1 修改默认密码(安全第一步)
在启动前,我们必须修改默认密码。用文本编辑器打开config.env文件:
nano config.env你会看到类似下面的内容,找到以WAZUH_ADMIN_PASSWORD、ELASTIC_PASSWORD等开头的行:
# Set the Wazuh API and Dashboard credentials WAZUH_API_USERNAME=wazuh-wui WAZUH_API_PASSWORD=MyS3cr37P450r.*- WAZUH_ADMIN_USERNAME=admin WAZUH_ADMIN_PASSWORD=SecretPassword # Set the Elasticsearch credentials ELASTIC_USERNAME=elastic ELASTIC_PASSWORD=SecretPassword KIBANA_USERNAME=kibana KIBANA_PASSWORD=SecretPassword LOGSTASH_USERNAME=logstash LOGSTASH_PASSWORD=SecretPassword强烈建议你将所有SecretPassword和MyS3cr37P450r.*-修改为你自己设定的、高强度的复杂密码,并妥善保存。修改后保存并退出编辑器。
3.2 启动Wazuh全家桶
在~/wazuh-docker目录下,运行以下命令启动所有服务:
sudo docker compose up -d这个-d参数代表“detached”,让服务在后台运行。执行后,Docker会开始从仓库拉取(Download)所有必要的镜像(包括Elasticsearch, Wazuh Server, Wazuh Indexer, Dashboard等),这个过程根据你的网络速度,可能需要10-30分钟。拉取完成后会自动创建并启动容器。
你可以通过以下命令查看容器启动状态和日志:
# 查看所有容器状态 sudo docker compose ps # 查看某个容器的实时日志(例如查看wazuh.manager的启动情况,按Ctrl+C退出) sudo docker compose logs -f wazuh.manager当所有容器的状态(STATE)都显示为“Up”(健康)时,说明部署成功。
3.3 验证安装与首次登录
检查服务端口:Wazuh Dashboard默认运行在
443端口(HTTPS)。确保服务器的安全组或防火墙放行了443端口(以及后续代理通信需要的1514,1515,55000等端口)。sudo ss -tulpn | grep :443访问Dashboard:打开浏览器,输入
https://你的服务器IP地址。例如https://192.168.1.100。- 重要:由于我们使用的是自签名证书,浏览器会提示“连接不安全”或“您的连接不是私密连接”。这是正常现象,在测试环境中,点击“高级”->“继续前往(不安全)”。
- 在登录界面,使用你在
config.env文件中设置的WAZUH_ADMIN_USERNAME(默认admin)和修改后的WAZUH_ADMIN_PASSWORD进行登录。
探索界面:登录成功后,你会看到Wazuh Dashboard的主界面。左侧是导航菜单,中间是安全事件、代理状态、漏洞检测等模块的仪表盘。如果能看到数据(即使初始数据很少),说明核心服务运行正常。
4. 部署第一个代理(Agent):将哨兵派往主机
Wazuh服务器(Manager)是大脑,而代理(Agent)是安装在被监控主机(如Web服务器、数据库服务器、员工电脑)上的“眼睛”和“耳朵”。没有代理,大脑就接收不到任何信息。
4.1 在Linux主机上安装代理
假设我们有一台需要被监控的、IP为192.168.1.50的Ubuntu服务器。
在Wazuh服务器上生成代理安装包:这是为了确保代理能安全地连接到指定的管理端。在Wazuh服务器(即我们刚才部署All-in-One的机器)上执行:
cd ~/wazuh-docker sudo docker compose exec wazuh.manager bash这个命令会进入
wazuh.manager容器的bash shell。在容器内生成代理安装包:
/var/ossec/bin/agent_groups -a -g default -q /var/ossec/bin/manage_agents -a 192.168.1.50 -n "My-Ubuntu-Web-Server"第一条命令确保存在一个名为
default的默认代理组。第二条命令为IP是192.168.1.50、名字是My-Ubuntu-Web-Server的代理生成一个认证密钥(Auth Key)。命令执行后会输出一串长长的密钥,形如MDAxIE15LVVidW50...,复制并保存好这串密钥,在代理安装的最后一步需要它。输入
exit退出容器。在被监控主机上安装代理:登录到
192.168.1.50这台Ubuntu服务器。- 添加Wazuh仓库并安装:
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --no-default-keyring --keyring /usr/share/keyrings/wazuh.gpg --import && echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" | sudo tee /etc/apt/sources.list.d/wazuh.list sudo apt update sudo apt install wazuh-agent- 配置代理:编辑代理配置文件,将其指向Wazuh管理服务器的IP地址。
sudo nano /var/ossec/etc/ossec.conf找到
<address>标签,将其内容修改为你的Wazuh服务器的IP地址:<ossec_config> <client> <server> <address>WAZUH_SERVER_IP</address> <!-- 替换为你的服务器IP --> <port>1514</port> <protocol>tcp</protocol> </server> ... </client> </ossec_config>- 启动代理并设置开机自启:
sudo systemctl daemon-reload sudo systemctl enable wazuh-agent sudo systemctl start wazuh-agent- 导入认证密钥:这是将代理与管理端绑定的关键一步。使用之前在管理端生成的那串密钥。
sudo /var/ossec/bin/manage_agents -i PASTE_YOUR_KEY_HERE将
PASTE_YOUR_KEY_HERE替换为你复制的密钥。成功后,重启代理服务:sudo systemctl restart wazuh-agent
4.2 在Dashboard中验证代理状态
回到Wazuh Dashboard的Web界面。
- 点击左侧导航栏的管理->代理。
- 你应该能看到一个名为
My-Ubuntu-Web-Server的代理,其状态会从Pending(等待连接)逐渐变为Active(活跃)。这可能需要一两分钟。 - 点击该代理的ID,可以查看其详细状态、收集的日志、执行的根检(Rootcheck)结果等。
至此,一个最基本的Wazuh监控系统就搭建并运行起来了。管理端在持续接收和分析来自代理的安全数据。
5. 核心功能配置与调优:让哨兵真正发挥作用
安装成功只是第一步,默认配置可能无法满足你的特定监控需求。Wazuh的强大之处在于其高度可配置性。
5.1 文件完整性监控(FIM)配置
FIM是Wazuh的杀手锏功能之一,它能监控重要文件和目录是否被篡改、删除或创建。例如,监控Web服务器的网页目录或系统的关键配置文件。
在代理端配置监控路径:编辑被监控主机(如我们的Ubuntu Web服务器)上的代理配置文件。
sudo nano /var/ossec/etc/ossec.conf在
<ossec_config>块内,找到或添加<syscheck>(系统检查)部分。添加你想要监控的目录:<syscheck> <disabled>no</disabled> <frequency>43200</frequency> <!-- 每12小时进行一次完整性扫描 --> <scan_on_start>yes</scan_on-start> <directories check_all="yes" realtime="yes">/var/www/html</directories> <!-- 监控网站根目录,启用实时监控 --> <directories check_all="yes" realtime="yes">/etc/nginx</directories> <!-- 监控Nginx配置目录 --> <ignore>/var/www/html/cache</ignore> <!-- 忽略缓存目录,减少噪音 --> </syscheck>realtime="yes":启用实时监控,任何改动会立刻告警。check_all="yes":检查文件的权限、所有者、内容(MD5/SHA1哈希值)等所有属性。ignore:忽略不需要监控的子目录,这对像cache、tmp这类频繁变动的目录非常有用,能极大减少无效告警。
保存配置后,重启代理服务:
sudo systemctl restart wazuh-agent在Dashboard查看FIM告警:当被监控目录下的文件发生变更时,在Dashboard的安全事件模块中,你会看到来自该代理的、规则ID为
550(文件添加)、553(文件删除)或554(文件修改)的告警。
5.2 日志收集与解码规则
Wazuh能解析和分析各种系统、应用日志。例如,监控SSH登录失败尝试。
确保代理收集系统日志:默认情况下,代理已经配置了收集系统日志(如
/var/log/auth.log)。你可以在代理的ossec.conf中查看<localfile>部分来确认。理解解码器和规则:Wazuh通过“解码器”将原始日志文本解析成结构化的字段,再通过“规则”匹配这些字段来生成安全事件。SSH失败登录的规则是预定义的。当你尝试用错误密码SSH登录被监控主机后,Wazuh Dashboard很快就会产生一条规则ID为
5710(SSH登录失败)的告警,并显示尝试的源IP、用户名等信息。自定义规则(进阶):如果你想监控一个特定应用的日志,比如自定义的Web应用日志,你需要编写自己的解码器和规则。这涉及到在Wazuh管理端创建
/var/ossec/etc/decoders/local_decoder.xml和/var/ossec/etc/rules/local_rules.xml文件。这是一个相对高级的话题,但官方文档提供了丰富的示例。
5.3 漏洞检测与系统审计
Wazuh集成了漏洞检测功能,能定期扫描代理主机上已安装的软件包,并与CVE(公共漏洞暴露)数据库进行比对。
- 启用漏洞检测:在代理的
ossec.conf中,确保以下部分未被禁用:<vulnerability-detector> <enabled>yes</enabled> <interval>5m</interval> <!-- 检查频率 --> <ignore_time>6h</ignore_time> <!-- 忽略已发现漏洞的时间 --> <run_on_start>yes</run_on-start> <provider name="canonical"> <enabled>yes</enabled> <os>trusty</os> <!-- 根据你的系统调整,如ubuntu, debian, rhel等 --> </provider> </vulnerability-detector> - 查看漏洞报告:在Dashboard的安全事件模块中,过滤规则ID为
87101、87102等的事件,可以看到发现的漏洞详情。更直观的方式是进入漏洞检测模块,这里会以表格形式清晰列出所有代理上发现的漏洞、严重等级和对应的CVE编号。
6. 日常运维与问题排查实录
即使安装顺利,在日常使用中也可能遇到各种问题。下面是我在维护Wazuh集群时遇到的一些典型情况及解决方法。
6.1 常见问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| Dashboard无法访问(连接被拒绝/超时) | 1. 容器未成功启动。 2. 防火墙/安全组未开放443端口。 3. Nginx(Dashboard前端)服务异常。 | 1.sudo docker compose ps检查所有容器状态是否为Up。2. sudo ufw status(如果使用UFW) 或检查云平台安全组规则,确保443端口入站开放。3. sudo docker compose logs wazuh.dashboard查看Dashboard容器日志,寻找错误信息。 |
代理状态始终为Pending或Disconnected | 1. 网络不通。 2. 代理配置的管理端IP/端口错误。 3. 认证密钥未导入或错误。 4. 管理端 1514端口未监听。 | 1. 从代理端telnet WAZUH_SERVER_IP 1514测试连通性。2. 核对代理 ossec.conf中<address>和<port>。3. 在代理端重新执行 manage_agents -i导入密钥,或在管理端容器内用manage_agents -l列出已认证代理确认。4. 在Wazuh服务器 sudo ss -tulpn | grep :1514确认端口监听。 |
| Dashboard登录后无数据,显示“No results found” | 1. Elasticsearch索引未创建或异常。 2. 代理未发送数据。 3. Wazuh索引器服务异常。 | 1. 访问https://WAZUH_SERVER_IP:9200(用ELASTIC_USERNAME和密码),检查是否有wazuh-alerts-*等索引。2. 检查代理状态是否为 Active,并查看代理日志sudo tail -f /var/ossec/logs/ossec.log。3. sudo docker compose logs wazuh.indexer查看索引器日志。 |
| 磁盘空间占用增长过快 | Elasticsearch默认保存所有数据,未设置索引生命周期管理(ILM)。 | 这是生产环境必做操作。需要在Elasticsearch中配置ILM策略,自动删除或归档旧数据。例如,只保留最近30天的热数据。具体命令需进入Elasticsearch容器执行。 |
| 收到大量重复或无意义的告警(噪音) | 监控策略过于宽松,或监控了不必要的变化(如日志文件)。 | 1. 在代理配置中合理使用<ignore>标签排除频繁变化的目录。2. 在Wazuh管理端,可以调整或禁用某些规则的级别(level),或编写例外( <rule_exclude>)。3. 在Dashboard的管理->规则中,可以查看和筛选规则,理解其触发条件。 |
6.2 性能调优与备份心得
给Elasticsearch“喂饱”内存:如果服务器内存充足(比如16GB以上),可以专门为Elasticsearch容器分配更多堆内存。修改
docker-compose.yml中elasticsearch服务的环境变量:environment: - node.name=wazuh-elasticsearch - cluster.name=wazuh-cluster - discovery.type=single-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms4g -Xmx4g" # 将堆内存初始和最大值设为4GB,根据总内存调整(通常不超过物理内存的50%) - xpack.security.enabled=true修改后需要重启服务:
sudo docker compose down && sudo docker compose up -d。定期备份关键配置:你的所有自定义规则、解码器、代理分组信息等都存储在Wazuh管理端容器内。定期备份
/var/ossec/etc目录是很好的习惯。你可以使用docker cp命令将容器内目录复制到宿主机。监控Wazuh自身:别忘了,Wazuh服务器本身也是一台需要被监控的主机。你可以在Wazuh服务器本机也安装一个Wazuh代理(指向localhost),这样就能在Dashboard里监控到Wazuh服务自身的健康状况、资源使用情况和日志,形成一个自我监控的闭环。
部署Wazuh就像为企业配备了一位不知疲倦的安全分析师。从安装到配置,每一步的深入理解都能让你在后续的运维和排错中更加从容。这份指南覆盖了从零到一的核心路径,但Wazuh的深度远不止于此,比如与外部威胁情报(TI)集成、编写复杂的自定义规则以实现自动化响应(XDR),都是值得探索的方向。最重要的是,开始用它,看着安全事件从无到有、从杂乱到有序,你会对“可见性”这个词在安全领域的分量有全新的认识。如果在配置中遇到了上面没提到的问题,多查查官方文档和社区论坛,那里有全球运维者积累的宝贵经验。