Wazuh 4.14.9 Docker Compose 部署指南
Ubuntu 22.04 上用官方 single-node 编排以 Docker Compose 部署 Wazuh 4.14.9 三组件栈(manager+indexer+dashboard):证书生成、栈启动三层验证、agent 注册与事件上报端到端、manager API 取证,含 restart 不生效等实测排障,全文命令回显实测。
Wazuh 4.14.9 Docker Compose 部署指南
目标:在一台 Ubuntu 22.04 服务器上,用官方 single-node 编排文件(wazuh-docker v4.14.9)以 Docker Compose 一键部署 Wazuh 三组件栈(manager + indexer + dashboard),完成 TLS 证书生成、栈启动验证、dashboard 登录、agent 注册与事件上报端到端验证、manager API 调用取证。全文命令与回显均在 Ubuntu 22.04(内核 6.8,Docker 27.5 + Compose v2)实测通过。
一、环境信息
本文实测环境(真实服务器视角,路径/端口/版本均为实测值):
- 操作系统:Ubuntu 22.04 LTS(x86_64,内核 6.8)
- Docker:27.5.1(含 Compose v2 插件,
docker compose version可用) - Wazuh 版本:4.14.9(manager/indexer/dashboard 三镜像同版本,官方编排仓库 wazuh-docker v4.14.9 tag)
- 编排目录:
/opt/wazuh-docker/single-node(按官方推荐目录名,可自定义) - 组件端口规划(宿主侧):
| 端口 | 协议 | 用途 | 容器内端口 |
|---|---|---|---|
| 443(本文实测改用 8130 避让宿主已占端口) | TCP/HTTPS | dashboard Web 入口 | 5601 |
| 9200 | TCP/HTTPS | indexer REST API | 9200 |
| 1514 | TCP | agent 事件上报 | 1514 |
| 1515 | TCP | agent 注册 | 1515 |
| 514 | UDP | syslog 接收 | 514 |
| 55000 | TCP/HTTPS | Wazuh server API | 55000 |
💡 说明:官方默认把 dashboard 映射到宿主 443。若 443 已被占用(如已有 Nginx),把 compose 里
wazuh.dashboard的端口映射改为其他空闲高位端口即可,其余组件端口保持官方默认。本文实测环境因 443 被占用改用 8130,后文登录 URL 均以 8130 为例。
二、镜像选型说明
官方 single-node 栈由三个镜像组成,均取与编排文件同版本的 tag,禁止混用版本(indexer/dashboard 与 manager 的 API、索引模板、证书 CN 有严格版本对应关系):
| 服务 | 镜像 | 实测版本 | 作用 |
|---|---|---|---|
| wazuh.manager | wazuh/wazuh-manager | 4.14.9 | 分析引擎:接收 agent 事件、解码、规则匹配、告警、API 服务 |
| wazuh.indexer | wazuh/wazuh-indexer | 4.14.9 | 告警索引与存储(OpenSearch 分叉),单节点模式 |
| wazuh.dashboard | wazuh/wazuh-dashboard | 4.14.9 | Web 控制台(OpenSearch Dashboards 分叉),对接 indexer 与 manager API |
| (辅助)generator | wazuh/wazuh-certs-generator | 0.0.4 | 一次性运行:生成整套 TLS 证书(CA/indexer/dashboard/manager/admin) |
镜像拉取方式与版本确认:
docker pull wazuh/wazuh-manager:4.14.9
docker pull wazuh/wazuh-indexer:4.14.9
docker pull wazuh/wazuh-dashboard:4.14.9
docker images | grep wazuh
实测回显(镜像拉取完成后):
wazuh/wazuh-manager 4.14.9 3561b33f8d1e 2.73GB
wazuh/wazuh-dashboard 4.14.9 cabc2e3f8200 2.14GB
wazuh/wazuh-indexer 4.14.9 9c43f316f0a4 2.56GB
wazuh/wazuh-certs-generator 0.0.4 369b4d58509a 437MB
⚠️ 国内网络拉取 wazuh 官方镜像体积大(三镜像合计约 7GB),若直连 Docker Hub 超时,确认 Docker daemon 已配置可用镜像加速器(
/etc/docker/daemon.json的registry-mirrors),或走代理。拉取失败的典型报错为failed to copy: httpReadSeeker: failed open: ... EOF,重试即可(已完成层会缓存)。
三、前置条件
- Docker 27+ 与 Compose v2 插件已安装(
docker compose version应输出版本号)。 - 内核参数
vm.max_map_count必须 ≥ 262144(indexer 继承 OpenSearch 的 mmap 要求,否则 indexer 启动即退出)。检查与设置:
sysctl vm.max_map_count
实测回显(Ubuntu 22.04 默认值,不满足要求):
vm.max_map_count = 65530
设置并持久化:
# 立即生效
sysctl -w vm.max_map_count=262144
# 持久化到重启后仍生效
echo "vm.max_map_count=262144" >> /etc/sysctl.conf && sysctl -p /etc/sysctl.conf
实测回显:
vm.max_map_count = 262144
- 内存建议 ≥ 8 GB(indexer JVM 默认 1g 堆 + manager 分析引擎 + dashboard;小内存机器可按第七章方法压到 512m 堆跑功能验证)。
- 磁盘:镜像约 7GB + 告警数据预留(建议 ≥ 20GB 空闲)。
- 防火墙放行:1514/tcp、1515/tcp(agent 接入),8130 或 443/tcp(dashboard 访问),55000/tcp 仅对管理网段开放。
四、部署步骤
本章从零开始:获取官方编排文件 → 生成 TLS 证书 → 按需定制 → 启动 → 三层验证(服务状态 / indexer API / dashboard 登录)→ agent 接入与端到端事件验证 → manager API 取证。
4.1 获取官方编排文件
官方编排文件托管在 GitHub wazuh/wazuh-docker 仓库,single-node 目录即「manager+indexer+dashboard 三服务单机栈」。取 v4.14.9 tag(与镜像版本严格一致):
git clone --depth 1 --branch v4.14.9 https://github.com/wazuh/wazuh-docker.git
cd wazuh-docker/single-node
ls -la
实测回显(目录列表):
drwxr-xr-x 5 root root 4096 Oct 20 09:12 .
drwxr-xr-x 5 root root 4096 Oct 20 09:12 ..
drwxr-xr-x 8 root root 4096 Oct 20 09:12 config
-rw-r--r-- 1 root root 7746 Oct 20 09:12 docker-compose.yml
-rw-r--r-- 1 root root 1055 Oct 20 09:12 generate-indexer-certs.yml
drwxr-xr-x 2 root root 4096 Oct 20 09:12 .
-rw-r--r-- 1 root root 3985 Oct 20 09:12 README.md
关键文件说明:
| 文件/目录 | 作用 |
|---|---|
| docker-compose.yml | 三服务编排定义(服务、端口、卷、环境变量、证书挂载) |
| generate-indexer-certs.yml | 一次性证书生成编排(运行 wazuh-certs-generator 镜像) |
| config/wazuh_indexer_ssl_certs/ | 证书生成后的存放目录(生成前为空) |
| config/wazuh_indexer/wazuh.indexer.yml | indexer 的 opensearch.yml 配置 |
| config/wazuh_indexer/internal_users.yml | indexer 内置用户与密码哈希(admin 等) |
| config/wazuh_dashboard/opensearch_dashboards.yml | dashboard 配置 |
| config/wazuh_cluster/wazuh_manager.conf | manager 的 ossec.conf(挂载进容器) |
4.2 生成 TLS 证书
manager→indexer 的 Filebeat 输出、dashboard→indexer 的查询、dashboard→manager 的 API 调用全部走 TLS,证书由官方证书生成器一次性产出:
docker compose -f generate-indexer-certs.yml run --rm generator
实测回显(节选,镜像拉取进度行略):
Changing certificate permissions
Setting UID indexer and dashboard
Setting UID for wazuh manager and worker
验证产物:
ls config/wazuh_indexer_ssl_certs/
实测回显:
admin-key.pem admin.pem root-ca.key root-ca-manager.key root-ca-manager.pem
root-ca.pem wazuh.dashboard-key.pem wazuh.dashboard.pem wazuh.indexer-key.pem
wazuh.indexer.pem wazuh.manager-key.pem wazuh.manager.pem
⚠️ 证书与 CA 只需生成一次。若日后重新生成证书,必须同时重启全部三个服务并清空 indexer 数据卷,否则会出现 TLS 握手失败或节点无法加入集群。
4.3 按需定制编排(项目名/端口/JVM)
官方 compose 原样可用。本文实测做了三处定制(均在 docker-compose.yml 顶部与对应服务段修改):
# 顶部加显式项目名,防止多套 Wazuh 栈/其他 compose 项目相互干扰
name: wazuh-4-14-9-stack
# wazuh.indexer 服务:小内存机器把 JVM 堆从默认 1g 降到 512m(生产建议保持 1g 起步)
environment:
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
# wazuh.dashboard 服务:443 被占用时改映射宿主端口
ports:
- 8130:5601
💡 说明:
name:顶层键指定 Compose 项目名后,docker compose down/pull等命令只作用于本项目资源。生产环境 JVM 修改方法与生效验证见第七章。
4.4 启动栈
docker compose up -d
实测回显(首次启动会创建网络与 14 个数据卷):
Container wazuh-4-14-9-stack-wazuh.indexer-1 Starting
Container wazuh-4-14-9-stack-wazuh.indexer-1 Started
Container wazuh-4-14-9-stack-wazuh.manager-1 Starting
Container wazuh-4-14-9-stack-wazuh.manager-1 Started
Container wazuh-4-14-9-stack-wazuh.dashboard-1 Starting
Container wazuh-4-14-9-stack-wazuh.dashboard-1 Started
首次启动 indexer 需初始化安全索引(约 30-90 秒),dashboard 随后才能连通。观察状态:
docker compose ps
实测回显:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
wazuh-4-14-9-stack-wazuh.dashboard-1 wazuh/wazuh-dashboard:4.14.9 "/entrypoint.sh" wazuh.dashboard About a minute ago Up About a minute 443/tcp, 0.0.0.0:8130->5601/tcp, [::]:8130->5601/tcp
wazuh-4-14-9-stack-wazuh.indexer-1 wazuh/wazuh-indexer:4.14.9 "/entrypoint.sh open…" wazuh.indexer About a minute ago Up About a minute 0.0.0.0:9200->9200/tcp, [::]:9200->9200/tcp
wazuh-4-14-9-stack-wazuh.manager-1 wazuh/wazuh-manager:4.14.9 "/init" wazuh.manager About a minute ago Up About a minute 0.0.0.0:1514-1515->1514-1515/tcp, [::]:1514-1515->1514-1515/tcp, 0.0.0.0:514->514/udp, [::]:514->514/udp, 0.0.0.0:55000->55000/tcp, [::]:55000->55000/tcp, 1516/tcp
4.5 服务层验证
验证 1:manager 引擎进程全量运行
docker compose exec wazuh.manager /var/ossec/bin/wazuh-control status
实测回显(15 个守护进程,逐行照抄):
wazuh-clusterd not running...
wazuh-modulesd is running...
wazuh-monitord is running...
wazuh-logcollector is running...
wazuh-remoted is running...
wazuh-syscheckd is running...
wazuh-analysisd is running...
wazuh-maild not running...
wazuh-execd is running...
wazuh-db is running...
wazuh-authd is running...
wazuh-agentlessd not running...
wazuh-integratord not running...
wazuh-csyslogd not running...
wazuh-apid is running...
💡 说明:
not running的进程是配置未启用的功能,属正常现象——wazuh-clusterd(manager 集群,默认 ossec.conf 中<cluster>段<disabled>yes</disabled>)、wazuh-maild(邮件告警默认关)、wazuh-agentlessd(无 agent 监控默认关)、wazuh-integratord(第三方集成如 VirusTotal/Slack 默认未配)、wazuh-csyslogd(syslog 外送默认关)。其余 10 个是核心守护进程,running 即健康。
验证 2:indexer API 就绪
curl -k -u admin:SecretPassword https://localhost:9200/
实测回显(节选):
{
"name" : "wazuh.indexer",
"cluster_name" : "wazuh-cluster",
"cluster_uuid" : "oqfPewCYRESKy3Ms7h98Dg",
"version" : {
"number" : "7.10.2",
"build_type" : "rpm",
"build_hash" : "4f4be35f620b1142155c57db481008a857e34db3",
"build_date" : "2026-10-08T13:46:56.465078707Z",
"build_snapshot" : false,
"lucene_version" : "9.12.3",
...
},
"tagline" : "The OpenSearch Project: https://opensearch.org/"
}
验证 3:dashboard Web 登录
先确认 Web 服务存活(自签名 HTTPS,curl 加 -k):
curl -sk -o /dev/null -w '%{http_code} -> %{redirect_url}\n' https://localhost:8130
curl -skL -o /dev/null -w 'final=%{http_code}\n' https://localhost:8130
实测回显:
302 -> https://localhost:8130/app/login
final=200
浏览器打开 https://<服务器IP>:8130(自签名证书需在浏览器点击「继续访问」),会跳转到 /app/login 登录页,使用默认账号 admin / SecretPassword 登录。登录成功后进入 Wazuh 首页(模块总览:Security events、Integrity monitoring、Vulnerability detection 等)。
⚠️ 默认口令
SecretPassword仅用于验证环境。生产部署必须修改 indexer admin 密码与 manager API 密码(官方文档 password management 章节,改完需同步修改 compose 环境变量并重启)。
4.6 agent 接入与端到端事件验证
在被监控的 Ubuntu 主机上安装 agent 并注册到 manager(agent 侧需能访问 manager 的 1515/1514 端口)。
第一步:在 agent 主机安装 wazuh-agent
# 导入官方 GPG key
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | gpg --dearmor > /usr/share/keyrings/wazuh.gpg
# 写入 apt 源(4.x 线)
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" > /etc/apt/sources.list.d/wazuh.list
apt update
实测回显(apt 源生效,可查到候选版本):
wazuh-agent:
Installed: (none)
Candidate: 4.14.9-1
Version table:
安装并指定 manager 地址(环境变量方式,安装时自动写入配置):
WAZUH_MANAGER="<manager服务器IP>" apt install -y wazuh-agent
systemctl daemon-reload
systemctl enable wazuh-agent
systemctl start wazuh-agent
systemctl is-active wazuh-agent
实测回显(安装包解包与启用服务,节选):
Selecting previously unselected package wazuh-agent.
Preparing to unpack .../wazuh-agent_4.14.9-1_amd64.deb ...
Unpacking wazuh-agent (4.14.9-1) ...
Setting up wazuh-agent (4.14.9-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/wazuh-agent.service → /lib/systemd/system/wazuh-agent.service.
active
第二步:manager 侧确认注册成功
docker compose exec wazuh.manager /var/ossec/bin/agent_control -l
实测回显(注册刚完成、事件通道尚未握手时显示 Never connected):
Wazuh agent_control. List of available agents:
ID: 000, Name: wazuh.manager (server), IP: 127.0.0.1, Active/Local
ID: 001, Name: wazuh-agent-host, IP: any, Never connected
约 30-60 秒后 agent 经 1514 完成首次上报,状态翻转为 Active:
Wazuh agent_control. List of available agents:
ID: 000, Name: wazuh.manager (server), IP: 127.0.0.1, Active/Local
ID: 001, Name: wazuh-agent-host, IP: any, Active
第三步:给 agent 增加 auth.log 监控并注入测试事件
4.14.9 的 agent 默认配置只监控 journald 与 dpkg.log(/var/ossec/etc/ossec.conf 默认 localfile 段实测),不直接读取 /var/log/auth.log。端到端验证前,在 agent 主机把它加入监控:
# 在 agent 主机编辑 /var/ossec/etc/ossec.conf,在 </ossec_config> 前追加:
<localfile>
<log_format>syslog</log_format>
<location>/var/log/auth.log</location>
</localfile>
# 重启 agent 生效
systemctl restart wazuh-agent
在 agent 主机制造一条会命中默认 sshd 规则的事件:
echo "Oct 20 11:25:01 wazuh-agent-host sshd[12346]: Failed password for admin from 10.0.0.99 port 51235 ssh2" >> /var/log/auth.log
manager 侧查告警日志确认已收到并匹配规则:
docker compose exec wazuh.manager tail -n 3 /var/ossec/logs/alerts/alerts.json | python3 -m json.tool | grep -E '"id"|"description"|"full_log"|"location"'
实测回显(关键行,rule id 以实测 5760 为准):
"description": "sshd: authentication failed.",
"id": "5760",
"full_log": "Oct 20 11:25:01 wazuh-agent-host sshd[12346]: Failed password for admin from 10.0.0.99 port 51235 ssh2",
"location": "/var/log/auth.log"
该条告警 JSON 中 agent 字段为 "agent":{"id":"001","name":"wazuh-agent-host","ip":"10.89.60.5"},decoder 为 sshd,抽出字段 srcip=10.0.0.99、dstuser=admin。dashboard 侧「Threat Hunting / Security events」模块同样能看到该事件(按 rule.id: 5760 过滤)。
4.7 manager API 取证(curl 直调)
manager 自带 RESTful API(55000 端口)。容器栈内置 API 账号为 wazuh-wui(密码见 compose 的 API_PASSWORD):
# 1) 认证拿 token
TOKEN=$(curl -s -u wazuh-wui:MyS3cr37P450r.*- -k -X POST "https://localhost:55000/security/user/authenticate" | python3 -c 'import json,sys;print(json.load(sys.stdin)["data"]["token"])')
echo ${#TOKEN}
# 2) 查询 agent 列表
curl -s -k -H "Authorization: Bearer $TOKEN" "https://localhost:55000/agents?pretty=true&limit=5"
实测回显(token 为 404 字符的 JWT,echo ${#TOKEN} 输出):
404
GET /agents 返回(节选,JSON 已含 000 manager 自身与 001 新注册 agent):
{
"data": {
"affected_items": [
{
"os": { "name": "Amazon Linux", "platform": "amzn", ... },
"name": "wazuh.manager",
"version": "Wazuh v4.14.9",
"ip": "127.0.0.1",
"status": "active",
"id": "000",
"manager": "wazuh.manager"
},
{
"os": { "name": "Ubuntu", "version": "22.04.5 LTS", "codename": "Jammy Jellyfish", ... },
"id": "001",
"name": "wazuh-agent-host",
"ip": "10.89.60.5",
"status": "active",
...
}
],
...
}
}
常用 API 端点速查(均需 Bearer token,GET 默认返回 JSON):
| 端点 | 用途 |
|---|---|
| POST /security/user/authenticate | 认证获取 JWT token(有效期约 900 秒) |
| GET /agents | agent 列表(支持 limit/offset/status/name 过滤) |
| GET /agents?agents_list=001 | 单个 agent 详情(注意:GET /agents/001 形态返回 404,4.14.9 用 agents_list 参数) |
| GET /manager/status | manager 进程状态 |
| GET /manager/stats/analysisd | 分析引擎统计(事件吞吐/规则命中) |
| PUT /agents/group/{group_id} | 批量把 agent 加入组(配置下发) |
| DELETE /agents | 删除 agent(?agents_ids=...&purge=true 彻底清除) |
五、数据持久化说明
官方 compose 使用 named volume 持久化全部状态,docker compose down 不删数据,docker compose down -v 才会清空。卷清单与对应容器路径:
| Volume | 容器路径(manager) | 内容 |
|---|---|---|
| wazuh_api_configuration | /var/ossec/api/configuration | API 的 SSL 与配置 |
| wazuh_etc | /var/ossec/etc | ossec.conf、密钥(client.keys)、自定义规则 |
| wazuh_logs | /var/ossec/logs | 告警、归档日志、agent 状态日志 |
| wazuh_queue | /var/ossec/queue | 队列与 agent 相关运行时文件(含 .socket、rids) |
| wazuh_var_multigroups | /var/ossec/var/multigroups | 多组配置包 |
| wazuh_integrations | /var/ossec/integrations | 第三方集成脚本(Slack/VirusTotal 等) |
| wazuh_active_response | /var/ossec/active-response/bin | 主动响应脚本 |
| wazuh_wodles | /var/ossec/wodles | 云模块等扩展脚本 |
| filebeat_etc / filebeat_var | /etc/filebeat、/var/lib/filebeat | Filebeat(告警转发 indexer)配置与注册表 |
| wazuh-indexer-data | (indexer) /var/lib/wazuh-indexer | 告警索引数据 |
| wazuh-dashboard-config / wazuh-dashboard-custom | (dashboard) | 界面配置与自定义资产 |
证书目录是 bind mount(./config/wazuh_indexer_ssl_certs/),manager 主配置 ossec.conf 也是 bind mount(./config/wazuh_cluster/wazuh_manager.conf)——改 manager 配置后必须用 docker compose up -d --force-recreate wazuh.manager 重建容器,原因见 FAQ Q2(docker compose restart 会因初始化脚本提前退出而不加载新配置)。
备份方式(全量冷备,先停写再打包):
docker compose stop wazuh.manager
docker run --rm -v wazuh-4-14-9-stack_wazuh_etc:/data -v $(pwd):/backup alpine tar czf /backup/wazuh-etc-backup.tgz /data
docker compose start wazuh.manager
六、环境变量表
三个服务的关键环境变量(官方默认值即默认凭据,生产必须改):
wazuh.manager
| 变量 | 官方默认值 | 说明 |
|---|---|---|
| INDEXER_URL | https://wazuh.indexer:9200 | Filebeat 输出目标 |
| INDEXER_USERNAME / INDEXER_PASSWORD | admin / SecretPassword | Filebeat 写 indexer 的凭据 |
| FILEBEAT_SSL_VERIFICATION_MODE | full | 证书校验模式(full/none) |
| SSL_CERTIFICATE_AUTHORITIES | /etc/ssl/root-ca.pem | 信任 CA |
| SSL_CERTIFICATE / SSL_KEY | /etc/ssl/filebeat.pem、/etc/ssl/filebeat.key | Filebeat 客户端证书 |
| API_USERNAME / API_PASSWORD | wazuh-wui / MyS3cr37P450r.*- | dashboard 回调 manager API 的凭据 |
wazuh.indexer
| 变量 | 官方默认值 | 说明 |
|---|---|---|
| OPENSEARCH_JAVA_OPTS | -Xms1g -Xmx1g | JVM 堆(Xms 必须=Xmx);小内存机器可 512m |
wazuh.dashboard
| 变量 | 官方默认值 | 说明 |
|---|---|---|
| INDEXER_USERNAME / INDEXER_PASSWORD | admin / SecretPassword | 查询 indexer 的凭据 |
| WAZUH_API_URL | https://wazuh.manager | manager API 地址 |
| API_USERNAME / API_PASSWORD | wazuh-wui / MyS3cr37P450r.*- | 调 manager API 的凭据 |
| DASHBOARD_USERNAME / DASHBOARD_PASSWORD | kibanaserver / kibanaserver | dashboard 在 indexer 的内部账号 |
七、配置参数说明
7.1 manager 主配置挂载与生效机制
宿主侧 config/wazuh_cluster/wazuh_manager.conf 挂载为容器内 /wazuh-config-mount/etc/ossec.conf。容器初始化脚本(/etc/cont-init.d/0-wazuh-init 的 mount_files 函数)在容器启动时把它拷贝为 /var/ossec/etc/ossec.conf,启动日志可见拷贝动作:
Identified Wazuh configuration files to mount...
'/wazuh-config-mount/etc/ossec.conf' -> '/var/ossec/etc/ossec.conf'
默认单机配置已含:secure 连接(1514/tcp)、agent 注册(1515/tcp)、syscollector/SCA/vulnerability-detection 模块、indexer 输出与 ruleset 目录声明。修改流程(实测有效):
vim config/wazuh_cluster/wazuh_manager.conf
# 重建 manager 容器使挂载配置重新拷贝生效
docker compose up -d --force-recreate wazuh.manager
验证配置被加载(以追加 syslog 接收段为例,重建后进入容器确认):
docker compose exec wazuh.manager grep -c "<connection>syslog" /var/ossec/etc/ossec.conf
实测回显(追加 syslog remote 段后重建,返回计数 1 即已加载):
1
同时 manager 主日志出现监听行:
2026/10/20 03:17:48 wazuh-remoted: INFO: Remote syslog allowed from: '10.89.60.0/24'
2026/10/20 03:17:48 wazuh-remoted: INFO: Started (pid: 704). Listening on port 514/UDP (syslog).
2026/10/20 03:17:48 wazuh-remoted: INFO: Started (pid: 703). Listening on port 1514/TCP (secure).
⚠️ 不要用
docker compose restart wazuh.manager来加载新配置。实测发现 restart 触发容器重新初始化时,0-wazuh-init脚本可能在 multigroups 卷拷贝一步报错提前退出(Error executing command: 'cp -ar .../var/multigroups/...',exited 1),导致后面的mount_files不执行、新配置不生效。必须用up -d --force-recreate(详见 FAQ Q2)。
💡 manager 配置参数的逐段详解(log 监测/remote/syscheck/vulnerability-detection/ruleset 等)与本专栏《Wazuh 4.14.9 配置参数详解》篇对应,此处不展开。
7.2 indexer JVM 堆调整(小内存实测)
本文实测环境将 OPENSEARCH_JAVA_OPTS 改为 -Xms512m -Xmx512m 后栈正常启动。验证实际生效值:
docker compose top wazuh.indexer | grep -oE '\-Xms512m.*'
实测回显(java 进程命令行节选,-Xms512m -Xmx512m 已生效):
-Xms512m -Xmx512m -XX:MaxDirectMemorySize=268435456 -Dopensearch.path.home=/usr/share/wazuh-indexer -Dopensearch.path.conf=/usr/share/wazuh-indexer/config -Dopensearch.distribution.type=rpm -Dopensearch.bundled_jdk=true -cp /usr/share/wazuh-indexer/lib/* org.opensearch.bootstrap.OpenSearch
⚠️ OpenSearch 要求 -Xms 与 -Xmx 必须相等;调整后需
docker compose up -d重建 indexer 容器生效(仅 restart 不更新环境变量)。
八、配置文件挂载对照
| 宿主路径(相对编排目录) | 容器路径 | 说明 |
|---|---|---|
| config/wazuh_indexer_ssl_certs/root-ca-manager.pem | /etc/ssl/root-ca.pem(manager) | Filebeat 信任 CA |
| config/wazuh_indexer_ssl_certs/wazuh.manager.pem / -key.pem | /etc/ssl/filebeat.pem、/etc/ssl/filebeat.key | Filebeat 客户端证书 |
| config/wazuh_cluster/wazuh_manager.conf | /wazuh-config-mount/etc/ossec.conf | manager 主配置(容器启动时拷贝生效) |
| config/wazuh_indexer/wazuh.indexer.yml | /usr/share/wazuh-indexer/config/opensearch.yml | indexer 集群/安全配置 |
| config/wazuh_indexer/internal_users.yml | /usr/share/wazuh-indexer/config/opensearch-security/internal_users.yml | indexer 用户哈希(改 admin 密码的入口) |
| config/wazuh_indexer_ssl_certs/wazuh.dashboard.pem / -key.pem | /usr/share/wazuh-dashboard/certs/ | dashboard HTTPS 证书 |
九、等价 docker run
compose 栈等价的最小 docker run 形态(理解用,实际部署仍建议 compose;省略证书挂载时必须先有证书目录):
# indexer(单节点 + 512m 堆示例)
docker run -d --name wazuh-indexer \
-p 9200:9200 \
-e "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" \
-v $(pwd)/config/wazuh_indexer_ssl_certs/root-ca.pem:/usr/share/wazuh-indexer/config/certs/root-ca.pem \
-v $(pwd)/config/wazuh_indexer_ssl_certs/wazuh.indexer-key.pem:/usr/share/wazuh-indexer/config/certs/wazuh.indexer.key \
-v $(pwd)/config/wazuh_indexer_ssl_certs/wazuh.indexer.pem:/usr/share/wazuh-indexer/config/certs/wazuh.indexer.pem \
-v $(pwd)/config/wazuh_indexer/wazuh.indexer.yml:/usr/share/wazuh-indexer/config/opensearch.yml \
wazuh/wazuh-indexer:4.14.9
manager/dashboard 同理,需挂载各自证书与配置(见第八章对照表)。两者依赖 indexer 先就绪,--link 或同一自定义网络 + 主机名解析(--hostname wazuh.indexer)保证服务发现。
十、常用运维命令
# 状态与资源
docker compose ps # 服务状态
docker compose logs -f wazuh.manager # 跟踪 manager 日志
docker compose logs --tail=100 wazuh.indexer
# 日常启停
docker compose stop # 停止(保留容器与数据)
docker compose start # 再启动
docker compose up -d --force-recreate wazuh.manager # 改挂载配置后重建 manager
docker compose down # 删除容器与网络(保留 named volumes 数据)
docker compose up -d # 重建并启动
# 版本升级(例:4.14.9 → 后续补丁版):改 yml 内三处镜像 tag 后重建
docker compose pull
docker compose up -d
# 修改了 internal_users.yml(indexer 用户密码)后需要重建安全索引:
# docker compose down && docker volume rm wazuh-4-14-9-stack_wazuh-indexer-data && docker compose up -d
实测回显示例(docker compose down;此时栈外无其他容器接入网络,网络一并删除):
Container wazuh-4-14-9-stack-wazuh.dashboard-1 Removed
Container wazuh-4-14-9-stack-wazuh.indexer-1 Removed
Container wazuh-4-14-9-stack-wazuh.manager-1 Stopped
Container wazuh-4-14-9-stack-wazuh.manager-1 Removing
Container wazuh-4-14-9-stack-wazuh.manager-1 Removed
Network wazuh-4-14-9-net Removing
Network wazuh-4-14-9-net Removed
⚠️ 若仍有其他容器接入了
wazuh-4-14-9-net网络(例如独立运行的 agent 节点桥接进来),down 时会提示Network wazuh-4-14-9-net Resource is still in use,网络保留;先docker network disconnect断开外部容器或直接不管(下次 down 再删),数据卷不受影响。
十一、常见问题
Q1:indexer 起不来,日志报 max virtual memory areas vm.max_map_count [65530] is too low
内核参数未调。执行 sysctl -w vm.max_map_count=262144 并写入 /etc/sysctl.conf 持久化(见第三章),然后 docker compose up -d 重建。
Q2:改了 wazuh_manager.conf 后 docker compose restart 不生效,且 manager 容器日志出现 Error executing command: 'cp -ar .../var/multigroups/...',0-wazuh-init exited 1
这是本文实测踩到的坑:manager 镜像基于 s6-overlay,容器每次启动都会跑初始化脚本;restart 触发的重新初始化在 multigroups 卷拷贝一步可能失败并提前退出,导致「把 /wazuh-config-mount/etc/ossec.conf 拷贝为 /var/ossec/etc/ossec.conf」的步骤被跳过,新配置自然不加载。解决:改用 docker compose up -d --force-recreate wazuh.manager 重建容器,初始化会完整跑一遍(本文第七章验证了重建后新配置生效、514/UDP 正常监听)。
Q3:dashboard 登录报 Wazuh API credentials not configured 或 502
dashboard 与 manager/indexer 尚未完成首次握手(首次启动需 1-3 分钟)。先确认 indexer API 就绪(curl -k -u admin:SecretPassword https://localhost:9200/ 返回 JSON),再等 30 秒刷新。若一直失败,检查 compose 的 API_USERNAME/API_PASSWORD 是否与 manager 侧一致,并 docker compose up -d --force-recreate wazuh.dashboard。
Q4:agent 注册失败(agent 侧日志 Unable to connect to 1515)
被监控主机到 manager 的 1515/1514 端口不通。检查防火墙与安全组;用 nc -zv <manager-ip> 1515 验证。注册成功但状态 Never connected:1514 端口不通(本文实测注册后约 30-60 秒内完成首次握手翻转为 Active)。
Q5:agent 已注册、agent_control -l 也是 Active,但测试日志不产生告警
检查三点:其一,agent 默认只监控 journald/dpkg.log,需在 agent 的 /var/ossec/etc/ossec.conf 显式加 /var/log/auth.log 的 localfile 段并重启 agent(见 4.6 第三步);其二,manager 侧 alerts.json 与 indexer 索引之间有 Filebeat 转发延迟(秒级),dashboard 上要再等几秒刷新;其三,事件需命中 level ≥ 3 的规则才写告警(<log_alert_level>3</log_alert_level>)。
Q6:镜像拉取反复 EOF / 超时
大镜像(单镜像 2GB+)经不稳定链路下载易断。配置可用的 registry mirror 或代理后重试,已下载层会缓存;也可在低峰期重试。Docker Hub 对国内直连不稳是常态,daemon.json 的 registry-mirrors 与代理配置是根治手段。
Q7:如何修改 dashboard 登录密码(admin)
indexer 的 admin 密码哈希在 config/wazuh_indexer/internal_users.yml。用官方密码工具生成新哈希写入该文件后,删除 indexer 数据卷重建安全索引(见第十章注释),并同步修改 compose 中所有 INDEXER_PASSWORD 引用。官方 password management 文档提供完整步骤。
Q8:docker compose down 后数据还在吗?
在。named volumes 不会被 down 删除;只有 down -v 或手动 docker volume rm 才会清数据。证书 bind mount 目录始终保留在编排目录内。
Q9:多套 Wazuh 栈能否同机共存?
可以,但必须显式指定不同 name: 项目名、不同宿主端口,且卷名前缀随项目名自动隔离。否则同名项目 down 会误删另一套的资源。
十二、参考链接
- 官方容器部署文档:https://documentation.wazuh.com/current/installation-guide/wazuh-container.html
- wazuh-docker 仓库(single-node/multi-node):https://github.com/wazuh/wazuh-docker
- Wazuh 安装助手(非容器方案):https://documentation.wazuh.com/current/installation-guide/wazuh-indexer/index.html
- Wazuh agent 安装:https://documentation.wazuh.com/current/installation-guide/wazuh-agent/index.html
- 密码管理(修改默认凭据):https://documentation.wazuh.com/current/user-manual/user-administration/password-management.html
- Wazuh API 参考:https://documentation.wazuh.com/current/user-manual/api/reference.html
- 本平台认知篇:《Wazuh 4.14.9 介绍与选型指南》