痛点
安全运维团队面临一个现实矛盾:商业 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 策略防止磁盘爆满,并对高频规则做限流,避免告警疲劳让团队忽略真正的安全事件。