饮墨

子安饮墨馀三斗,留与卿儿作赋来

Wazuh 开源 SIEM+XDR 平台:从部署到告警的运维落地实战

痛点

安全运维团队面临一个现实矛盾:商业 SIEM(Splunk、QRadar)动辄年费几十万,而中小企业同样面临日志审计、入侵检测、合规需求。很多团队选择"裸奔"——靠 grep 翻日志、手工写规则,出事后才知道被打了多久。

Wazuh 作为开源 SIEM+XDR 一体化平台,提供了从 Agent 采集、实时分析、威胁检测到主动响应的完整链路,且完全免费。但它的部署架构和调优有不少坑,本文给出可直接落地的实操方案。

方案概述

Wazuh 4.x 架构分三层:

组件 角色 资源建议
Wazuh Server (Manager) 规则引擎 + 告警 + 主动响应 4C8G 起步,500 Agent 以下够用
Wazuh Indexer 基于 OpenSearch 的日志存储 8C16G,SSD 必备,按日志量规划磁盘
Wazuh Dashboard Web UI + 可视化 2C4G,可与 Indexer 合部

生产环境推荐将 Indexer 和 Manager 分离部署,Dashboard 可挂在 Manager 同一台。

实操步骤

Step 1:一键部署 Wazuh All-in-One(测试/小规模环境)

# 下载官方安装脚本(需 root)
curl -sO https://packages.wazuh.com/4.9/wazuh-install.sh
curl -sO https://packages.wazuh.com/4.9/config.yml

# 编辑 config.yml,指定节点 IP
cat > config.yml <<'EOF'
nodes:
  indexer:
    - name: wazuh-indexer
      ip: "10.0.1.10"
  server:
    - name: wazuh-server
      ip: "10.0.1.10"
  dashboard:
    - name: wazuh-dashboard
      ip: "10.0.1.10"
EOF

# 执行安装(自动配置证书、服务、防火墙)
bash wazuh-install.sh --generate-config-files
bash wazuh-install.sh --wazuh-indexer wazuh-indexer
bash wazuh-install.sh --start-cluster
bash wazuh-install.sh --wazuh-server wazuh-server
bash wazuh-install.sh --wazuh-dashboard wazuh-dashboard

安装完成后访问 https://<IP>:443,默认账号 admin,密码在安装日志 wazuh-install-files/wazuh-passwords.txt 中。

Step 2:批量部署 Agent(Ansible Playbook)

Agent 是数据采集端,支持 Linux/Windows/macOS。用 Ansible 批量推送:

# deploy-wazuh-agent.yml
---
- hosts: all_servers
  become: yes
  vars:
    wazuh_manager_ip: "10.0.1.10"
    wazuh_agent_version: "4.9.0-1"
  tasks:
    - name: Import Wazuh GPG key
      rpm_key:
        key: https://packages.wazuh.com/key/GPG-KEY-WAZUH
        state: present
      when: ansible_os_family == "RedHat"

    - name: Add Wazuh repo (RHEL/CentOS)
      yum_repository:
        name: wazuh
        description: Wazuh repository
        baseurl: https://packages.wazuh.com/4.x/yum/
        gpgkey: https://packages.wazuh.com/key/GPG-KEY-WAZUH
        gpgcheck: yes
      when: ansible_os_family == "RedHat"

    - name: Install Wazuh Agent
      package:
        name: "wazuh-agent-{{ wazuh_agent_version }}"
        state: present

    - name: Configure Manager IP
      lineinfile:
        path: /var/ossec/etc/ossec.conf
        regexp: '<address>.*</address>'
        line: "      <address>{{ wazuh_manager_ip }}</address>"

    - name: Enable and start agent
      systemd:
        name: wazuh-agent
        enabled: yes
        state: restarted

执行:

ansible-playbook -i inventory.ini deploy-wazuh-agent.yml

Step 3:自定义检测规则(实战示例)

Wazuh 内置 3000+ 条规则,但生产环境通常需要自定义。以下示例检测 SSH 暴力破解后成功登录的危险场景:

