4. 检测数据源盘点

检测工程的第一性原理是:没有数据,就没有检测。在写任何一条检测规则之前,必须先回答三个问题——这条规则依赖哪些日志源?这些日志从哪里采集、以什么方式进入分析平台?日志里的关键字段是否真的存在、语义是否可靠、延迟是否可接受?本章围绕终端、网络、身份、云、应用五类常见日志源,讲清采集方式、字段语义与可用性评估方法。

一、五类日志源的采集方式

终端日志主要来自操作系统与安全代理。Windows 侧核心是 Sysmon 与安全审计日志(Security 通道),Sysmon 通过驱动挂接内核回调,采集进程创建(Event ID 1)、网络连接(3)、文件创建(11)、注册表修改(12/13/14)、驱动加载(6)等事件;Linux 侧依赖 auditd、eBPF(如 Tetragon、Falco)与 syslog。采集方式通常是代理(Agent)本地读取事件通道后转发,或通过 Windows Event Forwarding(WEF)汇聚到收集器。

网络日志包括防火墙会话日志、IDS/IPS 告警、DNS 查询日志、代理(Proxy)访问日志、NetFlow/IPFIX 流记录。采集方式分两类:一是设备主动推送 syslog 到收集器;二是通过流量镜像(SPAN)或 TAP 交给 Zeek/Suricata 解析生成结构化日志。NetFlow 只记录五元组与字节数,不含载荷,适合做流量基线与横向移动发现,但不能替代全包分析。

身份日志来自域控、IdP 与 SSO。Active Directory 的关键事件是 4624(登录成功)、4625(登录失败)、4768/4769(Kerberos TGT/ST 请求)、4720(账户创建);云身份侧对应 Azure AD / Entra ID 的 Sign-in logs 与 Audit logs,Okta 的 System Log。采集方式多为 API 拉取(如 Microsoft Graph、Okta API)或事件订阅推送。

云日志以控制面审计为主:AWS CloudTrail、Azure Activity Log、GCP Cloud Audit Logs 记录谁在何时对哪个资源做了什么 API 调用。数据面日志如 VPC Flow Logs、S3 访问日志、WAF 日志则反映实际流量与访问行为。采集通常通过云原生投递(CloudTrail → S3 → SQS → 采集器)或事件总线(EventBridge)实现。

应用日志来自 Web 服务器、业务系统与中间件,格式最不统一,可能是 Nginx access log、JSON 结构化日志或自定义文本。采集方式包括 Filebeat/Fluent Bit 读文件、应用直接写 Kafka,或 OpenTelemetry Collector 统一接收。

五类日志源:采集路径 → 关键字段 → 可用性评估 终端 Sysmon / auditd / eBPF Agent 转发 / WEF 网络 FW / IDS / DNS / Proxy syslog / SPAN+Zeek 身份 AD / Entra ID / Okta API 拉取 / 事件订阅 云 CloudTrail / Activity Log S3+SQS / EventBridge 应用 Nginx / 业务 / 中间件 Filebeat / OTel 采集与归一化层:解析 → 字段映射(ECS/OCSF)→ 富化(GeoIP、资产、身份) 统一时间戳(UTC)、统一主机标识、统一用户标识 关键字段语义(示例) 终端 Image, CommandLine, ParentImage, User, Hashes 网络 src_ip, dst_ip, dst_port, query, bytes, proto 身份 user, src_ip, logon_type, result, MFA 云 eventName, userIdentity, sourceIP, ARN 应用 status, uri, method, session_id, user_agent 语义陷阱:字段名相同但含义不同(如 user 可能是账户名或显示名) 可用性评估五维 覆盖度 资产/账号是否全覆盖 完整性 字段是否缺失、是否截断 时效性 采集延迟、端到端时延 保真度 是否采样、是否丢包 成本 存储、许可、采集开销

二、字段语义:同名不同义是最大陷阱

