4. 关联规则设计原则

关联规则工程中最常见的失败模式,不是规则写不出来,而是规则写出来之后没人敢用:告警太多被忽略,或者关键攻击被漏掉。要避免这种局面,规则设计必须从检测目标出发,而不是从日志字段出发。换句话说,先明确“我要发现什么行为”,再反推需要哪些数据源、哪些字段、什么时间窗口和什么阈值。

一、从检测目标出发:先定义行为,再定义规则

检测目标应当是可观察、可判定的行为描述,而不是模糊的安全愿望。例如“检测横向移动”过于宽泛,而“同一账户在 5 分钟内从两台不同主机发起 SMB 登录,且目标主机此前未出现过该账户”就是一个可落地的检测目标。它明确了主体(账户)、动作(SMB 登录)、对象(目标主机)、时间窗口(5 分钟)和基线条件(此前未出现)。

从检测目标到规则,需要经过一次“数据可行性”校验:所需字段是否被采集?字段是否稳定?时间戳精度是否足够?如果数据源缺失或字段为空率高,再好的检测目标也无法实现。因此规则设计的第一步不是打开规则编辑器,而是确认数据链路。

检测目标拆解示例:

  • 行为:账户在短时间内从多台主机登录
  • 数据源:Windows 安全日志 4624(登录成功)
  • 关键字段:TargetUserName、IpAddress、WorkstationName、LogonType
  • 时间窗口:5 分钟
  • 阈值:不同 WorkstationName 数量 ≥ 2
  • 排除条件:服务账户白名单、已知跳板机

二、误报与漏报权衡:没有零误报的规则

误报(False Positive)和漏报(False Negative)是一对天然矛盾。阈值收紧,误报下降但漏报上升;阈值放宽,漏报下降但误报上升。规则工程师的任务不是消灭误报,而是把误报控制在可运营的范围内,同时保证关键攻击路径不被漏掉。

权衡时可以参考三个维度:攻击危害、行为普遍性、数据可信度。危害高、行为罕见、数据可信的检测目标,可以接受较高误报;危害低、行为普遍、数据噪声大的目标,则应优先降噪或改为关联多个条件。

实际操作中,常用手段包括:增加关联条件(如登录成功 + 进程创建)、引入白名单(服务账户、扫描器、运维跳板)、设置合理的抑制窗口(同一实体 10 分钟内只告警一次)、以及分级告警(低置信度进入观察队列,高置信度直接告警)。

关联规则设计权衡与可维护性结构 检测目标 行为 + 主体 + 对象 + 时间窗口 + 基线 数据可行性校验 字段采集 / 空值率 时间戳精度 / 数据源 规则逻辑设计 关联条件:登录 + 进程 + 网络 阈值:次数 / 实体数 / 频率 时间窗口:滑动 / 固定 白名单:账户 / 主机 / 网段 抑制:同实体去重窗口 分级:高置信 / 观察队列 误报 / 漏报权衡 攻击危害 ↑ → 容忍误报 行为普遍 ↑ → 优先降噪 数据可信 ↑ → 可收紧阈值 数据噪声 ↑ → 增加关联条件 关键路径 → 禁止漏报 低危行为 → 观察队列 可维护性:命名规范 + 文档化 + 版本管理 规则ID / 名称 / 描述 / 数据源 / 阈值 / 白名单 / 变更记录 / 负责人 设计闭环:检测目标 → 数据校验 → 规则逻辑 → 误报/漏报评估 → 命名与文档 → 上线观察 → 迭代调优 每次变更必须记录:变更原因、影响范围、回滚方式、验证结果,确保规则可追溯、可交接、可复现。

三、规则可维护性:让规则能被别人接手

规则不是一次性代码,而是长期运行的资产。可维护性差的表现包括:规则名称含义不明、阈值散落在多个地方、白名单硬编码在规则内部、没有版本记录、变更后无人知道影响范围。这些问题在人员流动或规则数量增长后会迅速放大。

提升可维护性的核心做法是“配置与逻辑分离”。把阈值、白名单、时间窗口、抑制周期等参数抽到外部配置或变量中,规则主体只保留关联逻辑。这样调整阈值不需要改规则结构,也便于批量管理和审计。

另一个关键点是规则分层。基础规则负责单事件过滤和字段标准化,关联规则负责多事件组合,告警规则负责分级和抑制。分层之后,每层职责单一,修改一层不会意外影响另一层。

四、命名规范与文档化:规则的可读接口

命名规范是规则的第一层文档。一个好的规则名称应当包含:检测目标、数据源、关键条件、严重级别。例如 WIN-SMB-LateralMove-MultiHost-Login-Medium,从名称就能看出平台、协议、行为、条件和级别。避免使用 rule_001、test_rule、new_rule_v2 这类无意义名称。

文档化不是写一篇长文,而是把规则的关键决策点记录下来。建议每条规则至少包含以下字段:

字段说明示例
规则ID全局唯一,便于引用和审计SIEM-CORR-0042
规则名称包含目标、数据源、条件、级别WIN-SMB-LateralMove-MultiHost-Login-Medium
检测目标可判定的行为描述同一账户5分钟内从≥2台主机发起SMB登录
数据源日志类型和字段Windows 4624,TargetUserName/WorkstationName
阈值与窗口可调参数,不硬编码不同主机数≥2,窗口300秒
白名单排除已知合法行为服务账户、跳板机、扫描器
误报评估上线前观察结果日均告警约12条,其中约3条需人工确认
变更记录时间、原因、影响、回滚2025-03-10 调整窗口从600s到300s,降低误报
负责人规则维护责任人安全运营组-张三

命名建议:采用“平台-协议/行为-条件-级别”的结构,全部使用英文大写和连字符,避免空格和中文。级别可用 Critical/High/Medium/Low 或 P1/P2/P3/P4,但全组织必须统一。

常见误区:把白名单直接写死在规则条件里。一旦需要新增排除项,就必须修改规则逻辑,容易引入新错误。正确做法是把白名单作为独立配置表或变量引用,规则只负责判断“是否在白名单中”。

五、一个可参考的规则设计检查清单

在规则上线前,可以用以下清单快速自检。它不是强制流程,但能有效减少低级错误:

  • 检测目标是否可以用一句话描述清楚?
  • 所需字段是否已确认采集且空值率可接受?
  • 阈值和时间窗口是否外部可配?
  • 白名单是否独立管理?
  • 是否评估过误报量和漏报风险?
  • 规则名称是否符合命名规范?
  • 是否记录了变更原因和回滚方式?
  • 是否有明确的负责人和复核人?

规则设计不是追求“一次写对”,而是建立可迭代、可审计、可交接的工程习惯。从检测目标出发保证方向正确,误报与漏报权衡保证运营可行,可维护性保证长期存活,命名规范与文档化保证团队协作顺畅。四者缺一不可,共同构成关联规则工程的基础。