2. 终端数据采集架构设计

EDR 的检测能力上限,首先由终端侧能采到什么数据决定。采集架构设计要回答三个问题:采什么(数据源分类)、怎么采(代理部署模式)、怎么送(标准化与传输通道)。三者构成一条从内核事件到分析平台的完整链路,任何一环设计不当,都会导致检测规则“无米下锅”或数据在传输中失真。

一、三类终端的数据源分类

Windows、Linux、macOS 的内核机制差异很大,数据源不能一概而论。工程上通常按“进程、文件、网络、注册表/配置、账号、驱动/内核模块”六个维度归类,再映射到各平台的具体采集接口。

Windows 侧的核心是 ETW(Event Tracing for Windows)与内核回调。进程创建可订阅 Microsoft-Windows-Kernel-Process 提供程序,拿到 PID、父进程 PID、映像路径与命令行;文件操作依赖内核过滤驱动(minifilter)挂载在 IRP_MJ_CREATE 等操作上;网络连接可通过 WFP(Windows Filtering Platform)或 ETW 的 Microsoft-Windows-Kernel-Network 获取五元组;注册表改动由 CmRegisterCallbackEx 捕获;登录事件来自 Security 日志的 4624/4625;驱动加载对应 7045 或 Sysmon 的 Event ID 6。Sysmon 是常见的折中方案,它把上述多数事件统一为 Event ID 1/3/11/12/13 等,部署成本低,但可定制性弱于自研驱动。

Linux 侧以 eBPF 为主流。进程执行可挂载 tracepoint/sched/sched_process_exec,配合 bpf_get_current_task 读取父进程信息;文件访问挂 kprobe 到 vfs_open、vfs_write;网络连接挂 tracepoint/syscalls/sys_enter_connect 或使用 kprobe 到 tcp_connect;账号与提权关注 /var/log/secure 或 auditd 的 EXECVE、SYSCALL 记录;内核模块加载可监听 init_module/finit_module。相比传统 auditd,eBPF 的过滤在内核态完成,高并发下丢包率明显更低,但需要内核 4.9+ 且开启 CONFIG_BPF 相关选项。

macOS 侧受 SIP 限制,用户态无法直接挂钩内核。主流做法是使用 Apple 的 Endpoint Security(ES)框架,通过 es_new_client 订阅 ES_EVENT_TYPE_NOTIFY_EXEC、NOTIFY_OPEN、NOTIFY_CONNECT 等事件;文件完整性可用 FSEvents 做粗粒度补充;账号与授权事件来自 OpenBSM 审计或统一日志(Unified Log)。ES 需要用户授予“完全磁盘访问”与系统扩展权限,且每个客户端有事件配额,设计时必须做事件裁剪。

二、采集代理的部署模式

代理部署不是“装上去就行”,而要按终端角色选择模式。常见有四类:

  • 常驻轻量代理:以系统服务/守护进程运行,采集高频事件(进程、网络),资源占用控制在 CPU 1%~3%、内存 80~150MB。适合办公终端与服务器。
  • 内核驱动 + 用户态代理:驱动负责事件捕获与初步过滤,用户态负责富化与上报。检测能力最强,但驱动崩溃会导致蓝屏,必须做签名与回滚机制。
  • 无代理旁路采集:通过 Sysmon、auditd、ES 等系统自带能力输出到本地文件,再由转发器(如 Filebeat、Fluent Bit)收集。部署快,但事件字段不统一、易被攻击者关闭。
  • 按需临时采集:用于取证或排障,通过远程下发脚本采集内存、进程树、网络连接快照,用完即撤。不参与常态检测。

实际工程中常采用“常驻代理 + 内核驱动”组合:驱动只做事件捕获与最小过滤,用户态代理做字段富化、规则初筛和缓冲。这样即使驱动出问题,用户态仍可降级为轮询模式,保证基本可见性。

三、数据标准化与传输通道选型

三类终端上报的原始字段千差万别,必须先归一化。推荐以 ECS(Elastic Common Schema)或 OCSF 为参考,定义统一事件模型。核心字段包括:

{
  "event": { "category": "process", "action": "start", "time": "2025-03-11T08:12:33.421Z" },
  "host":  { "name": "win-fin-023", "os": "windows", "ip": "10.20.3.17" },
  "process": { "pid": 4820, "ppid": 1120, "name": "powershell.exe",
               "command_line": "powershell -enc SQBFAF...", "hash_sha256": "9f2c..." },
  "user":  { "name": "CORP\\zhangsan" },
  "agent": { "id": "edr-7f3a", "version": "3.4.1" }
}

归一化时要注意三点:时间统一为 UTC 毫秒级,避免多时区排序错乱;进程标识用 PID + 启动时间 + 主机名组合,防止 PID 复用导致血缘错乱;命令行与路径做长度截断与转义,防止注入与超长字段拖垮管道。

传输通道选型取决于数据量与网络条件。低频关键事件(进程、登录、驱动加载)走 gRPC 或 HTTPS 长连接,保证可靠与低延迟;高频文件与网络事件先本地聚合,按秒级批量压缩后上报;隔离网或弱网终端采用本地磁盘队列 + 断点续传,队列上限建议 500MB~2GB,超限时按优先级丢弃低价值事件。传输层必须启用 mTLS 双向认证,防止伪造终端注入脏数据。

终端数据采集架构:数据源 → 代理 → 标准化 → 传输 → 分析平台 数据源(按平台) Windows:ETW / minifilter / WFP 进程·文件·网络·注册表·驱动 Linux:eBPF / auditd / 日志 exec·vfs·connect·模块加载 macOS:Endpoint Security / 统一日志 EXEC·OPEN·CONNECT·授权 采集代理部署模式 常驻轻量代理(服务/守护进程) 内核驱动 + 用户态代理 无代理旁路(Sysmon/auditd + 转发器) 按需临时采集(取证/排障) 数据标准化(统一事件模型) event.category / action / time(UTC ms) host.name / os / ip process.pid / ppid / name / cmdline / hash user.name / agent.id / version 传输通道选型 关键事件:gRPC / HTTPS 长连接 低延迟·可靠·mTLS 双向认证 高频事件:本地聚合 + 批量压缩 秒级批次·降低带宽峰值 弱网/隔离:磁盘队列 + 断点续传 队列 500MB~2GB·优先级丢弃 安全:mTLS + 终端证书 防伪造注入 EDR 分析平台 规则引擎 · 行为基线 · 告警与响应 设计红线 时间统一 UTC · PID+启动时间防复用 驱动可回滚 · 队列超限按优先级丢弃 降级策略 驱动异常 → 用户态轮询保底 网络中断 → 本地队列续传

把三层串起来看,一个典型的进程创建事件从产生到入库大约经历:内核回调捕获 → 用户态代理补全父进程与用户信息 → 归一化为统一 JSON → 按优先级进入发送队列 → mTLS 通道上报 → 平台解析入库。整条链路的延迟目标通常控制在 3~10 秒,超过 30 秒的告警在应急响应中价值会大幅下降。

设计检查点:先确认每个平台的关键事件是否都有对应采集接口,再确认代理在断网、驱动异常、CPU 高负载三种情况下是否仍能保证核心事件不丢,最后确认归一化字段是否覆盖了检测规则所需的全部输入。三者缺一,采集架构就不算闭环。