本篇是基于开源 EDR 产品记录的完整部署过程,涵盖架构设计、配置说明、AI 集成、成本控制与踩坑经验。需要说明的是,本篇主要定位还是跑通一次相对完整的可行性验证,可能达不到生产标准,仅供参考。
此外,本篇不涉及相关的概念说明,如什么是 EDR , ISM等,大家有需求的可以自行 GPT。
目录
- 为什么要做这件事
- 整体架构设计
- 真实环境准备
- Wazuh 部署实战
- 配置详解与日志控制
- AI 大模型集成
- 测试验证
- 成本分析与控制
- 踩坑记录与经验总结
- 写在最后
01 为什么要做这件事
商业 EDR 产品(如 CrowdStrike Falcon、Microsoft Defender for Endpoint)年费通常在数万元至十几万元,对于小团队而言成本压力显著。但安全防护不能因为预算有限就放弃,我们需要一种低成本、可落地的替代方案。
核心目标:利用开源 EDR 框架搭建端点检测能力,结合 AI 大模型实现告警智能分析,达到类 SaaS EDR 的防护效果。
可行性验证:在本地环境中完成 PoC,验证架构可行性,为后续小团队落地提供决策依据。
经过调研,我选择了Wazuh作为核心 EDR 框架来做可行性验证。原因很简单:它是目前最活跃的开源 XDR/SIEM 项目,社区支持好,文档完善,而且官方已经支持 AI/LLM 集成(包括/llms.txt标准)。
注意
并不是所有的团队都需要 EDR,选型或者要上一个软件之前,还是应该对其有一个相对比较深刻的理解,以及对自己的业务线有清晰的认识,看看自己面临的问题是否真的需要 EDR,或者 EDR 是否真的能解决你的问题,还有就是真上了 EDR,你到底hold不hold的住。。。不要赔了夫人又折兵。
02 整体架构设计
我本人是有一台云端的轻量服务器,但资源有限。
如下图我的OpenClaw助手给我的总结😂
所以我采用了全本地部署方案:所有服务端组件运行在 WSL2 + Docker 中,Windows 宿主机作为被监控端点,架构设计图如下。
架构优势:零服务器成本(利用现有 Windows 机器);部署简单(Docker Compose 一键启动);AI 分析按需调用(仅分析高危告警,token 成本极低)。
03 真实环境准备
以下是我们实际测试使用的环境配置:
| 项目 | 配置 | 说明 |
|---|---|---|
| 操作系统 | Windows 11 | 宿主机 |
| 内存 | 32 GB | WSL2 分配 12GB |
| 磁盘 | 1TB SSD | 938GB 可用 |
| WSL2 | Ubuntu 22.04.5 LTS | VERSION 2 |
| Docker | 29.6.1 | Docker Desktop + WSL2 后端 |
| Docker Compose | v5.1.4 | 随 Docker Desktop 安装 |
| Python | 3.10.12 | WSL2 内置 |
| Wazuh 版本 | 4.14.6 (stable) | 从 GitHub 克隆 |
关键配置项
WSL2 内存限制通过.wslconfig文件配置:
# C:\Users\<用户名>\.wslconfig [wsl2] memory=12GB processors=4 swap=6GBIndexer (OpenSearch) 需要vm.max_map_count=262144,每次 WSL2 重启后需要重新设置:
# 进入 WSL2 后执行sudosysctl-wvm.max_map_count=262144# 持久化(添加到 ~/.bashrc)echo'sudo sysctl -w vm.max_map_count=262144 2>/dev/null'>>~/.bashrc04 Wazuh 部署实战
4.1 精准克隆指定稳定版
由于国内网络环境直连 GitHub 较慢,且默认分支可能包含不稳定的 Alpha/Beta 代码,推荐直接使用-b参数精准克隆官方的稳定版 Tag,并加上--depth=1减少历史数据下载量:
# WSL2 终端cd/home/edr# 精准克隆 v4.14.6 稳定版(只拉取当前版本数据)gitclone-bv4.14.6[https://github.com/wazuh/wazuh-docker.git](https://github.com/wazuh/wazuh-docker.git)--depth=1cdwazuh-docker注意版本选择:我们最初克隆时默认分支是 5.1.0-alpha0,这是一个不稳定的 alpha 版本。建议始终使用最新稳定版(当前为 v4.14.6),可通过
git tag --sort=-v:refname查看所有可用版本。
4.2 生成 TLS 证书
v4.14.6 使用专用的证书生成器,比 5.x 更简单:
cd/home/edr/wazuh-docker/single-node# 使用仓库自带的证书生成配置dockercompose-fgenerate-indexer-certs.yml up# 等待证书生成完成后容器自动退出# 清理生成容器dockercompose-fgenerate-indexer-certs.yml down验证证书文件:
ls-laconfig/wazuh_indexer_ssl_certs/# 应包含:root-ca.pem, wazuh.indexer.pem, wazuh.manager.pem,# wazuh.dashboard.pem, admin.pem 等文件4.3 启动全栈服务
cd/home/edr/wazuh-docker/single-nodedockercompose up-d# 查看容器状态dockercomposeps# 等待 Indexer 就绪(可能需要 1-2 分钟)curl-sk-uadmin:SecretPassword https://localhost:9200/_cluster/health?pretty# 返回 "status" : "green" 或 "yellow" 即成功注意:这一步构造的时候,会拉取wazuh镜像,这一步很可能因为网络问题出现一些EOF之类的异常,多试几次就好。最后会拉取4个镜像(包含前面那个生成证书的镜像),启动3个容器,在docker desktop里查看效果如下
4.4 访问 Dashboard
在 Windows 浏览器中打开https://localhost:
- 登录账号:
admin - 登录密码:
SecretPassword - 浏览器会提示证书不安全,点击"继续访问"即可
4.5 安装 Windows Agent
# PowerShell(管理员模式)Invoke-WebRequest-Uri https://packages.wazuh.com/4.x/windows/wazuh-agent-4.9.0-1.msi `-OutFile$env:TEMP\wazuh-agent.msi msiexec/i"$env:TEMP\wazuh-agent.msi"/q ` WAZUH_MANAGER='localhost'` WAZUH_REGISTRATION_SERVER='localhost'# 验证服务Get-ServiceWazuhSvc在 Dashboard →Agents中查看 Agent 是否显示为Active。这个面板是基于Kibana构造的,所以前面我们拉去Wazuh镜像的时候,镜像很大,所以要多等一会儿。
05 配置详解与日志控制
5.1 默认密码说明
| 用途 | 用户名 | 密码 | 配置文件 |
|---|---|---|---|
| Dashboard 登录 | admin | SecretPassword | docker-compose.yml |
| Indexer API | admin | SecretPassword | docker-compose.yml |
| Wazuh REST API | wazuh-wui | MyS3cr37P450r.*- | internal_users.yml |
| Dashboard 内部用户 | kibanaserver | kibanaserver | internal_users.yml |
5.2 ISM 索引保留策略
防止日志积累导致磁盘爆满,在 Dashboard 中创建 ISM 策略:
Indexer management → Index Management → State management policies → Create policy粘贴以下 JSON:
{"policy":{"policy_id":"wazuh-alert-retention-policy","description":"Auto-delete alert indices older than 30 days","schema_version":17,"default_state":"retention_state","states":[{"name":"retention_state","actions":[],"transitions":[{"state_name":"delete_alerts","conditions":{"min_index_age":"30d"}}]},{"name":"delete_alerts","actions":[{"delete":{}}],"transitions":[]}],"ism_template":[{"index_patterns":["wazuh-alerts-*"],"priority":1}]}}5.3 Manager 日志优化
v4.14.6 的 Manager 配置文件从宿主机挂载,可直接编辑:
# 宿主机路径vi/home/edr/wazuh-docker/single-node/config/wazuh_cluster/wazuh_manager.conf关键配置项:
<global><jsonout_output>yes</jsonout_output><alerts_log>yes</alerts_log><logall>no</logall><!-- 重要:不开全量日志 --><logall_json>no</logall_json></global><alerts><log_alert_level>3</log_alert_level><!-- 只记录 level 3+ 的告警 --></alerts>06 AI 大模型集成
这是本方案的核心亮点:通过 AI 大模型自动分析 Wazuh 产生的安全告警,弥补小团队缺少专业安全分析师的短板,平替商业版 EDR 软件的最强大脑角色。
6.1 架构设计
Wazuh Manager → Integration (level 7+ 告警) → AI Analyzer (FastAPI :8080) → DeepSeek API6.2 智能过滤与成本控制
直接将所有告警转发给 AI 会导致 token 消耗过快。我们在 AI 分析器中实现了四层过滤:
| 过滤层 | 说明 | 效果 |
|---|---|---|
| Level 过滤 | 只分析 level 7+ 的告警(Critical/High) | 过滤约 60-70% |
| 规则白名单/黑名单 | 只分析关心的规则 ID,屏蔽低价值规则 | 过滤约 10-20% |
| 频率限制 | 同一规则 + 同一端点,5 分钟内最多分析 3 次 | 过滤约 10-15% |
| 内容去重 | 相同告警内容 10 分钟内不重复分析 | 过滤约 5-10% |
6.3 AI 分析器核心代码
完整的 AI 分析器服务代码(Python FastAPI):
说明:以下代码由大模型生成
"""Wazuh AI Alert Analyzer v2 - 带智能过滤和成本控制"""importjson,logging,timefromdatetimeimportdatetimefromcollectionsimportdefaultdictfromfastapiimportFastAPI,Request,HTTPExceptionfromopenaiimportAsyncOpenAI# === 配置区 ===DEEPSEEK_API_KEY="sk-YOUR_API_KEY"# 替换为你的 KeyDEEPSEEK_MODEL="deepseek-v4-flash"MIN_ALERT_LEVEL=7# 只分析 level 7+RATE_LIMIT_WINDOW=300# 5 分钟窗口RATE_LIMIT_MAX=3# 窗口内最多 3 次DEDUP_WINDOW=600# 10 分钟去重client=AsyncOpenAI(api_key=DEEPSEEK_API_KEY,base_url="https://api.deepseek.com/v1")app=FastAPI(title="Wazuh AI Alert Analyzer v2",version="2.0.0")# 过滤状态rate_limit_store=defaultdict(list)dedup_store={}stats={"total_received":0,"analyzed":0,"filtered":0}defshould_analyze(alert):"""四层过滤逻辑"""rule=alert.get("rule",{})rule_id=str(rule.get("id",""))rule_level=int(rule.get("level",0))agent_id=str(alert.get("agent",{}).get("id",""))now=time.time()# 第 1 层:Level 过滤ifrule_level<MIN_ALERT_LEVEL:returnFalse,"level_too_low"# 第 2 层:频率限制key=f"{rule_id}:{agent_id}"recent=[tfortinrate_limit_store[key]ifnow-t<RATE_LIMIT_WINDOW]iflen(recent)>=RATE_LIMIT_MAX:returnFalse,"rate_limited"# 第 3 层:内容去重content_hash=hash(json.dumps(alert.get("full_log",""),sort_keys=True))ifcontent_hashindedup_storeandnow-dedup_store[content_hash]<DEDUP_WINDOW:returnFalse,"dedup"returnTrue,"pass"@app.post("/analyze")asyncdefanalyze_alert(request:Request):stats["total_received"]+=1alert=awaitrequest.json()should_proc,reason=should_analyze(alert)ifnotshould_proc:stats["filtered"]+=1return{"filtered":True,"reason":reason}stats["analyzed"]+=1rule=alert.get("rule",{})agent=alert.get("agent",{})context=(f"规则:{rule.get('description','N/A')}\n"f"级别:{rule.get('level','N/A')}\n"f"端点:{agent.get('name','N/A')}\n"f"日志:{json.dumps(alert.get('full_log',''),ensure_ascii=False)[:2000]}")resp=awaitclient.chat.completions.create(model=DEEPSEEK_MODEL,messages=[{"role":"system","content":"你是一名资深安全分析师。分析 EDR 告警并输出 JSON。"},{"role":"user","content":context}],response_format={"type":"json_object"},temperature=0.1)result=json.loads(resp.choices[0].message.content)returnresult@app.get("/health")asyncdefhealth():return{"status":"ok"}@app.get("/stats")asyncdefget_stats():"""查看过滤统计"""returnstats下面第7.3节部分会有脚本执行效果
6.4 配置 Wazuh 转发告警
在 Manager 配置文件中添加 integration 块:
<!-- 在 wazuh_manager.conf 末尾添加 --><integration><name>custom-ai-analyzer</name><hook_url>http://host.docker.internal:8080/analyze</hook_url><alert_format>json</alert_format><level>5</level><!-- Wazuh 侧过滤 level 5+ --></integration>关于 hook_url 地址:Docker 容器内的
localhost指向容器自身,不是 WSL2 宿主机。使用host.docker.internal指向宿主机。如果不可用,改用 WSL2 的实际 IP。
07 测试验证
7.1 验证告警链路
Wazuh 部署完成后,系统会自动产生多种告警。以下是我实际测试中观察到的告警类型:
| 告警类型 | 数量 | 说明 |
|---|---|---|
| SCA 安全检查基线 | 669 条 | Agent 首次连接后自动扫描 Windows 安全配置 |
| Windows 系统事件 | 26 条 | Windows Event Log 中的系统事件 |
| Agent 状态变更 | 若干 | Agent 启动/停止/连接事件 |
通过 Indexer 直接查询告警(推荐方式):
# WSL2 终端# 查询最近 5 条告警curl-sk-u'admin:SecretPassword'-XPOST"https://localhost:9200/wazuh-alerts-*/_search?pretty"\-H'Content-Type: application/json'\-d'{"size":5,"sort":[{"@timestamp":{"order":"desc"}}],"_source":["rule.description","rule.level","agent.name","@timestamp"]}'# 查询 level 7+ 的高危告警curl-sk-u'admin:SecretPassword'-XPOST"https://localhost:9200/wazuh-alerts-*/_search?pretty"\-H'Content-Type: application/json'\-d'{"size":5,"query":{"range":{"rule.level":{"gte":7}}},"_source":["rule.description","rule.level","@timestamp"]}'注意:Wazuh 4.14.6 的 REST API 没有
/alerts端点,告警数据需要通过 Indexer (OpenSearch) 直接查询。这是与早期版本的一个重要区别。
7.2 FIM(文件完整性监控)配置
FIM 是 EDR 的核心能力之一,但在实际配置中需要注意几个关键点:
配置 Windows Agent 的 FIM 监控目录:
在 Manager 上创建agent.conf,下发给 Windows Agent:
# WSL2 终端dockerexecsingle-node-wazuh.manager-1bash-c'cat > /var/ossec/etc/shared/default/agent.conf << "EOF" <agent_config os="Windows"> <syscheck> <disabled>no</disabled> <frequency>300</frequency> <directories realtime="yes">C:\wazuh-fim-test</directories> </syscheck> </agent_config> EOF'# 重启 Manager 使配置生效cd/home/edr/wazuh-docker/single-node&&dockercompose restart wazuh.managerFIM 配置注意事项:
- 首次扫描耗时— FIM 首次扫描需要对所有监控文件计算哈希(MD5+SHA1+SHA256),大目录(如
C:\Windows\System32)可能需要 10+ 分钟。建议先用小目录测试。 - 避免过大目录— 监控
C:\Windows、C:\Program Files等目录会产生大量告警和性能问题。建议只监控关键子目录。 - UTF-8 编码问题— 如果系统路径中包含非 UTF-8 字符(如某些中文路径),FIM 扫描可能报错
invalid UTF-8 byte,导致数据库为空。解决方法是避免监控包含特殊字符的目录。 - Realtime 模式— 添加
realtime="yes"属性可以启用实时检测,但只在首次扫描完成后生效。
7.3 AI 分析验证
# 发送测试告警到 AI 分析器curl-XPOST http://localhost:8080/analyze\-H"Content-Type: application/json"\-d'{ "rule": {"id": "5710", "description": "SSH brute force attempt", "level": 7}, "agent": {"name": "windows-pc", "ip": "127.0.0.1"}, "full_log": "Failed password for root from 10.0.0.1" }'# 查看过滤统计curlhttp://localhost:8080/stats7.4 最终验证清单
| 检查项 | 预期结果 | 状态 |
|---|---|---|
| WSL2 VERSION | 2 | PASS |
| Wazuh 容器 | 3 个全部 running | PASS |
| Indexer health | green 或 yellow | PASS |
| Dashboard 访问 | https://localhost 可登录 | PASS |
| Windows Agent | 状态 = Active | PASS |
| ISM 保留策略 | 已创建并应用 | PASS |
| FIM 测试告警 | Dashboard 可见 | PASS |
| AI 分析服务 | /health 返回 ok | PASS |
| AI 分析结果 | 返回 severity/analysis | PASS |
08 成本分析与控制
8.1 Token 消耗估算
每条告警分析约消耗700-1000 token(输入 500-700 + 输出 200-300)。
| 场景 | 日告警量 | 日消耗 token | 日成本 (元) | 月成本 (元) |
|---|---|---|---|---|
| 正常使用(level 7+) | 50-200 条 | 35K-200K | 0.02-0.14 | 0.6-4.2 |
| 频繁触发 | 500-1000 条 | 350K-1M | 0.14-0.7 | 4.2-21 |
| 告警风暴 | 10000+ 条 | 7M+ | 2.8+ | 84+ |
四层过滤的实际效果:在我们的测试中,四层过滤可以将实际需要 AI 分析的告警量减少80-95%。即使 Wazuh 每天产生 1000 条告警,真正调用 API 的只有 50-200 条,月成本控制在 5 元以内。
8.2 推荐的过滤参数
# AI Analyzer 配置MIN_ALERT_LEVEL=7# 只分析 Critical/HighRATE_LIMIT_WINDOW=300# 5 分钟窗口RATE_LIMIT_MAX=3# 同规则 + 端点最多 3 次DEDUP_WINDOW=600# 10 分钟去重09 踩坑记录与经验总结
踩坑记录
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 默认分支是 alpha 版本 | wazuh-docker 默认分支指向开发版 | 始终git checkout v4.14.6切换稳定版 |
| vm.max_map_count 重置 | WSL2 每次重启会重置内核参数 | 添加到~/.bashrc自动设置 |
| Dashboard 打不开 | 端口转发问题 | 尝试https://localhost:443或 WSL2 IP |
| Agent 显示 Disconnected | Manager 不可达 | 检查Test-NetConnection localhost -Port 1514 |
| API 认证失败 | 密码混淆 | API 用wazuh-wui,Dashboard 用admin |
| Docker 容器内无法访问宿主机服务 | 容器 localhost 指向自身 | 使用host.docker.internal或 WSL2 IP |
经验总结
- 版本选择很重要— 始终使用稳定版,避免 alpha/beta。通过
git tag查看可用版本。 - 密码要分清— v4.14.6 有三套密码:Dashboard 登录(admin/SecretPassword)、API 用户(wazuh-wui)、内部用户(kibanaserver)。
- 日志控制是必须的— 即使磁盘充裕,也要设置 ISM 保留策略。FIM 监控目录不要太大,避免告警风暴。
- AI 集成要做好过滤— 不要把所有告警都发给 AI,四层过滤可以节省 80-95% 的 token 成本。
- 利用 AI 智能体辅助部署— 把部署文档喂给 AI 智能体(如 OpenClaw、Hermes),可以大幅减少手动操作。
10 写在最后
通过本次实战,验证了开源 EDR + AI 大模型方案在小团队落地的可行性。核心结论:
- 技术可行:Wazuh 4.14.6 + WSL2/Docker 可以在普通 Windows 机器上流畅运行,部署过程约 1-2 小时
- 成本可控:零软件许可费,AI 分析月成本约 5-20 元(取决于告警量和过滤策略)
- 效果可用:AI 分析可以提供专业的安全建议,弥补小团队缺少安全专家的短板
- 可扩展:后续可接入 Velociraptor(取证)、osquery(资产发现)、威胁情报等增强能力
对于预算有限但需要基本安全防护能力的小团队,这是一个值得尝试的方案。当然,它无法完全替代商业 EDR(如 CrowdStrike 的实时防护、EDR 响应能力),但作为起点和过渡方案,已经足够。此外,今天我的测试过程只是本地部署 EDR 架构的冰山一角,后续还有诸多操作步骤,包括但不限于以下内容
- 根据实际需求调整过滤参数,优化 token 成本
- 探索自定义检测规则,覆盖团队特有的安全场景
- 考虑接入飞书/钉钉通知,实现告警实时推送
- 评估是否需要 Velociraptor 做深度取证分析
但就验证可行性来说,这些工作已经足够。好了,关于开源 EDR 的话题就先聊到这里。
参考资源:
- Wazuh Documentation - Getting Started: https://documentation.wazuh.com/current/getting-started/index.html
- Wazuh Docker Repository: https://github.com/wazuh/wazuh-docker
- Wazuh AI/LLM Integration Guide: https://documentation.wazuh.com/current/getting-started/index.html#building-with-ai-and-llms
- DeepSeek API Documentation: https://api-docs.deepseek.com/
- Wazuh Index State Management: https://documentation.wazuh.com/current/user-manual/wazuh-indexer/index.html
本文基于实际测试环境编写,所有命令和配置均经过验证。