InfraGuard

威胁 — IDS 威胁研判

把 Suricata IDS 告警按来源 IP 实体进行研判,配有自动封禁联动徽章,以及解释每条检测真正含义的签名释义。

概述 — 这个页面做什么

安全 ▸ 威胁(/security/threats)把 Suricata IDS 告警表 suricata_alert_ct 重组为用于研判的 来源 IP(src_ip)实体 视图。它不罗列成千上万条原始告警,而是归纳为「谁(哪个 IP)打了我们、打得多狠、用什么手法」,并按严重程度排序。

它在一个页面上把三件事串联起来:

  1. 威胁实体研判 — 每个 src_ip 一张卡片,汇总告警数量、最高严重程度、不同签名数和最后出现时间。
  2. 自动处置(封禁)联动 — 把每个威胁 IP 的 /24 与自动防御表 blacklist_info 匹配,附上 已封禁 / 已检测 徽章,让检测与响应读起来是同一个故事。
  3. 签名释义(Signature Lore) — 多数 Suricata 签名字符串是难以阅读的引擎事件(stream / decoder / app-layer 事件),而不是内容规则。本页在释义面板中讲述 每条签名实际暗示了什么(检测到了什么 · 为什么触发 [benign→malicious] · 需要留意什么 · 最坏情况)。

一切都是 只读 的。唯一改变状态的操作,是把威胁 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 徽章,并隐藏信誉查询按钮。

严重程度分布 · 类别 · 签名

签名释义面板

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

  1. 从严重程度最高(sev=1 危急)且告警数量最多的实体开始。
  2. 已封禁 徽章表示自动防御已经响应 — 查看 block_source 可知是哪个引擎封禁的。
  3. 未封禁 + 高严重程度 + 多种签名 就是你首要的调查/封禁候选。

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"
  }
}

4) 查询信誉 · 提升为封禁

数据来源

表 用途 访问
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)。控制器/服务从不创建或修改这些表。

缓存 · 刷新

访问权限

操作 级别
查看页面 · 下钻 · 信誉查询 ≥ 2(staff=5,admin=10)
演示(1)访问 拒绝

排障与常见问题

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 秒轮询。如果需要立刻拿到最新值,请在缓存过期后重新加载(强制重新计算)。

相关内容

IDS 위협 트리아지
IDS 위협 트리아지