<!-- /var/ossec/etc/rules/local_rules.xml -->
<group name="local,sshd,">
  <!-- SSH 暴力破解后成功登录(高危) -->
  <rule id="100001" level="14">
    <if_matched_sid>5712</if_matched_sid>
    <same_source_ip />
    <description>SSH brute force followed by successful login from same IP</description>
    <mitre>
      <id>T1110</id>
    </mitre>
    <group>authentication_success,attack,</group>
  </rule>

  <!-- 非工作时间 root 登录 -->
  <rule id="100002" level="12">
    <if_sid>5501</if_sid>
    <time>20:00-06:00</time>
    <user>root</user>
    <description>Root login during off-hours (20:00-06:00)</description>
    <group>authentication_success,policy_violation,</group>
  </rule>
</group>

重启生效:

# 验证规则语法
/var/ossec/bin/wazuh-analysisd -t

# 重启 Manager
systemctl restart wazuh-manager

Step 4:配置主动响应(Active Response)

检测到攻击时自动封禁 IP,比人工处置快 100 倍:

<!-- /var/ossec/etc/ossec.conf 中添加 -->
<active-response>
  <command>firewall-drop</command>
  <location>local</location>
  <rules_id>100001</rules_id>
  <timeout>3600</timeout>  <!-- 封禁1小时 -->
</active-response>

这意味着:当规则 100001(暴力破解后成功登录)触发时,自动在被攻击主机上用 iptables/firewalld 封禁来源 IP,1 小时后自动解封。

避坑指南

1. Indexer 磁盘爆满导致集群 Red

现象:Dashboard 打不开,告警停止写入。

原因:OpenSearch 磁盘水位线默认 85% 进入只读模式。

解决

# 查看磁盘使用
curl -s https://localhost:9200/_cat/allocation?v -u admin:password --insecure

# 配置 ISM 策略自动清理 30 天前索引
cat > /tmp/ism-policy.json <<'EOF'
{
  "policy": {
    "description": "Delete old Wazuh indices",
    "default_state": "hot",
    "states": [
      { "name": "hot", "transitions": [{ "state_name": "delete", "conditions": { "min_index_age": "30d" }}]},
      { "name": "delete", "actions": [{ "delete": {} }]}
    ],
    "ism_template": [{ "index_patterns": ["wazuh-alerts-*"], "priority": 1 }]
  }
}
EOF
curl -X PUT "https://localhost:9200/_plugins/_ism/policies/wazuh-cleanup" \
  -H "Content-Type: application/json" -d @/tmp/ism-policy.json \
  -u admin:password --insecure

2. Agent 注册失败:ERROR: Invalid password

原因:Manager 开启了注册密码验证,但 Agent 端未配置。

解决

# Manager 端查看密码
cat /var/ossec/etc/authd.pass

# Agent 端注册时带密码
/var/ossec/bin/agent-auth -m 10.0.1.10 -P "YourAuthPassword"

3. 告警风暴:同一规则每秒触发几百次

原因:日志采集频率高 + 规则粒度过细。

解决:在 ossec.conf 中配置告警频率限制:

<global>
  <email_notification>no</email_notification>
  <!-- 同一规则 60 秒内最多触发 5 次 -->
  <alerts_log>yes</alerts_log>
</global>

<!-- 在规则中加 frequency + timeframe -->
<rule id="100003" level="10" frequency="5" timeframe="60">
  <if_matched_sid>5716</if_matched_sid>
  <same_source_ip />
  <description>Multiple SSH auth failures (rate limited)</description>
</rule>

总结

维度 Wazuh 优势 注意事项
成本 完全开源免费,替代商业 SIEM 节省数十万/年 需自行运维基础设施
功能 SIEM + IDS + 漏洞检测 + 合规审计 + 主动响应 默认规则需按业务裁剪
扩展 支持 Filebeat 对接、Webhook 告警、API 集成 大规模(>1000 Agent)需 Indexer 集群
合规 内置 PCI-DSS、GDPR、HIPAA 等合规面板 需结合业务配置采集范围

核心建议:先用 All-in-One 跑通 POC,验证规则覆盖率后再拆分架构。生产环境务必配置 ISM 策略防止磁盘爆满,并对高频规则做限流,避免告警疲劳让团队忽略真正的安全事件。

您还没有登录,请登录后发表评论。