概述 — 这个页面做什么
检测规则集(/security/rulesets)是把 InfraGuard 观测并判定的每一条检测规则归一化为 11 个类别下的 44 个规则集的正本库。该页面在一处完成三件事:
- 概览 — 在类别分区中排布规则集卡片,并针对所选时间窗口(1h/6h/24h)显示每个规则集匹配到的实际事件数和最后出现时间。
- 解说 — 分三步讲解每个规则集(检测什么 · 为何触发 · 最坏情况)。
- 回放 — 点击卡片会打开一个模态框,以按引擎区分的表格展示该规则集实际匹配到的最近事件。
设计上的关键是把分类结构与解说文本分离。结构(类别、规则集键、各引擎的匹配规约)位于与语言无关的静态 SOT App\Support\SecurityRulebook(对缓存安全),而解说文本(名称、含义、依据、风险)位于 resources/lang/{ko,en}/secrules.php。前端按 key+category 合并两者进行渲染。
本页面严格只读。它不会启用、停用、编辑或删除规则集。它是一份参考目录,回答「当前本组织正在观测什么,这意味着什么」。真正修改检测常量(阈值/窗口)的地方是 规则与阈值(管理 ▸ 规则)。
44 个规则集都接到了真实遥测数据
规则集并非抽象规则 — 每一个都通过**匹配规约(match)**绑定到真实的采集表。所有数据源都在 legacy_glory 连接上(由采集器集群填充的遗留数据库)。
| 引擎 | 匹配规约 | 源表 | 规则集 |
|---|---|---|---|
| Suricata IDS | sig:对签名片段数组做小写子串匹配 |
suricata_alert_ct |
33 |
| Web(nginx) | classifyWeb:按 url/ua/status 对 is_suspicious 请求做带优先级的互斥分类 |
nginx_meta_ct |
8 |
| Kitsune ML | source=kitsune:自编码器判定的异常 IP |
kitsune_detail_log |
1 |
| 启发式(srct) | source=srct:扫描/速率启发式运行记录 |
srct_process_log |
1 |
| JA3 指纹 | source=ja3:每个来源 IP 的 JA3 多样性(轮换) |
suricata_tls_ct |
1 |
何时使用
- 研判前先获取背景 — 在 威胁 或 检测 · JA3 中遇到陌生签名时,确认它属于哪个规则集族、意味着什么。
- 纵览观测态势 — 一眼看出过去 24h 内哪些类别正在触发,以及 Web 攻击处于侦察阶段还是已升级为 RCE 探测。
- 新人培训与汇报 — 按类别和引擎说明「我们检测什么」的培训/汇报素材。
- 回放事件 — 查看某个规则集(例如
web_secret_scan)最近实际匹配到的请求来源 IP、URL 与状态码,再把可疑对象转到 IP 信誉 或 封禁列表。
页面布局
顶部 KPI
| KPI | 标签 | 含义 |
|---|---|---|
total |
规则集 | 目录中的规则集总数(恒为 44) |
active |
已观测规则集 | 在窗口内至少触发过一次事件的规则集(firing) |
events |
窗口内事件 | 所有规则集事件数之和 |
cats |
类别 | 类别数量(11) |
内部还会计算各引擎的合计(kitsune 与 suricata 的事件总数),以便数字与安全防御漏斗的「规则集」阶段保持一致。
控件
- 窗口切换 —
1h(60 分钟)·6h(360 分钟)·24h(1440 分钟)。默认24h。 - 自动刷新(LIVE) — 轮询
/security/rulesets/live以刷新计数(可暂停)。 - 全屏 — 隐藏顶部导航,进入沉浸式仪表盘模式(按 ESC 退出)。
类别分区与规则集卡片
11 个类别按显示顺序构成分区,每个分区内的规则集排布在 minmax(600) 的卡片网格中。每张卡片显示规则集名称、MDI 图标、严重度徽标(crit/warn/info)、窗口内事件数、最后出现时间以及 [Open]。没有事件时显示「静默/窗口内未观测到」。
| # | 类别键 | 标签 | 引擎 | 规则集 |
|---|---|---|---|---|
| 1 | tcp_stream |
TCP 流完整性 | Suricata | 10 |
| 2 | packet_decode |
数据包解码 | Suricata | 4 |
| 3 | protocol_anomaly |
协议异常 | Suricata | 5 |
| 4 | http_anomaly |
HTTP 合规性 | Suricata | 5 |
| 5 | tls_anomaly |
TLS 异常 | Suricata | 5 |
| 6 | dns_anomaly |
DNS 异常 | Suricata | 1 |
| 7 | mail_anomaly |
邮件(SMTP)异常 | Suricata | 3 |
| 8 | web_attack |
Web 攻击模式 | nginx | 8 |
| 9 | ml_anomaly |
ML 异常检测 | Kitsune | 1 |
| 10 | heuristic_scan |
启发式扫描 | srct | 1 |
| 11 | tls_fingerprint |
JA3 指纹 | JA3 | 1 |
使用方法
1) 选择窗口 → 读取整体态势
首先选择关心的窗口(1h/6h/24h)。用 active(已观测规则集)和每张卡片的事件数看出当前正在触发什么。注意严重度徽标表示的是隐含严重度 — Suricata 的引擎事件大多是 sev3(信息级),但其隐含意义各不相同(噪声/扫描/利用)。规则集徽标反映的是这种隐含语气,而非原始 sev。
2) 点击卡片 → 最近事件模态框
点击卡片会调用 /security/rulesets/events?key=<rulesetKey>&range=<window> 并打开一个模态框,其中包含:
- 三步解说 — 检测什么 · 为何触发 · 最坏情况。
- 汇总值 — 事件数 · 唯一来源(distinct 的 src IP)。
- 匹配签名标签(仅 Suricata) — 该规则集的 sig 子串匹配所捕获的实际签名字符串,各自带计数和最小 sev(前 12 条)。
- 按引擎区分的事件表(最近 60 行)。
- 来源 IP → 信誉 — 每个 src IP 都有一个 AbuseIPDB 弹窗按钮。已登记的内网 IP 会带上
internal徽标并隐藏信誉按钮(避免把自家服务器误认成攻击者)。
按引擎区分的事件表列:
| 引擎 | 列 |
|---|---|
| Suricata | 时间 · src · dst · 端口 · proto · 签名 · sev |
| nginx | 时间 · src · 主机 · 方法 · URL(rawurldecode,180 字符)· 状态码 |
| Kitsune | 时间 · IP · 异常分数 · 会话数 · 已封禁 |
| srct | 时间 · 已扫描 · 已封禁 · 备注 |
| JA3 | 时间 · IP · JA3 多样性 · TLS 连接数 · SNI 多样性 |
3) Web 攻击分类优先级(互斥)
8 个 Web(nginx)规则集彼此互斥。单条 is_suspicious=1 请求会按目录定义顺序扫描,并恰好归属于首个匹配到的规则集;若都不匹配,则落入兜底规则集(web_suspicious_other)。因此同一条请求绝不会在两个 Web 规则集中被重复计数。
| 优先级 | 规则集键 | 匹配线索(url/ua) | 严重度 |
|---|---|---|---|
| 1 | web_secret_scan |
.env .git wp-config id_rsa .aws credentials backup.sql .bak |
warn |
| 2 | web_path_traversal |
../ ..%2f %2e%2e etc/passwd boot.ini proc/self |
crit |
| 3 | web_sqli |
union select information_schema sleep( or 1=1 %27or |
crit |
| 4 | web_xss |
<script onerror= javascript: document.cookie |
warn |
| 5 | web_rce_probe |
/bin/sh exec( system( jndi: ${ phpunit |
crit |
| 6 | web_admin_brute |
wp-login xmlrpc.php phpmyadmin /admin/login |
warn |
| 7 | web_bad_bot |
UA:sqlmap nikto masscan nuclei python-requests curl/ |
warn |
| 8 | web_suspicious_other |
(兜底 — 不匹配上述任何一项的可疑请求) | info |
出于性能考虑,Web 分类是在最近的 6,000 行样本(仓储上限 8,000)上做聚合。在大规模扫描期间,样本之外的事件可能未被反映 — 请把这些数字当作分布/趋势而非绝对计数来读。
4) Suricata 子串匹配意味着什么
Suricata 规则集通过对签名字符串做小写子串匹配来触发。例如 stream_invalid_ts 会把签名中包含 invalid timestamp 的所有事件累加起来。单个规则集可以捆绑多个实际签名(在模态框的「匹配签名」标签中可见),并且不同规则集的 sig 关键词在设计上互不重叠。
5) 实测示例(供参考)
一份示意性的 24h 快照:44 个规则集中有 37 个在触发,stream_invalid_ts 10,243,web_secret_scan 3,304(多为 .env 系列的 404),srct_heuristic 126,252,ja3_rotation 300(多样性 307/307)。数值因组织和时间而异。
数据源
所有数据源都是 legacy_glory 连接(只读),且仅通过 config('database.connections.legacy_glory') 访问 — 没有硬编码凭据。
| 规则集族 | 表 | 仓储方法(节选) |
|---|---|---|
| Suricata(33) | suricata_alert_ct |
signatureHistogram() · recentAlertsBySignatures() · distinctIpsBySignatures() |
| Web(8) | nginx_meta_ct(is_suspicious=1) |
suspiciousRows($since, 6000) |
| Kitsune ML(1) | kitsune_detail_log |
kitsuneCount() · kitsuneRecentInWindow() |
| 启发式(1) | srct_process_log |
srctBlockedSum() · srctRunsInWindow() |
| JA3(1) | suricata_tls_ct |
topJa3Ips($since, N, excludePrefixes) |
性能与缓存
- 卡片概览(
build)会缓存 30 秒(infr:sec:rulebook:<range>)。Suricata 只拉取一次签名直方图,然后在全部 44 个规则集上累加子串匹配,以避免 N+1。 - JA3 通过
SecurityScope::excludePrefixes()的 NOT LIKE 排除自有网段(已登记实例 IP 的 /24),并且只把ja3_variety >= 2的来源 IP 计为攻击者。 - 模态框事件每个窗口上限 60 行。所有仓储查询都使用窄时间窗口 + LIMIT + 参数绑定。
访问权限
- 只读。 控制器对读取的门槛是
level≥1,而进入安全角色区域本身受站点地图min_req=2(安全运营)保护 — 实际上是 staff(=5)、admin(=10)或具备安全作用域的用户才能到达。 - 由于不存在写入路径,因此没有升权二次确认,也没有审计日志。
/rulesets、/rulesets/live和/rulesets/events都是纯读取。 events端点的key仅允许来自目录白名单。列表之外的键返回404 unknown_ruleset(无法进行任意表查询)。
级别约定:demo=1 · staff=5 · admin=10。部分区域还会由
infr.level:N中间件额外把关。完整分级体系参见 RBAC 级别。
故障排查与常见问题
所有卡片都显示「静默」
要么是所选窗口(默认 24h)内没有匹配事件,要么是 legacy_glory 连接不可达。服务会优雅地吞掉数据源错误并显示空计数(0) — 卡片不会消失。请放宽窗口或检查连接。
Web 规则集计数与 [威胁] / [检测] 不一致
Web 分类是在最近 6,000 行样本上做的分布聚合(不是绝对计数)。它同时是互斥的,因此一条请求恰好归属于一个规则集。权威的事件来源以各页面自身的查询为准。
某个特定签名没有被任何规则集捕获
Suricata 的匹配是关键词子串匹配。目录未覆盖的新增/自定义签名不会被累加进任何规则集的计数。若要对其分类/解说,请把该签名关键词加入 SecurityRulebook 的 sig 数组 — 这是代码改动,不是运行时设置。
JA3 攻击者为 0,但 TLS 流量很大
JA3 规则集只把 ja3_variety >= 2(指纹轮换)的来源 IP 计为攻击者。没有轮换时,该来源被视为正常而不计入。自有网段的 IP 同样被排除。
事件模态框中某个 IP 带有 internal 徽标
那是由 SecurityScope::internalMatchers() 判定的已登记内网 IP。它可以避免把自家服务器 — 因 Suricata 的方向性可能被标为「来源」 — 误认成攻击者,并隐藏信誉按钮。内网定义在 运维策略 的 internal_networks 下管理。
相关内容
- 检测 · JA3 序列分析 — 上级页面(检测);确定性启发式会从 JA3 序列推导出新的规则集。
- 威胁 — IDS 威胁实体研判以及签名解说。
- 安全概览 — 与防御漏斗的「规则集」阶段保持一致。
- IP 信誉 — 用 AbuseIPDB 核查模态框中的来源 IP。
- 封禁列表 — 把可疑来源转为封禁。
- 规则与阈值(管理 ▸ 规则) — 真正调整检测采集器的常量(阈值/窗口)。
