InfraGuard

安全问题处理

把安全事件与入侵按 已登记 → 分析中 → 已查明原因 → 已解决 → 已关闭 的流程推进的案例看板,并自动跟踪由安全诊断升级而来的严重发现。

概述 —— 这个页面做什么

安全 ▸ 问题处理 把安全事件与入侵响应作为一块统一的案例看板来管理,流水线共五个阶段:

open → investigating → cause_identified → resolved → closed

每个案例都带有**「500 报告」结构**(直接原因/根本原因/解决措施/防范行动)和一条可审计的时间线。本页面是 服务 ▸ 问题处理 控制器的镜像:两者共用同一张 infr_incident 表,但本页面按 area='security' 过滤,从而把安全案例与服务事件分开。

案例进入这块看板有两条途径:

  1. 手动登记 —— 由运维人员创建案例。可选的 source:manual · agency · quarantine。
  2. 诊断升级 —— 安全诊断 中 fail + crit 的发现会被自动升级为案例(source=detection)。这是仅由系统写入的 source,操作人员无法手动选择。

本控制台不会直接操作远端的 crontab 或防火墙。它是一个记录并跟踪人工响应过程的工作流工具。真正的封禁/隔离动作在 封禁列表 和 自动封禁 中执行。


什么时候用


页面布局

KPI 条

KPI 定义
total area='security' 的案例总数
active open + investigating + cause_identified 之和
resolved resolved + closed 之和
MTTR 同时具有 occurred_at 与 resolved_at 的案例的平均分钟数
downtime 全部案例 downtime_min 之和
uptime target OpsPolicy::slaDefaults()['uptime_target']

案例看板

案例按以下顺序排序:

  1. 状态排序 —— open → investigating → cause_identified → resolved → closed
  2. 严重程度排序 —— crit → warn → info
  3. 最新优先 —— id 降序

每张卡片显示标题、严重程度、状态、source 徽标、关联的项目/服务、发生时间、停机时长以及事件条数。

详情弹窗

打开一个案例后,会分为左右两栏:

点击顶部的状态流水线会打开阶段迁移对话框,其中给出「本阶段该做什么」的指引,并允许就地更新该阶段的报告字段。


使用方法

创建案例(手动)

  1. 点击顶部的 [登记案例]。
  2. 填写标题(必填)、严重程度和 source(manual / agency / quarantine)。
  3. 可选填写项目、服务、URL、发生时间、影响范围、停机时长(分钟)。
  4. [保存] —— 以 status=open、area=security、detected_at=now() 创建新案例,并向时间线写入一条 created 事件。

source 列表中没有 detection —— 它是仅由系统写入的 source,由安全诊断自动生成。

状态迁移(流水线)

在详情弹窗的流水线上点击目标状态。各阶段建议开展的工作如下:

阶段 本阶段该做什么
open 退回到受理状态(分析开始之前)
investigating 确认现象、评估影响范围、写出摘要
cause_identified 判定并记录直接原因与背景(根本)原因
resolved 记录恢复方法与防范行动
closed 确认处置与防范措施均已落实,然后关闭案例

服务端的迁移规则:

协作备注

在详情弹窗中添加备注,会在时间线上记录一条 kind=note 事件。系统没有单独的备注表 —— 备注统一并入 infr_incident_event。

删除

删除案例时会同时删除其 infr_incident_event 记录,并写入审计日志。(升级来源的那次诊断扫描是独立的,不会被删除。)

升级案例的自动解决

当 安全诊断 接收到一次探针结果时,DiagnosticsService::reconcileCases() 会按主机逐一核对案例:

自动解决只在对应的诊断检查再次通过时才会触发。手动创建的案例(manual/agency/quarantine)永远不会被自动解决 —— 必须由操作人员沿流水线推进。


数据来源

数据表

数据表 作用
infr_incident 案例主体(按 area='security' 过滤)。状态、严重程度、source、「500 报告」字段、发生/解决/关闭时间、fingerprint、occurrence_count
infr_incident_event 案例时间线(创建、备注、状态变更……)
infr_project 供关联选择的项目列表
infr_service 供关联选择的服务列表

枚举值

STATUSES   = [open, investigating, cause_identified, resolved, closed]
SEVERITIES = [info, warn, crit]
SOURCES    = [manual, pulse, alert, agency, quarantine, detection]   # 全部
manual-selectable sources = [manual, agency, quarantine]
OPEN_STATUSES (dedup targets) = [open, investigating, cause_identified]
AREAS = [service, security]   # 共用表的划分轴

报告字段(500 结构)

字段 含义
summary 现象/影响摘要
direct_cause 直接原因(例如 MySQL Too many connections)
root_cause 背景/根本原因(例如脚本连接泄漏)
resolution 事件期间实施的恢复措施
action_taken 面向今后的防范行动
downtime_min 停机时长(分钟)—— downtime KPI 的数据来源
impact 受影响范围

API 端点

方法 · 路径 用途
GET /security/resolution 看板首次渲染
GET /security/resolution/live 轮询刷新(案例、KPI、时间戳)
POST /security/resolution/save 创建/更新案例
POST /security/resolution/transition 状态迁移(+可选的备注/报告更新)
POST /security/resolution/note 添加协作备注
POST /security/resolution/delete 删除案例

访问权限


故障排查与常见问题

Q. 在服务看板上看到的案例,这里却没有。 两块看板共用同一张 infr_incident 表,但按 area 划分。本页面只显示 area='security'。服务事件请到 服务 ▸ 问题处理 中查找。

Q. 我无法用 detection 这个 source 创建案例。 这是预期行为。detection 是仅由系统写入的 source,由 安全诊断 从 fail+crit 的发现中自动创建。手动登记只提供 manual、agency、quarantine。

Q. 一个自动升级的案例自己变成了已解决。 当后续扫描中对应的诊断检查通过时,reconcileCases() 会自动解决这条未结案例:resolution 会被填入自动解决说明文本,并追加一条状态变更事件。

Q. MTTR 是空的。 MTTR 只针对同时具有 occurred_at 与 resolved_at 的案例计算。没有发生时间、或尚未解决的案例都会被排除。

Q. 可以把关闭时间设成过去的时刻吗? 可以。在关闭对话框的关闭时间字段中填入数值(与发生时间是同一种输入界面),系统会原样保存。留空时,服务端仅在尚无值的情况下才填入 now()。

Q. 删除案例会连同它的诊断扫描一起删掉吗? 不会。升级而来的案例与作为其来源的诊断扫描相互独立。删除案例只会移除与之关联的时间线事件。


相关内容

보안 문제 해결 보드
보안 문제 해결 보드