瘦主表 + 分层子表。事实、检出、证据、实体、研判、案件、流转各归其位; AI 结论可解释、可追溯,且不可直接生效。
评审已确认的设计边界:对象分层、权威单写、AI 不直接生效。以下三条是全部表结构与链路设计的出发点。
Event 是事实、Alert 是检出、Analysis 是一次研判、Case 是工作对象;分层模型不回退大宽表。
每张表回答一个问题,权威只写一次;详情与 AI 证据包走预聚合读模型,不把宽行当写模型。MVP 部署检出三表,案件域延后。
每次研判只追加分析行并展开证据引用;正式 verdict 仅由人工或带 policy_id 的策略回写。
Event、Alert、Evidence、Entity、Case、Analysis、Cite、Workflow 各司其职、以引用关联; 区分当前快照与只追加记录。本页不表达运行时先后顺序。
发生了什么。完整事实按 event_id 回查,不被告警复制。
哪条检测认为值得看。当前快照,支撑列表与归属。
依据哪些事实。主体为 ALERT 或 CASE,二选一。
涉及谁、研判角色是什么(victim / attacker / affected…)。
这一次查下来结论是什么。只追加,每次研判一行。
谁来处理这组告警(待办)。不是「已确认的攻击」。
每次分析实际引用的证据及当时的主体快照。
分派、确认、关单、抑制、重开等动作,逐条追加。
事件进入 → 去重 → 证据与实体生成 → 代码 GATE → Case 编组 → AI / 人工研判 → 流转。 每个环节要么写当前快照,要么只追加记录。
dedup_key 幂等,派生 alert_idalert.case_id 当前归属
Event 是事实、Alert 是检出、Analysis 是一次研判、Case 是工作对象。
Case 不等于 Incident:case_kind 表示案件类型,与处理进度 workflow_status 相互独立。
发生了什么。来源侧声称是告警(event_category='alert')不等于平台检出。
哪条检测认为值得看。来源投影或本地检测,两种路径统一写入。
GATE / AI / 人工 / Playbook 的每次分析各占一行,只追加。
谁来处理这组告警。默认调查案件,升级才是正式事件。
| case_kind | 含义 | 进入方式 | 约束 |
|---|---|---|---|
INVESTIGATION |
调查案件,Case 的默认类型 | 新建 Case;或通过 DEMOTE_INCIDENT 从正式事件退回 |
误报、无害、演练和复核可以直接在此类型下关单 |
INCIDENT |
已确认的正式安全事件 | 人工或带 policy_id 的策略执行 PROMOTE_INCIDENT |
写入 promoted_time / promoted_by;AI、GATE 和自动编组不得直接设置 |
来源告警接入与本地行为检测。两条路径统一写入 Alert、Evidence、Entity; 完整事实保留在 Event 中,不复制日志正文。
第三方产品的断言(observation.assertion,物理列 source_finding_obj,M4 cutover 前为现行结构)投影为平台告警:标题成快照、事件主体客体(物理列 roles_obj)投影为 Entity、event_id 成为 Evidence 事实指针。
只消费检出类记录(逻辑 meta.source_record.record_kind=finding);纯行为日志不出穿透告警。告警 severity 只来源端断言的严重度(assertion.severity,物理 source_finding_obj)换算 INFO–CRITICAL,不再读事件的日志等级。
alert_type 固定 SOURCE_ALERT(禁止透传来源裸数字);category_code 禁止空串,对不上分类字典写 UNKNOWN。进告警的 N 条事件 = N 条 TRIGGER 证据 = event_count。
即使源产品内部是关联规则,也不写成平台 DETECTION。
接入由声明式映射契约驱动:每个源产品一份 standards/<source>-source-alert-mapping.json,生成器只抄契约,禁止代码内置源产品字典(ngsoc / tianqing 已定)。
行为日志由本地告警引擎完成规则匹配、时间窗口与聚合去重后生成检出:dedup → 聚合 → 生成 Alert。
检出触发日志作为 TRIGGER 证据挂在 Alert 下。
五个字段分别解决告警幂等、业务身份、跨窗口归并、故事线关联、当前案件归属,不能混用。
| 字段 | 生成 / 写入阶段 | 使用阶段 | 语义与约束 |
|---|---|---|---|
dedup_key |
规则命中汇聚为 Alert 前,由规则或接入层生成 | Alert 幂等写入,并派生 alert_id |
同一规则、同一窗口、同一聚合维度。推荐构成 tenant | 规则身份 | victim 实体 | 时间窗(默认5min);禁止事件级标识(event_id / log_id / 来源告警号 / 事件哈希)——尾接事件 ID 会让每条事件自成一键(POC 实测 15,632 事件 → 15,632 告警)。无 victim 时降级为 tenant | 规则 | 时间窗(弱聚合),不要用 attacker 顶替 |
alert_id |
Alert 首次写入前,由 tenant_id + dedup_key 派生 |
主键;关联 Evidence、Entity、Analysis、Workflow | 与 dedup_key 1:1;不使用随机 UUID 或源产品 ID |
merge_id |
生成 Alert 时按规则可选生成,从去掉窗口 / 事件 ID / 批次的归并维度派生 | GATE 后查找候选 Case;跨窗口查询同一现象 | 可由多个 alert_id 共享;不合并告警行,也不直接触发 Case 合并 |
correlation_id |
关联引擎识别故事线或关联批次时写入 | GATE 后按最高优先级查找候选 Case | 可先于 Case 存在;表示强关联,不等于已确认的 Incident |
case_id |
GATE 判定继续处理后,Case Service 创建或加入 Case 时写入 | 查询 Case 当前成员;承载 Case 级研判与流转 | 可空且一条 Alert 当前至多一个;当前只保留归属快照 |
correlation_id 精确命中 — 强关联优先merge_id 精确命中 — 跨窗口归并次之仅在同一 tenant_id 内执行;NULL 与空字符串不参与匹配。
弱关联只接受 victim / affected 角色以及白名单中的 host / user / account,不能仅凭攻击者 IP、NAT 地址、公共域名或共享账号自动入案。
多候选时按固定排序选择一个主 Case,不自动合并 Case。
AI 在 Case 编组后读取成员告警证据和本案自有证据。每次研判新增一行
sdm_analysis,每条证据引用展开为一行 sdm_analysis_citation。
重跑使用新的 analysis_id,新增一行,旧结论不覆盖、不修改。
Agent 输出的每条引用按 evidence_id 展开为 cite 行,带当时的主体快照,保证可回放。
AI 输出只是候选 conclusion;必须由人工或带 policy_id 的策略接受后,才能回写正式 verdict。
告警域设计共七张表;sdm_event 是上游事实表,不计入本清单。
MVP 部署前三张(检出快照 / 证据 / 实体);案件与分析域五张延后,按现场决策分期建设。
保存告警当前快照,支撑列表、去重、关联和 Case 归属。
保存 Alert 或 Case 到 Event、原始日志或外部证据的引用;主体二选一。
保存告警涉及的实体及其研判角色。
保存 GATE、AI、人工和 Playbook 的每次分析结果。
保存每次分析实际引用的证据及当时主体快照。
保存调查案件或正式 Incident 的当前快照。
记录分派、确认、关单、抑制、重开等流转动作。
先补齐分析接受与正式 verdict 的不可变审计账;需要案件迁移、合并、拆分回放时再启用 sdm_case_membership,同时落地 CAS、Outbox 和对账;ATT&CK 多标签 sdm_alert_attack_tag 与 AI 反馈 sdm_alert_feedback 按产品需求后置。
检测评分、每次研判的 conclusion、当前正式 verdict、处理进度
workflow_status 是四个独立维度,只有一个状态机。
detection_confidence / detection_risk_score 由规则写入。
conclusion 属于每一次 Analysis,重跑新增记录。
verdict 仅由人工或策略更新,AI 不可直写。
workflow_status 是唯一状态机(NEW → IN_PROGRESS → CLOSED …)。
对 Alert / Case 的分派、确认、关单、抑制、工单和重开动作逐条追加:
CLOSE / SUPPRESS 写 closed_time;
REOPEN 从 CLOSED 返回 IN_PROGRESS 并清空 closed_time。
| 字段 | 所属维度 | 枚举值与含义 | 说明 |
|---|---|---|---|
workflow_status |
D4 处理进度(唯一状态机) | NEW 新建 · IN_PROGRESS 处理中 · CONFIRMED 已确认 · SUPPRESSED 已抑制 · CLOSED 已关闭 |
流转:NEW → IN_PROGRESS → CONFIRMED → CLOSED,可经 SUPPRESSED 关单;REOPEN 从 CLOSED 返回 IN_PROGRESS。误报/无害不写进此字段 |
verdict / conclusion |
D2 研判结论 / D3 正式结论(同枚举) | UNKNOWN 尚无结论 · MALICIOUS 确认恶意 · SUSPICIOUS 可疑、证据不足 · BENIGN 行为无害 · FALSE_POSITIVE 检测误报 |
conclusion 属于每次 Analysis(只追加);verdict 是当前正式结论,仅人工或带 policy_id 的策略回写 |
detection_confidence / detection_risk_score |
D1 检测评分 | INT 0–100(非枚举) | 由规则写入,AI 不可修改;与正式结论拆开 |
severity |
展示属性 | INFO / LOW / MEDIUM / HIGH / CRITICAL |
平台处置紧急程度;案件可取成员告警最高值;不沿用事件 syslog 小写 |
case_kind |
案件类型(仅 sdm_case) |
INVESTIGATION 调查案件(默认) · INCIDENT 已确认正式安全事件 |
仅 PROMOTE_INCIDENT / DEMOTE_INCIDENT 变更;改的是本字段,不改 workflow_status |
resolution_reason |
关单原因 | TRUE_POSITIVE 属实 · FALSE_POSITIVE 误报 · SECURITY_TESTING 安全测试 · KNOWN_ISSUE 已知问题 · DUPLICATE 重复 · RISK_ACCEPTED 风险接受 |
CLOSE / SUPPRESS 时推荐填写 |
action_type |
流转动作(sdm_workflow_action) |
ASSIGN 分派 · COMMENT 备注 · CONFIRM 确认 · CLOSE 关单 · SUPPRESS 抑制 · ESCALATE 升级 · CREATE_TICKET 建工单 · REOPEN 重开 · PROMOTE_INCIDENT 升事件 · DEMOTE_INCIDENT 降事件 |
逐条追加;升/降事件只作用于案件,改 case_kind;与后续 sdm_case_membership.action_type(ATTACH/DETACH…)不是同一枚举 |
next_hop |
GATE 闸门去向 | CLOSE_CANDIDATE 候选关单 · REUSE 复用历史研判 · FULL_AGENT 完整 AI 研判 · HUMAN 转人工 |
GATE 分析行必填;GATE 也走分析表,不另开状态机 |
noise_reason |
GATE 噪声原因 | EXCLUSION 排除名单 · KNOWN_FP 已知误报 · DUPLICATE 重复 · INSUFFICIENT_DATA 字段不足 · NONE 无噪声 |
GATE 判定不继续处理时记录原因 |
accepted_status |
研判接受状态(每行分析) | PENDING 待接受 · ACCEPTED 已接受 · REJECTED 已拒绝 · SUPERSEDED 被新研判取代 |
ACCEPTED 且策略允许时才回写 verdict;GATE 行默认 SUPERSEDED |
analysis_type / trigger_mode |
研判类型 / 触发方式 | 类型:GATE / RULE / AI / HUMAN / PLAYBOOK;触发:ALERT / CASE / REPLAY / MANUAL |
一次调查一行;告警轮与案件轮各写各的 |
score_source |
案件分数来源 | RULE 规则 · COMPUTED 计算得出 · MANUAL 人工 |
配套 priority_score 0–100,由案件服务计算 |
alert_type |
告警类型 | DETECTION 本地检测 · CORRELATION 关联 · ANOMALY 异常 · THREAT_INTEL 威胁情报 · SOURCE_ALERT 来源告警导入 · MANUAL 人工 |
外部产品告警导入用 SOURCE_ALERT;不要标成 DETECTION 却无 rule_id |
rule_type |
规则实现类型 | SINGLE_CONDITION · THRESHOLD 阈值 · SEQUENCE 序列 · ANOMALY · THREAT_INTEL · CORRELATION |
仅规则引擎填写 |
evidence_type / evidence_role |
证据类型 / 证据角色(sdm_evidence) |
类型:EVENT · RAW_LOG · SOURCE_ALERT · INTEL · ASSET · USER_INPUT;角色:TRIGGER · CONTEXT · CORROBORATION 佐证 · NEGATIVE 反向 · ENRICHMENT 富化 |
TRIGGER 只允许挂 subject_type=ALERT 的证据上 |
entity_type / alert_entity_role |
实体类型 / 研判角色(sdm_alert_entity) |
类型(小写):ip · host · user · account · process · file · domain · url · service;角色(小写):victim · attacker · affected · indicator · observer · related · primary |
不确定攻击者时用 related / affected,不强行标 attacker |
subject_type |
证据/分析主体 | ALERT · CASE |
分析、流转、证据共用;二选一写入对应 ID 列 |
membership action_type / membership_reason |
成员关系(sdm_case_membership · 延后) |
动作:ATTACH · DETACH · MOVE · MERGE · SPLIT;原因:AUTO_GROUP · CORRELATION · MANUAL · MERGE · SPLIT · POLICY |
MVP 不使用;与流转 action_type 不是同一枚举 |
投影的是索引,不是事实正文:facets_obj 和完整事实保留在 Event 中按
event_id 回查。未知 occur_time 保持 NULL,不用 created_time 伪造。
标题、等级、置信度、次数等投影为告警当前快照字段。severity 只从来源断言原值换算 INFO–CRITICAL;source_alert_id 仅来源有独立告警号时填(不填 event_id),rule_id 推荐填 signature_id。
攻击者 / 受害者角色投影为实体研判角色,对应事件主体与客体。主对象优先 victim(host > ip > user);实体表按 (entity_id, role) 去重,不随事件复制;占位值(0.0.0.0 / 内网IP范围 / 空串)不进 primary 也不进 dedup_key。
进告警的 N 条事件 = N 条 TRIGGER 证据 = event_count;同一事件不写两行。
事实指针挂在 ALERT 证据下;正文不复制,按需回查。
每个源产品一份声明式映射契约,由 source-alert-mapping.schema.json 约束;
已定契约:ngsoc ·
tianqing。
生成器只读契约做投影,禁止在代码内置源产品字典;金标为 examples/ 下的五表 JSON。
以下为精选摘录,完整数据见 alert-model/examples/。
三个样例的共同点:verdict 始终为 UNKNOWN,直到策略或人接受。
规则引擎 sdm-rule-engine 命中「主机进程执行交互式 Shell 并主动连接远端地址」。
触发日志挂 Alert;调查补充的 root 异地登录挂 Case;案件轮同时 cite 两类证据。
FULL_AGENT,noise_reason NONE;放行进入完整研判。
NGSOC 22 条检出类事件(record_kind=finding)投影为 SOURCE_ALERT,alert_type 固定不写 DETECTION。
弱关联因 rule_id 不同且主对象为 ip 不能并案;由关联引擎写同一 correlation_id 后编进一案。案件叙事只写一篇。
完整样例:examples/ngsoc_alert_info/ · 读模型:alert.detail.json / case.detail.json
天擎 edr_alert_log 6 条 finding 事件投影为 SOURCE_ALERT;映射来自声明式契约 standards/tianqing-source-alert-mapping.json,生成器只抄契约。
完整样例:examples/tianqing_rdp_chain/ · 落库报告:poc-load-report.json · 映射契约:tianqing-source-alert-mapping.json
按日期倒序。每条标明修订类型与影响面;权威条文以链接文档为准。
设计文档按编号阅读;每条关键决策都有对应的 ADR。机器可读层在 standards/,DDL 在 schema/。