字段语义决定了检测规则能否跨源关联。以“用户”为例:终端 Sysmon 的 User 字段是进程运行账户,格式为 DOMAIN\user;AD 4624 的 TargetUserName 是被登录账户,而 SubjectUserName 是发起登录的账户;CloudTrail 的 userIdentity.arn 是 IAM 主体 ARN,可能是角色而非具体人。如果规则里直接拿这些字段做等值关联,很可能匹配不上或误匹配。

再以“IP”为例:网络日志的 src_ip 是连接发起方,身份日志的 IpAddress 是登录来源,云日志的 sourceIPAddress 可能是 NAT 后的出口 IP,也可能是 AWS 服务自身的 IP。做“同一 IP 先登录失败后横向扫描”这类关联时,必须确认各源 IP 的语义边界,并考虑 NAT 与代理带来的失真。

工程上的做法是建立字段映射字典:把各源字段统一映射到 ECS(Elastic Common Schema)或 OCSF(Open Cybersecurity Schema Framework)的规范字段,例如统一为 user.name、source.ip、process.command_line、event.action。映射时保留原始字段,便于回溯与排障。

三、可用性评估:五个维度与量化方法

可用性评估不是“有日志就行”,而是回答“这条检测规则能不能稳定跑起来”。建议从五个维度量化:

  • 覆盖度:目标资产/账号中,实际产生日志的比例。例如 500 台终端中 470 台上报 Sysmon,覆盖度 94%。
  • 完整性:关键字段的非空率与截断率。例如 CommandLine 非空率 99.2%,但超过 8192 字符被截断的比例约 0.3%。
  • 时效性:事件发生到可查询的端到端延迟。终端 Agent 通常 5~30 秒,云审计 API 拉取可能 2~15 分钟。
  • 保真度:是否采样、是否丢包。NetFlow 常按 1:1000 采样,DNS 日志可能只记录应答不记录查询。
  • 成本:存储与许可。全量包捕获成本极高,通常只保留元数据。

实操中可以用一段查询快速评估。例如在 Elastic 中统计某日志源近 24 小时的字段非空率:

GET logs-*/_search
{
  "size": 0,
  "query": { "range": { "@timestamp": { "gte": "now-24h" } } },
  "aggs": {
    "total": { "value_count": { "field": "_id" } },
    "has_cmdline": { "filter": { "exists": { "field": "process.command_line" } } },
    "has_user": { "filter": { "exists": { "field": "user.name" } } }
  }
}

若 has_cmdline.doc_count / total.value 低于 0.95,说明该字段不可靠,依赖它的规则需要降级或补充其他数据源。类似地,可以按 host.name 聚合统计覆盖度,找出未上报的资产。

四、盘点成果:数据源清单

盘点的最终交付物是一份可维护的数据源清单,至少包含以下字段。下表为示例,数值为合理假设,用于说明填写方式:

数据源采集方式关键字段覆盖度延迟可用性结论
Sysmon (Win)Agent 转发Image, CommandLine, ParentImage94%5–30s高,可支撑进程类检测
AD 安全日志WEF 汇聚TargetUserName, LogonType, IpAddress100% DC10–60s高,注意 Subject/Target 区分
CloudTrailS3+SQS 拉取eventName, userIdentity.arn, sourceIPAddress100% 区域2–15min中,延迟高,适合事后调查
DNS 查询日志syslog 推送query, answer, client_ip80%1–5s中,部分终端未覆盖
Nginx accessFilebeat 读文件status, uri, method, user_agent100% Web1–10s高,但需解析自定义格式
盘点小技巧:先按“检测用例 → 所需字段 → 数据源”倒推,而不是先把所有日志接进来再想怎么用。这样能优先补齐真正影响检测覆盖率的数据源,避免存储成本失控。
常见误区:把“日志已接入”等同于“数据可用”。接入只是第一步,字段语义、覆盖度、延迟和保真度任何一项不达标,都会让检测规则在生产环境中失效或产生大量误报。盘点时必须用真实查询验证,而不是依赖文档描述。

完成本章盘点后,你应当能够为每一条待实现的检测规则标注其依赖的数据源、关键字段与可用性等级,并据此判断该规则是“可立即上线”“需补充数据源”还是“当前不可实现”。这份清单也是后续检测规则工程化、调优与复盘的基线。