试着部署一套开源EDR
2026/7/20 15:45:15 网站建设 项目流程

本篇是基于开源 EDR 产品记录的完整部署过程,涵盖架构设计、配置说明、AI 集成、成本控制与踩坑经验。需要说明的是,本篇主要定位还是跑通一次相对完整的可行性验证,可能达不到生产标准,仅供参考。

此外,本篇不涉及相关的概念说明,如什么是 EDR , ISM等,大家有需求的可以自行 GPT。


目录

  1. 为什么要做这件事
  2. 整体架构设计
  3. 真实环境准备
  4. Wazuh 部署实战
  5. 配置详解与日志控制
  6. AI 大模型集成
  7. 测试验证
  8. 成本分析与控制
  9. 踩坑记录与经验总结
  10. 写在最后

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 GBWSL2 分配 12GB
磁盘1TB SSD938GB 可用
WSL2Ubuntu 22.04.5 LTSVERSION 2
Docker29.6.1Docker Desktop + WSL2 后端
Docker Composev5.1.4随 Docker Desktop 安装
Python3.10.12WSL2 内置
Wazuh 版本4.14.6 (stable)从 GitHub 克隆

关键配置项

WSL2 内存限制通过.wslconfig文件配置:

# C:\Users\<用户名>\.wslconfig [wsl2] memory=12GB processors=4 swap=6GB

Indexer (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'>>~/.bashrc

04 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 登录adminSecretPassworddocker-compose.yml
Indexer APIadminSecretPassworddocker-compose.yml
Wazuh REST APIwazuh-wuiMyS3cr37P450r.*-internal_users.yml
Dashboard 内部用户kibanaserverkibanaserverinternal_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 API

6.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.manager

FIM 配置注意事项

  1. 首次扫描耗时— FIM 首次扫描需要对所有监控文件计算哈希(MD5+SHA1+SHA256),大目录(如C:\Windows\System32)可能需要 10+ 分钟。建议先用小目录测试。
  2. 避免过大目录— 监控C:\WindowsC:\Program Files等目录会产生大量告警和性能问题。建议只监控关键子目录。
  3. UTF-8 编码问题— 如果系统路径中包含非 UTF-8 字符(如某些中文路径),FIM 扫描可能报错invalid UTF-8 byte,导致数据库为空。解决方法是避免监控包含特殊字符的目录。
  4. 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/stats

7.4 最终验证清单

检查项预期结果状态
WSL2 VERSION2PASS
Wazuh 容器3 个全部 runningPASS
Indexer healthgreen 或 yellowPASS
Dashboard 访问https://localhost 可登录PASS
Windows Agent状态 = ActivePASS
ISM 保留策略已创建并应用PASS
FIM 测试告警Dashboard 可见PASS
AI 分析服务/health 返回 okPASS
AI 分析结果返回 severity/analysisPASS

08 成本分析与控制

8.1 Token 消耗估算

每条告警分析约消耗700-1000 token(输入 500-700 + 输出 200-300)。

场景日告警量日消耗 token日成本 (元)月成本 (元)
正常使用(level 7+)50-200 条35K-200K0.02-0.140.6-4.2
频繁触发500-1000 条350K-1M0.14-0.74.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 显示 DisconnectedManager 不可达检查Test-NetConnection localhost -Port 1514
API 认证失败密码混淆API 用wazuh-wui,Dashboard 用admin
Docker 容器内无法访问宿主机服务容器 localhost 指向自身使用host.docker.internal或 WSL2 IP

经验总结

  1. 版本选择很重要— 始终使用稳定版,避免 alpha/beta。通过git tag查看可用版本。
  2. 密码要分清— v4.14.6 有三套密码:Dashboard 登录(admin/SecretPassword)、API 用户(wazuh-wui)、内部用户(kibanaserver)。
  3. 日志控制是必须的— 即使磁盘充裕,也要设置 ISM 保留策略。FIM 监控目录不要太大,避免告警风暴。
  4. AI 集成要做好过滤— 不要把所有告警都发给 AI,四层过滤可以节省 80-95% 的 token 成本。
  5. 利用 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 的话题就先聊到这里。


参考资源

  1. Wazuh Documentation - Getting Started: https://documentation.wazuh.com/current/getting-started/index.html
  2. Wazuh Docker Repository: https://github.com/wazuh/wazuh-docker
  3. Wazuh AI/LLM Integration Guide: https://documentation.wazuh.com/current/getting-started/index.html#building-with-ai-and-llms
  4. DeepSeek API Documentation: https://api-docs.deepseek.com/
  5. Wazuh Index State Management: https://documentation.wazuh.com/current/user-manual/wazuh-indexer/index.html

本文基于实际测试环境编写,所有命令和配置均经过验证。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询