InfraGuard

检测规则集

一个只读目录,把 InfraGuard 观测到的每一条检测规则归一化为 11 个类别下的 44 个规则集,显示实时触发计数,并在点击后展示各规则集所匹配的最近事件。

概述 — 这个页面做什么

检测规则集(/security/rulesets)是把 InfraGuard 观测并判定的每一条检测规则归一化为 11 个类别下的 44 个规则集的正本库。该页面在一处完成三件事:

  1. 概览 — 在类别分区中排布规则集卡片,并针对所选时间窗口(1h/6h/24h)显示每个规则集匹配到的实际事件数和最后出现时间。
  2. 解说 — 分三步讲解每个规则集(检测什么 · 为何触发 · 最坏情况)。
  3. 回放 — 点击卡片会打开一个模态框,以按引擎区分的表格展示该规则集实际匹配到的最近事件。

设计上的关键是把分类结构与解说文本分离。结构(类别、规则集键、各引擎的匹配规约)位于与语言无关的静态 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

何时使用

页面布局

顶部 KPI

KPI 标签 含义
total 规则集 目录中的规则集总数(恒为 44)
active 已观测规则集 在窗口内至少触发过一次事件的规则集(firing)
events 窗口内事件 所有规则集事件数之和
cats 类别 类别数量(11)

内部还会计算各引擎的合计(kitsune 与 suricata 的事件总数),以便数字与安全防御漏斗的「规则集」阶段保持一致。

控件

类别分区与规则集卡片

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> 并打开一个模态框,其中包含:

按引擎区分的事件表列:

引擎 列
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)

性能与缓存

访问权限

级别约定: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 下管理。

相关内容

탐지 룰셋 카탈로그
탐지 룰셋 카탈로그