概述 — 这个页面做什么
安全 ▸ 威胁(/security/threats)把 Suricata IDS 告警表 suricata_alert_ct 重组为用于研判的 来源 IP(src_ip)实体 视图。它不罗列成千上万条原始告警,而是归纳为「谁(哪个 IP)打了我们、打得多狠、用什么手法」,并按严重程度排序。
它在一个页面上把三件事串联起来:
- 威胁实体研判 — 每个 src_ip 一张卡片,汇总告警数量、最高严重程度、不同签名数和最后出现时间。
- 自动处置(封禁)联动 — 把每个威胁 IP 的 /24 与自动防御表
blacklist_info匹配,附上 已封禁 / 已检测 徽章,让检测与响应读起来是同一个故事。 - 签名释义(Signature Lore) — 多数 Suricata 签名字符串是难以阅读的引擎事件(stream / decoder / app-layer 事件),而不是内容规则。本页在释义面板中讲述 每条签名实际暗示了什么(检测到了什么 · 为什么触发 [benign→malicious] · 需要留意什么 · 最坏情况)。
一切都是 只读 的。唯一改变状态的操作,是把威胁 IP 送往 封禁列表 的深层链接;真正的封禁写入在那里、在单独的权限下完成。
何时使用
- 早班研判:快速浏览过去 24 小时攻击你最多的 IP 及其严重程度。
- 判断某个 IP 是真实威胁还是噪声 — 通过释义的 [benign/watch/malicious] 语气和自动封禁徽章快速分类。
- 向同事解释「这条签名到底是什么意思」 — 释义面板同时也是一份教学材料。
- 调查完威胁 IP 后把它提升为封禁候选(→ 封禁列表 深层链接,→ IP 信誉 弹窗)。
页面布局
顶部 KPI(按时间窗口统计)
| KPI | 含义 | 计算方式 |
|---|---|---|
| alerts | 窗口内 IDS 告警总数 | suricata_alert_ct 中 alert_ts >= since 的计数 |
| entities | 威胁 IP 实体数 | 排名靠前的 src_ip(最多 48 个) |
| blocked | 已被自动封禁的威胁 IP | 实体的 /24 ∈ blacklist_info(is_use=1) |
| critical | 未处置的 危急威胁 IP(观测总数见 critical_all) |
max_sev <= 1 且尚未封禁的实体 |
威胁实体卡片/行
按告警数量降序显示最多 48 个 src_ip。每个实体包含:
| 字段 | 说明 |
|---|---|
ip |
来源 IP(src_ip) |
alerts |
该 IP 在窗口内的告警数量 |
sev |
最高严重程度(1=危急 … 3=信息)。Suricata:数值越小越严重 → MIN(severity) 即为最高 |
sigs |
不同签名(sid)数 — 攻击手法的多样性 |
last_ts |
最后观察到的时间 |
blocked |
若该 IP 的 /24 在自动封禁列表中则为 true |
block_source |
封禁来源标签:kitsune · suricata · manual · other(从 reason 字符串解析) |
country / asn |
地理/ASN 富化(ip_info_loop 最新一行) |
你自己的网络会被排除。
SecurityScope::excludePrefixes()用NOT LIKE过滤掉已登记 实例 IP 的 /24(以及来自 运维策略 的内网白名单),因此你自己的服务器不会作为来源出现、把威胁列表塞满。如果某个内网 IP 因方向标签仍然出现,会附上(由internalMatchers驱动的)internal徽章,并隐藏信誉查询按钮。
严重程度分布 · 类别 · 签名
- 严重程度分布:
{1: n, 2: n, 3: n}— 危急/警告/信息级告警数量。 - 类别:排名前 10 的类别(按数量降序)及各自的最小严重程度。
- 签名:排名前 12 的签名(按数量降序)。每项包含
signature·sid·cnt·sev(最小值),外加explain(SignatureLore 的分类结果)。点击某条签名会打开旁边的释义面板。
签名释义面板
App\Support\SignatureLore::classify() 把签名字符串归类为 族(family) 和 细分键;真正的文案位于 resources/lang/{ko,en}/siglore.php 语言包。前端把 family 与 key 合并(细分覆盖族),渲染成四段式叙述。
| 部分 | 内容 |
|---|---|
| 检测到了什么(meaning) | 该签名在协议层面捕获到了什么 |
| 为什么触发 · 可能性(why) | 按语气列出候选原因 [benign] → [watch] → [malicious] |
| 需要留意什么(caution) | 如何把噪声与真实信号区分开 |
| 最坏情况(worst) | 若置之不理可能导致的入侵后果 |
每个族都带有 暗示的严重程度(tone) — 即使是信息级事件,其暗示的内容也各不相同。
| family | 标签 | tone | 图标 |
|---|---|---|---|
stream |
TCP 流重组异常 | warn | mdi-transit-connection-variant |
decoder |
数据包解码/完整性异常 | info | mdi-package-variant-closed |
applayer |
应用层协议异常 | warn | mdi-swap-horizontal-bold |
http |
HTTP 解析异常 | warn | mdi-web |
tls |
TLS 异常 | warn | mdi-lock-outline |
dns |
DNS 异常 | warn | mdi-dns-outline |
scan |
扫描/侦察 | warn | mdi-radar |
exploit |
漏洞利用尝试 | crit | mdi-bug-outline |
malware |
恶意软件/C2 | crit | mdi-virus-outline |
dos |
DoS/洪泛 | crit | mdi-flash-alert-outline |
policy |
策略/信息 | info | mdi-file-document-outline |
generic |
其他 IDS 签名 | info | mdi-shield-alert-outline |
细分键覆盖项共有 14 个:invalid_timestamp · checksum · retransmit · handshake · evasion · stateanomaly · host_header · desync · malformed · one_direction · mismatch · starttls · tls_anomaly · unsolicited。
多数 stream/decoder 签名(例如
SURICATA STREAM Packet with invalid timestamp、SURICATA TCPv4 invalid checksum)都是 sev3 信息级,并且会因非对称路由、网卡校验和卸载等基础设施特性 成批 触发 — 属于无害噪声。与其盯着签名本身,不如关注 同一个 src_ip 是否在短时间内叠加了多个族(扫描 + 握手异常等)。这种叠加才是意图的信号。
操作步骤
1) 选择时间范围
默认窗口为 24h。支持的范围:
| range | 窗口(分钟) |
|---|---|
1h |
60 |
6h |
360 |
24h |
1440(默认) |
切换项通过 ?range= 传递;不在白名单中的取值会降级为 24h。
2) 研判威胁 IP
- 从严重程度最高(
sev=1危急)且告警数量最多的实体开始。 - 已封禁 徽章表示自动防御已经响应 — 查看
block_source可知是哪个引擎封禁的。 - 未封禁 + 高严重程度 + 多种签名 就是你首要的调查/封禁候选。
3) IP 下钻(安全专用浮层)
点击 IP 会调用 GET /security/threats/ip-detail?ip=<IP>&range=<range>。IP 会用 FILTER_VALIDATE_IP 严格校验;非法取值返回 422(invalid_ip)。返回字段:
{
"ok": true,
"detail": {
"ip": "203.0.113.10",
"cidr": "203.0.113.0/24",
"geo": { "country": "US", "city": null, "asn": "ASNNNNN", "isp": "...", "org": "..." },
"signatures": [
{ "signature": "...", "severity": 3, "cnt": 42, "explain": { "family": "stream", "key": "invalid_timestamp", "tone": "warn", "icon": "mdi-...", "svg": "stream" } }
],
"blocked": true,
"block_source": "suricata",
"block_reason": "[Suricata Auto-Block] ...",
"block_at": "2026-08-13 04:12:00",
"abuse_url": "https://www.abuseipdb.com/check/203.0.113.10"
}
}
- geo/ASN:
ip_info_loop富化。 - signatures:该 IP 排名前 8 的签名(按数量降序),每条附带其
explain释义。 - 封禁状态:与
blacklist_info(c_class、is_use=1)的 /24 匹配 → 来源标签 · 原始 reason · 封禁时间。
4) 查询信誉 · 提升为封禁
- 点击 IP 旁边的符号(
.infr-ipsym)→ IP 信誉 的 AbuseIPDB 应用内弹窗(mixins/abuse_check.js+/security/ip-reputation)。它会显示滥用可信度、举报次数、国家、用途类型和最近的举报详情。 - 调查后决定封禁 → 带
?add=<IP>深层链接到 封禁列表(插入时归一化为 /24,在单独的权限与审计下执行)。
数据来源
| 表 | 用途 | 访问 |
|---|---|---|
suricata_alert_ct |
IDS 告警(src_ip · severity · category · signature · sid · alert_ts) | 读取 |
blacklist_info |
自动封禁列表(/24 的 c_class · reason · country · is_use) |
读取(自动处置徽章) |
ip_info_loop |
地理/ASN/ISP 富化 | 读取 |
| 已登记 实例 IP + 运维策略 内网网段 | 排除自身网络 · internal 徽章 | SecurityScope |
所有数据源都位于
legacy_glory连接上(由采集器集群写入的无前缀遗留表),且为 只读。读取骨干是App\Repositories\SecurityRepository(参数绑定 · 窄时间窗 · LIMIT)。控制器/服务从不创建或修改这些表。
缓存 · 刷新
ThreatService::build()的结果按范围 缓存 30 秒(键infr:sec:th:<range>)。- 页面通过 30 秒轮询(
/security/threats/live)刷新 — 不是 Reverb。 - 因为最高严重程度用
MIN(severity)计算,所以sev数值 越小越危险(1=危急,3=信息)。
访问权限
| 操作 | 级别 |
|---|---|
| 查看页面 · 下钻 · 信誉查询 | ≥ 2(staff=5,admin=10) |
| 演示(1)访问 | 拒绝 |
- 整个
/security/*前缀由infr.level:2中间件保护。演示(1)被限制访问安全数据(RBAC 级别)。 - 威胁页面本身 全部是 GET(只读),因此不是审计写入的对象。封禁写入或滥用举报这类破坏性/对外操作,分别在 封禁列表 和国际协作流程中,在各自的权限与审计下执行。
排障与常见问题
Q. invalid timestamp / invalid checksum 占了绝大多数 — 这是攻击吗?
通常不是。invalid checksum 会因网卡校验和卸载在你自己服务器的流量上成批触发;invalid timestamp 则来自非对称路由和中间盒。两者都是 sev3 无害噪声 — 释义中的 [benign] 条目正是在解释这一点。只有当它们集中在某个特定的外部 src_ip、并且该 IP 还叠加了其他信号(扫描 · 握手异常)时才需要怀疑。
Q. 为什么严重程度 1 是最危急的?
按 Suricata 的约定,severity 1=高、2=中、3=信息。因此实体的最高风险用 MIN(severity) 计算。
Q. 我自己服务器的 IP 出现在威胁列表里。
SecurityScope 会排除已登记实例的 /24 和内网白名单,但未登记的 IP 或方向(src/dst)标签仍可能让它浮现。请在 实例 中登记该 IP,或在 运维策略 中添加该网段。如果仍然显示,会附上 internal 徽章。
Q. IP 下钻返回 422。
ip 参数不是有效 IP(invalid_ip)。请确认它是真实的 IPv4/IPv6 取值。
Q. 释义只显示「其他 IDS 签名」。
任何 SignatureLore::match() 关键词规则都匹配不到的签名,会回退到 generic 族。请依据类别和签名名称判断,必要时在 siglore.php 中添加细分键。
Q. 列表 30 秒都没有变化。 这是预期行为。服务使用按范围的 30 秒缓存加上 30 秒轮询。如果需要立刻拿到最新值,请在缓存过期后重新加载(强制重新计算)。
相关内容
- 安全概览 — 威胁→检测→响应的防御漏斗(核心页面)
- 检测与 JA3 — Kitsune ML · srct 启发式 · JA3 序列异常
- 规则集 — 44 条规则集的检测目录正本
- 封禁列表与信誉 — 查看/添加/解除自动封禁(
blacklist_info) - IP 信誉 — AbuseIPDB 应用内信誉弹窗
- 白名单 — 免于封禁的 IP/CIDR
