Wazuh 4.14.9 Docker Compose 部署指南

Ubuntu 22.04 上用官方 single-node 编排以 Docker Compose 部署 Wazuh 4.14.9 三组件栈(manager+indexer+dashboard):证书生成、栈启动三层验证、agent 注册与事件上报端到端、manager API 取证,含 restart 不生效等实测排障,全文命令回显实测。

WazuhWazuh2026/10/20

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/HTTPSdashboard Web 入口5601
9200TCP/HTTPSindexer REST API9200
1514TCPagent 事件上报1514
1515TCPagent 注册1515
514UDPsyslog 接收514
55000TCP/HTTPSWazuh server API55000

💡 说明:官方默认把 dashboard 映射到宿主 443。若 443 已被占用(如已有 Nginx),把 compose 里 wazuh.dashboard 的端口映射改为其他空闲高位端口即可,其余组件端口保持官方默认。本文实测环境因 443 被占用改用 8130,后文登录 URL 均以 8130 为例。

二、镜像选型说明

官方 single-node 栈由三个镜像组成,均取与编排文件同版本的 tag,禁止混用版本(indexer/dashboard 与 manager 的 API、索引模板、证书 CN 有严格版本对应关系):

服务镜像实测版本作用
wazuh.managerwazuh/wazuh-manager4.14.9分析引擎:接收 agent 事件、解码、规则匹配、告警、API 服务
wazuh.indexerwazuh/wazuh-indexer4.14.9告警索引与存储(OpenSearch 分叉),单节点模式
wazuh.dashboardwazuh/wazuh-dashboard4.14.9Web 控制台(OpenSearch Dashboards 分叉),对接 indexer 与 manager API
(辅助)generatorwazuh/wazuh-certs-generator0.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,重试即可(已完成层会缓存)。

三、前置条件

  1. Docker 27+ 与 Compose v2 插件已安装(docker compose version 应输出版本号)。
  2. 内核参数 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
  1. 内存建议 ≥ 8 GB(indexer JVM 默认 1g 堆 + manager 分析引擎 + dashboard;小内存机器可按第七章方法压到 512m 堆跑功能验证)。
  2. 磁盘:镜像约 7GB + 告警数据预留(建议 ≥ 20GB 空闲)。
  3. 防火墙放行: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.ymlindexer 的 opensearch.yml 配置
config/wazuh_indexer/internal_users.ymlindexer 内置用户与密码哈希(admin 等)
config/wazuh_dashboard/opensearch_dashboards.ymldashboard 配置
config/wazuh_cluster/wazuh_manager.confmanager 的 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 /agentsagent 列表(支持 limit/offset/status/name 过滤)
GET /agents?agents_list=001单个 agent 详情(注意:GET /agents/001 形态返回 404,4.14.9 用 agents_list 参数)
GET /manager/statusmanager 进程状态
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/configurationAPI 的 SSL 与配置
wazuh_etc/var/ossec/etcossec.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/filebeatFilebeat(告警转发 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_URLhttps://wazuh.indexer:9200Filebeat 输出目标
INDEXER_USERNAME / INDEXER_PASSWORDadmin / SecretPasswordFilebeat 写 indexer 的凭据
FILEBEAT_SSL_VERIFICATION_MODEfull证书校验模式(full/none)
SSL_CERTIFICATE_AUTHORITIES/etc/ssl/root-ca.pem信任 CA
SSL_CERTIFICATE / SSL_KEY/etc/ssl/filebeat.pem、/etc/ssl/filebeat.keyFilebeat 客户端证书
API_USERNAME / API_PASSWORDwazuh-wui / MyS3cr37P450r.*-dashboard 回调 manager API 的凭据

wazuh.indexer

变量官方默认值说明
OPENSEARCH_JAVA_OPTS-Xms1g -Xmx1gJVM 堆(Xms 必须=Xmx);小内存机器可 512m

wazuh.dashboard

变量官方默认值说明
INDEXER_USERNAME / INDEXER_PASSWORDadmin / SecretPassword查询 indexer 的凭据
WAZUH_API_URLhttps://wazuh.managermanager API 地址
API_USERNAME / API_PASSWORDwazuh-wui / MyS3cr37P450r.*-调 manager API 的凭据
DASHBOARD_USERNAME / DASHBOARD_PASSWORDkibanaserver / kibanaserverdashboard 在 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.keyFilebeat 客户端证书
config/wazuh_cluster/wazuh_manager.conf/wazuh-config-mount/etc/ossec.confmanager 主配置(容器启动时拷贝生效)
config/wazuh_indexer/wazuh.indexer.yml/usr/share/wazuh-indexer/config/opensearch.ymlindexer 集群/安全配置
config/wazuh_indexer/internal_users.yml/usr/share/wazuh-indexer/config/opensearch-security/internal_users.ymlindexer 用户哈希(改 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 会误删另一套的资源。

十二、参考链接

  1. 官方容器部署文档:https://documentation.wazuh.com/current/installation-guide/wazuh-container.html
  2. wazuh-docker 仓库(single-node/multi-node):https://github.com/wazuh/wazuh-docker
  3. Wazuh 安装助手(非容器方案):https://documentation.wazuh.com/current/installation-guide/wazuh-indexer/index.html
  4. Wazuh agent 安装:https://documentation.wazuh.com/current/installation-guide/wazuh-agent/index.html
  5. 密码管理(修改默认凭据):https://documentation.wazuh.com/current/user-manual/user-administration/password-management.html
  6. Wazuh API 参考:https://documentation.wazuh.com/current/user-manual/api/reference.html
  7. 本平台认知篇:《Wazuh 4.14.9 介绍与选型指南》