行为/观察模型 · 2026-09-02 · M1 机器契约已落地

Dayu-SDM 日志标准

从安全事件不可绕开的事实结构出发,把多厂商日志转换成一套可查询、可回查、可持续演进的事件语言。
统一事件 sdm_event:一个事件 = 六个不可省略的问题,各自一个稳定落位。

受控事件类型字典
信封字段
接入厂商
日志类型样例
Derivation

模型推导:日志是数字世界的行为记录

不从现有字段表开始归纳,而从「日志的本质是什么」出发做第一性原理推演。 分类的第一原则不是「业务上发生了什么」——那是开放清单,无限增长; 而是「这次记录的本质是什么」(有限闭集)——本体分类立在前者,分类学清单陷在后者;SDM 要立的是本体。

第一步:三条正交的轴

AXIS 01 · 层次

发生在哪一层

网络层 / 系统层 / 应用层。层次不只是标签——它约束主体、客体、载体能填哪些实体类型(见主体与客体区)。

AXIS 02 · 行为类型

发生了什么性质的行为

出现 / 读取 / 变更 / 消失 / 流动——五类闭集。任何厂商动作都能归入其一,新动作不扩模型。

AXIS 03 · 认识地位

这是事实还是判断

对象层的事实不真不假、只是发生了;观察层的判断可能错。这条轴直接推出 observation 的顶层地位。

第二步:核心洞察——判断是观察者的行为

例子性质
对象层(事实)「A 访问 B(发送了信息)」只是发生了,无所谓真假——它是研判的原料,永远成立、不可推翻
观察层(判断)检测器说「这次访问是恶意的」是观察者的一次行为,天然可对可错——需证据支撑,也可被复核推翻
硬结论 01

误报的本质

误报 = 观察者对事实做了一次错误的定性,不是事实错了。事实无所谓对错,可能错的永远是判断——所以判断必须与事实分层存放。

硬结论 02

证据链锚定事实,结论归属观察

观察层的每一个判断都必须能回溯到对象层的哪几条事实(evidence_refs),否则判断是无根的观点——误报无法归因、无法治理。这条直接支撑 ADR-002:AI 只追加分析,verdict 由策略或人写。

第三步:六个不可省略的问题验证落位

#问题落位省略后果
1一条事件如何被唯一定位、回查和重放?元数据 = 身份 + 时间 + 数据来源 + 原始引用 + 映射契约无法判断何时、何处、由哪条映射生成,也无法对账
2这究竟是什么行为?event_kind,再 behavior = 层次 + 五类 + 动作 + 结果 + 事实描述数据只能按厂商字段查询,无法跨来源比较
3谁通过什么,对谁做了什么?主体 / 客体 / 载体 = 谁发起 + 作用于谁 + 通过什么(16 值实体类型 × 对应属性对象)IP、主机、账号与进程被固化为攻击者 / 受害者字段,方向反转时语义失真
4行为究竟怎么发生?行为维度 = 网络与流量 + Web 与解析 + 认证 + 进程 + …(15 候选域)领域细节被塞进顶层或厂商私有区,公共模型持续膨胀
5哪些是观察到的事实,哪些是来源做出的判断?观察 = 观察者 + 观察动作 + 断言 + 证据引用设备的「检测到攻击」会被写成已确认的客观事实,误报污染下游研判
6标准尚未理解或不适合公共化的信息放哪?扩展 = 来源私有 + 画像 + 富化只能丢数据,或为每个厂商不断扩张公共 Schema

推演之后得到的三条设计后果

后果 01 · 由认识地位轴推出

观察者提升为顶层

观察者不参与行为,它只是看、记、判——把「看的人」和「做的人」并列为事件参与者,等于让设备的猜测冒充现场。判断归观察层,事实归对象层,互不改写,真伪留给下游判定。

落点:observation 是与行为内容平齐的顶层结构;观察者判断入 observation.assertion,行为事实入 subject/object/carriers / facets

后果 02 · 由行为类型轴推出

agency 语义稳定,不随流向交换

主体 = 发起者、客体 = 承受者是稳定的 agency 语义;数据流向是行为的属性,由五类行为类型表达(读取:客体→主体;写入/流动:主体→客体),不靠交换主体客体来凑方向。

落点:subject / object 只表达观测到的行为主体与客体,不自动等于攻击者 / 受害者;攻防定性只在 assertion.attackers/victims

后果 03 · 由层次轴推出

本体闭集承接一切动作

五类行为 × 三个层次是本体,厂商动作清单是分类学——新动作归入闭集,不扩模型;同一事实在不同层次落成不同类型(系统层读取、网络层流动),由层次裁决。落位一旦重复,映射无从评审、查询无从预期。

落点:同一实体建一次、以 ref_id 引用;身份未采集时留空,不构造占位对象;装不下的进 extensions 受治理,不另立标准位。

Derived Structure

推导结果:一条行为事件的顶层结构

一句话概括:某主体,经载体,对客体做了一次行为,发生在某切面里,被某观察者记录。 顶层五个节点:metaevent_kind内容(当前仅实现行为,其下是行为五件)、observationextensions——主体/客体/载体不是与观察并列的独立层,而是内容区的组成部分。 如何存储落表属于物理绑定,见手册 · 物理投影

元数据meta 字段 记录身份、时间、数据来源、原始引用:tenant_id、event_id、occur_time、mapping_id、data_source、source_record;原文独立保存,经 event_id 1:1 回查。
事件种类event_kind 字段 当前唯一实现值 behavior;观察依附于行为事件,不能单独成事件。state(状态:如 CPU 快照、主机在线、端口 UP/DOWN 这类「某时刻处于什么情况」的记录)暂缓,后续单独定义。
内容content · event_kind=behavior 行为的五件事同属一个内容区——主体、客体、载体不是与观察并列的独立分区,而是行为内容的组成部分;状态模型暂缓后,此处当前仅实现行为。
行为behavior 字段 层次(network/system/application)、五类闭集 type、开放 operation、outcome 三段语义、message。
主体subject 字段 谁发起;单一实体,身份未采集时留空;16 值 entity_type + typed object。
客体object 字段 作用于谁;单一实体,未识别或不适用时留空;多个同等客体优先拆事件,集合扩展须受治理。
载体carriers[] 字段 通过什么;多值数组,carrier_role 表达 parent_process、script_engine 等关系;协议与会话不进载体。
行为维度facets 字段 发生在什么切面里:15 个候选域(network、http、dns、email、process…);禁止通用 related。
观察observation 字段 被某观察者记录:observer(typed object,地址统一用 ip)、action(record/detect/assess)、assertion 判断、evidence_refs 证据引用;单对象。
扩展extensions 字段 装不下的才进扩展区:source_private(来源私有)、profiles(画像)、enrichments(富化);不承载诊断信息。
Behavior

行为内容:这是什么行为、结果如何

先判根字段 event_kind(当前唯一值 behavior;观察依附于行为,不独立成事件;state 暂缓),再由 behavior 五个字段说清「这是什么行为」:发生在哪一层(layer)、什么性质的行为(type)、具体做了什么动作(operation)、结果如何(outcome)、事实是什么(message)。 三条轴各有着落:层次与行为类型落字段,认识地位落结构(事实在内容区、判断在 observation);「许可/拒绝」的处置决策是所有行为共有的维度,由 outcome 的三段语义承载。

字段取值判别
层次
behavior.layer
network / system / application三轴之一:发生在哪一层;按实际观测层次判别,不按厂商产品名称推断
行为类型
behavior.type
appear / read / change / disappear / flow三轴之一:发生了什么性质的行为——五类闭集,判定依据见下方「行为五类与结果」
动作
behavior.operation
开放动作名类型的具体化:login、query、write、connect 等具体动作,必须归属五类之一(login→read、spawn→appear);新动作不扩模型
结果
behavior.outcome
处置段:allowed / denied
执行段:success / failed
记录段:observed / unknown
共有维度:每个行为都经过一次「放行还是阻断」的决策(处置段);无守门人时看行为自身成败(执行段);仅被记录或来源无结果(记录段)——三段不得混用
事实描述
behavior.message
文本描述行为事实本身;状态描述留待 state 模型

行为五类与结果

行为分五类闭集——出现 / 读取 / 变更 / 消失 / 流动,每类有明确判定依据;结果不是第六类,每个行为都经过一次「放行还是阻断」的决策,「许可 / 拒绝」是五类共有的维度:

行为类型判定依据例子许可
allowed
拒绝
denied
出现
appear
新实体开始存在:从无到有进程启动、文件创建、连接建立进程启动成功启动被 EDR 阻断
读取
read
——数据原地被访问,不换位置、不跨边界读文件、查库、认证读成功认证失败、读被拒
变更
change
已有实体的内容或状态被修改写文件、改配置、提权修改生效写入被拒
消失
disappear
实体终止存在:从有到无进程退出、文件删除、连接断开正常终止会话被强制切断
流动
flow
——数据跨边界、改变位置网络传输、下载、外传数据放行防火墙丢包

其中读取与流动最易混淆,判据是数据是否跨边界、改变位置(取与移)——安全语义不同必须分开:读取指向越权访问(读敏感数据、查库),流动指向数据外传、C2 通信、横向移动。边界模糊处(如「下载文件」)由层次裁决:系统层看到的是读取,网络层看到的是流动——同一事实,层次决定落成哪个类型。

易错对照

登录被拒 = denied 不是 failed

认证是控制点判定(处置结果);端口连不通无守门人,是行为本身 failed(执行结果);流量镜像只是观察到,记 observed。

严重度分轨

两套严重度不混用

原始日志等级写 meta.source_record.log_level;来源检测判断的严重度写 observation.assertion.severity;行为层不再有 severity 字段。

来源 blocked

按语义归一为 denied

behavior.outcome 不保存阻断动作字面量:来源写 blocked 一律按语义归一为 denied,词表保持闭合。

Subject · Object · Carriers

主体与客体:谁通过什么对谁

行为句式 = 主体(subject)通过载体(carriers[])作用于客体(object)。 每个角色是 16 值 entity_type + 对应 typed object;身份未采集时留空,不构造占位对象。 谁对谁清楚了,下一节看「怎么发生的」。

角色定位结构要点
主体
subject
行为发起者 · 施事ref_id 事件内引用
entity_type ← 16 值闭集
└─ typed object 与 entity_type 一致
单一实体;身份未采集时留空——没有身份 ≠ 没有主体;不自动等于攻击者
客体
object
直接作用客体 · 受事ref_id 事件内引用
entity_type ← 16 值闭集
└─ typed object 与 entity_type 一致
单一实体;多个同等客体优先拆事件;不自动等于受害者
载体
carriers[]
工具 · 载体ref_id 事件内引用
entity_type ← 8 种载体类型
carrier_role 载体关系
└─ typed object
多值数组,每个成员一套左述结构;parent_process、script_engine 等载体关系;协议、方向、会话进 facets,不进载体
观察者不在此表——它不参与行为,只记录、检测、判断;结构在 observation.observer,见观察与断言一节。

entity_type × typed object:类型与属性对象成对出现

每个角色对象由一对字段构成:entity_type 从 16 值闭集中选一,typed object 是与之同名的属性对象——类型决定哪个对象字段被填充,其余 15 个不出现:

类型声明

entity_type = "endpoint"

从 16 值闭集中选定一个,声明这个角色「是什么」。点击下方类型牌查看对应属性对象。

属性对象(与类型同名)

subject.endpoint = { ip, port, mac }

只有与 entity_type 同名的对象字段被填充;其余 15 个字段不出现。

在手册 · 对象类型中打开

属性与手册「对象类型」同一份候选表,权威以 M2 对象注册表为准;三条配对规则:只能选一——一个角色最多一个 entity_type 与一个 typed object;geo、hashes 只是属性——挂在 host、endpoint、file 等对象里,不是独立类型;未知不构造——身份未采集时整个角色留空。

agency 语义:主体是发起者,不是数据来源

日志里的 src/source 语义是动作发起者,不是「数据来源」。「进程读文件」时,主体仍是读取的进程(发起者),客体是被读的文件(承受者)——不因为数据从文件流向读者,就把文件当 src。数据流向由行为类型表达,不靠交换主体客体;主体/客体是稳定的 agency 语义(谁发起 / 谁承受),两者不混。

行为类型数据流向主体(发起者)
读取
read
客体 → 主体读的人(发起者)
写入 / 流动
change · flow
主体 → 客体写 / 发的人(发起者)

层次决定实体域

层次不只是标签,它约束了主体 / 客体 / 载体能填哪些实体类型——这正好把实体清单按三个层次自然分区。层次与行为类型正交:同一个「读取」在网络 / 系统 / 应用三层各自成立。

层次在哪观测到主体/客体/载体的典型实体域
网络层
network
网络流量endpoint(IP、端口、协议、流)、domain
系统层
system
操作系统内process、file、script、certificate、registry 上下文
应用层
application
人与应用user、account、service、application、url
网络层读取

→ 抓包

实体是 endpoint(IP / 端口),行为落在网络流量观测点。

系统层读取

→ 读文件

实体是 process / file,观测点在操作系统内部。

应用层读取

→ 查库

实体是 user / service / resource,观测点在应用与数据库之间。

Facets

行为维度区:怎么发生的

行为细节按维度拆放:契约登记 个候选 domain,典型路径已定义 个,页面按主题组展开; 全量字段见手册 · 字段目录。如果这条日志是设备检测出来的,判断放哪?下一节回答。

Observation · Assertion

观察与断言:谁观察的、怎么认定的

observation 回答「谁在什么位置、以什么方式观察,做出了什么判断」。 一条被判定为攻击的行为事件,事实层只有观测到的 subject 与 object——断言不改写事实。 最后一块:事件的身份证。

observation · 观察对象结构

字段内容
observation_id / observer观察记录 ID 与观察者实体(typed object;地址统一用 ip)
actionrecord(记录)/ detect(检测)/ assess(研判)
observed_at观察时间
assertion观察者判断——仅 detect/assess 时必须有,不反写事实层;内部字段见下方「断言」小节
evidence_refs[]指向事实事件、原始日志或证据对象的引用
单对象

一条事件一个观察

当前每条行为事件最多一个 observation;多观察者场景未来经 Schema 版本升级为 observations[],但不建立独立 observation 事件。

severity 分轨

两套严重度不混用

原始日志等级写 meta.source_record.log_level;检测判断严重度写 assertion.severity;行为层没有 severity 字段。

来源身份拆分

data_source ≠ observer

meta.data_source.instance_id 只表示采集器/接入节点;实际产生日志或作出判断的设备实例(如防火墙、NGSOC)进 observation.observer——不能仅按字段名判断。

assertion · 断言:来源判断的完整落位

source_finding 的十一类字段一行不丢,全部收进 observation.assertion;断言不反写事实层——attackers[] / victims[]来源的主张,不是 subject / object 的第二份。

断言字段 候选 · M2 登记前收什么旧来源
title检测标题source_finding.title
severity检测严重度——与 meta.source_record.log_level 分轨,两套不混用source_finding.severity
confidence置信度source_finding.confidence
rule规则 / 特征 IDsource_finding.rule_id / signature
attackers[] / victims[] / affected[]攻击者 / 受害者 / 受影响对象,按来源主张保存,不覆盖事实层source_finding.attacker / victim / affected
mitreATT&CK 战术 / 技术source_finding.mitre_*
vulnerability漏洞(CVE 等)source_finding.vuln_*
malware恶意软件家族 / 名称source_finding.malware_*
conclusion来源处置结论source_finding.action
事实层隔离

attackers[] / victims[] ≠ subject / object

断言只表达「来源认为谁攻击谁」;方向反转或误报时,事实层观测到的主体客体不被污染——这是误报可归因、可治理的前提。

开放对象

候选 · 登记后闭合

07 Schema 只约束「detect/assess 必有、不反写事实层」;内部字段 M2 登记后闭合,不在此发明枚举。

source_finding_obj逻辑:observation.assertion

→ 告警投影

断言投影为 SOURCE_ALERT 告警:标题成快照、severity 换算 INFO–CRITICAL、event_id 成 Evidence 指针;只消费 record_kind=finding 的检出类记录。详见告警标准

观察者栈:从底到顶

source_finding 是来源设备这个第一个观察者的判断,不是事件的第五个分区;severity 同理,是设备对事件重要性的自我评估,归观察者层。整条观察链共享统一骨架:「观察者 + 动作(判断/处置)+ 被观察对象 + 结论」

观察层对象观察者是谁判断什么
observation.assertion(原 source_finding)来源设备某条事件
sdm_alert平台检测引擎某条 / 某组事件
sdm_analysisAI / 人某个 alert / case
sdm_workflow_action运营者某个 alert / case
Metadata

元数据:事件的身份证

meta 给事件发身份证——身份、时间、数据来源与原始引用,一条事件何时、何处、由哪条映射生成,全程可对账。模型到此定型,接下来看真实日志怎么进来。

身份

两列身份

event_id 是标准化事件唯一标识(平台分配,与 raw_log 1:1);log_id 是原始日志身份——来源有稳定 ID 填来源 ID,否则与 event_id 相同。

时间

三戳 · Unix 毫秒

时间统一 Unix 毫秒 UTC:occur_time 事件发生、ingest_time 接入、parse_time 解析。

治理

mapping_id · schema_version

每条事件携带映射契约编号与逻辑模型版本,管道全程不丢;mapping_id 不可变,语义变化必须创建新值;中间版本暂不承载 mapping_revision 等治理字段。

来源拆分

data_source ≠ 观察者

meta.data_source.instance_id 只收采集器 / 连接器 / 接入节点;实际产生日志或作出判断的设备 / 产品实例(如防火墙管理地址)归 observation.observer——不能只按字段名判断,见观察与断言。

原始引用

source_record 五件

log_idrecord_kind(兼容路由值,不改变 event_kind)、log_typelog_level(原文等级 ≠ 断言严重度)、raw_ref 回查引用——原文留在 raw_log,事件只持引用。

数据来源类别

data_src_category 六值

auth / network / audit / system / alert / other,按日志内容性质判别(非设备类型):防火墙攻击告警 = alert,纯流量 = network;同一产品不同 log_type 可落不同值。

租户与版本

tenant_id · schema_version

tenant_id 必填——多租户隔离与物理分区键之一;无可信租户上下文时用空串,不发明 tenant01。物理唯一键 tenant_id + occur_time + event_id 见物理投影。

Field Catalog

逻辑字段与物理列目录

信封字段是结构位(ref_id / entity_type / <type> 槽),对象内部字段只在「对象类型」里定义一次,不按角色重复展开。 物理列是 interim 53 列投影,M4 cutover 前注册表仍为旧路径。逻辑字段是否存在与是否物化为标量列是两个独立决策

#逻辑路径 类型基数必填 样例含义
使用约束

路径含 [] 表示数组;<type> 是与 entity_type 同名的属性对象槽,16 选 1。点槽位或类型牌打开「对象类型」。必填依据当前 JSON Schema;对象内部字段在 M2 登记前均为候选。

Profile 边界

extensions.profiles.endpoint_asset 由 Profile registry v2 单独治理(19 条路径),表达终端资产相对 host 的增量快照,不计入信封字段。

Enums & Dictionaries

枚举与受控字典

闭合枚举只能写入目录列出的值;开放字段推荐值经评审扩展。行为契约枚举(layer/type/outcome/action、16 值 entity_type)见 07 Schema;下表为 105 项受控 type × operation 组合字典,登记组合才可写入。 event.type + event.operation105 项受控字典,未登记组合的 operation 必须留空。

事件类型字典 · event.type × event.operation

「—」表示该事件类型不允许填写 operation;已废弃类型只读兼容,新数据禁止写入。

#event.type中文含义合法 operation状态
非枚举字段 · 易误认

写入规则

标准枚举统一小写;event.outcome 不保存阻断动作(来源 blocked 按语义映射为 denied);未登记组合的 operation 留空;开放字段新增推荐值须更新契约,不允许单个接入规则自由造词。

Examples · 按 log_type 选列

接入实例

三个 tab 对应三类典型日志:设备检出(behavior + detect 观察)网络流量(behavior)终端审计(behavior)。 每条按接入 8 步展开填了什么、为什么;JSON 四阶段收在表下,按需展开。

Ingestion Pipeline

接入管道

原始日志经 WPL 解析 → OML 富化组合 → Kafka hybrid-v1 → Routine Load 落入事件表(物理上现为 sdm_event,M4 切换为 sdm_event_behavior + 实体索引); 映射身份由 mapping_id + schema_version 全程携带。

STAGE 1设备日志 厂商 类型,WPL 规则逐类型解析
原文
STAGE 2WPL 解析结构化提取;输出经 wpl-check 验证
结构化
STAGE 3OML 富化组合组合多字段、标准化枚举与时间
标准化
STAGE 4Kafka hybrid-v1标量投影 + 权威对象 · 原文随行同 topic
消息契约
STAGE 5Routine Load同一 topic 双作业:事件与原文分表装载;首接 OFFSET_END,验收 021
Doris
STAGE 6Asdm_event标准化事件落库;日志回查用 log_id
事实表
STAGE 6Braw_log原文 + digest 落库;event_id 1:1 回查原文
原文表
治理字段

mapping_id · schema_version

每条事件携带映射契约编号与逻辑模型版本;中间版本暂不承载 mapping_revision / projection_version / quality_status 等治理字段。

富化标准

IP / 资产 / 方向落位

IP 地理、资产、系统、组织和方向富化按通用映射规则落位,见 docs/mappings/21。装不下的富化进 extensions.enrichments

Physical Binding · Doris

物理投影 · Doris 绑定

逻辑 Schema 决定字段含义,本节是它的物理绑定:Kafka 消息与 Doris 表都采用「标量投影 + 权威对象」混合结构, projection registry 决定哪些路径成为顶层标量。当前 Doris 为 interim-53(49 标量 + 4 VARIANT); Kafka hybrid-v1 消息层为 62 标量投影 + 4 对象字段——62 项中 49 项落表,其余仅存在于消息层。两个位置表达同一语义,必须一致。

权威对象 · Authority

subject.endpoint.ip

完整逻辑对象(新契约 typed object),保存未投影的多值和详细字段;当前物理侧仍为 interim roles_obj,M4 cutover。

查询投影 · Projection

source_ip

高频检索标量列。来源于本条消息的权威逻辑对象,不能由另一套独立映射产生。

Dayu-SDM 行为事件meta · event_kind · behavior · subject · object · carriers · facets · observation · extensions
projection-registry字段名 · 物理名 · 投影方式 · 版本策略
统一 projector先构造并校验逻辑事件,再生成消息
Kafka hybrid-v162 标量投影(49 落表)+ 4 对象字段
Routine Load同一 topic 双作业 · 首接 OFFSET_END
sdm_event026 · interim-53(49 标量 + 4 VARIANT)
raw_log027 · 原文 + digest(DDL 006)
投影方式规则
DIRECT直接复制逻辑值,不改变语义
NORMALIZED按该字段的标准化规则输出:枚举、IP、时间或协议规范化
PRIMARY_ONLY逻辑值为多值时只投影注册的主值;完整值保留在对象字段
DERIVED按已注册且可复现的规则从逻辑对象派生
DETAIL投影有界明细或摘要,完整明细由权威对象或原始日志保存
物理边界 · Doris

49 标量 + 4 VARIANT

唯一键 tenant_id + occur_time + event_id,按 occur_time 日分区;标量列是查询加速投影,不替代逻辑对象。

索引策略

V3 倒排承接低频路径

roles_obj / facets_obj / source_finding_obj 建倒排索引承接低频标量路径过滤(interim;M4 切换为 subject/observation 对象字段);extensions_obj 不建无约束全路径索引。

13 个降级路径

低频投影退回对象

已通过 Doris 路径查询验证的 13 个低频标量投影降级到对象字段权威存储,逻辑路径保留、物理列不建。

物理层决策

行为表 + 实体索引,主表 YAGNI

本阶段物理上只落 sdm_event_behavior + 实体索引(S4 概念:entity_id / event_ref / event_kind / event_time),sdm_event_state 暂缓。逻辑上保留 sdm_event 概念,但统一主表几乎用不上:主表唯一价值是「不按实体过滤、按时间序扫全量事件流」,而这个场景各有更直接的解。

三个场景

各有其解,不需要主表

实时流 → 行为流直接输出;「最近事件」看板 → 直接查行为表;带实体的时间线 → 实体索引解决。状态模型定稿后再评估统一视图,当前不为状态预留物理实现。

一致性要求 · 写入端必须保证
  1. 同源 — 标量投影来源于本条消息的权威逻辑对象,不能由另一套独立映射产生。
  2. DIRECT 相等 — 单值 DIRECT 投影必须与对象值相等。
  3. 可复现 — NORMALIZED / DERIVED 投影必须能按注册规则从对象值复现。
  4. 主值稳定 — PRIMARY_ONLY 必须使用注册的主值选择规则,不依赖数组偶然顺序。
  5. 不凭空造值 — 对象值缺失时不生成对应标量投影;补充值必须同时带允许的富化来源。
物理投影契约 · projection-registry.v1.json
53 列 Doris 投影的唯一机器依据;原文分离存储在 raw_log 表(006),事件与原文经 event_id 1:1 关联。
raw_log 列类型说明
tenant_idVARCHAR(128) · NN租户编号:与 sdm_event.tenant_id 一致
occur_timeDATETIME(3) · NN事件发生时间:与 sdm_event 一致,作分区与主键组成
event_idVARCHAR(128) · NNsdm_event.event_id 一致,1:1 关联键
raw_msgSTRING原始日志:未经标准化的源日志原文
raw_msg_digestVARCHAR(64) · NN原文摘要(十六进制),同文检测与变更判定
digest_algoVARCHAR(16) · NN摘要算法标识,默认 sha256
idx_raw_msgINVERTED原文全文检索(unicode parser)
idx_raw_msg_digestINVERTED同文检测 / 去重回查
同构身份 · 与 sdm_event

UNIQUE KEY 三列一致

tenant_id + occur_time + event_id 唯一键、HASH 分布与日分区策略与 sdm_event 同构;同一 event_id 重灌时两表 upsert 行为一致。

同文判定

digest 双列

WHERE digest_algo = ? AND raw_msg_digest = ? 判定原文是否同文;digest 由上游 wparse 计算后随消息写入,027 落库不重算。

索引与保留

双倒排 + Bloom

raw_msg 全文倒排、raw_msg_digest 倒排;event_id / raw_msg_digest 建 Bloom 过滤。保留期由 apply 脚本按 DORIS_RETENTION_DAYS 替换(默认 7 天)。

独立原文表契约 · 006_raw_log.sql
raw_log 的唯一机器依据:6 列 + 2 倒排索引;事件表只存 event_id 引用,原文不参与字段映射。
Coverage

厂商与日志类型覆盖

examples/ 下每个类型目录保存四件套:raw-logwpl-outputplatform-contextexpected-sdm-event,以及机器可读映射 wpl-to-sdm-event

厂商类型数日志类型(点击进入样例目录)
Changelog

契约修订时间线

按日期倒序。每条标明修订类型与影响面;权威条文以链接文档为准。

0.2.01 项修订
2026-09-02模型迁移

行为/观察事件模型 M1 机器契约落地

event_kind=behavior 正式契约 Schema(07)定稿:meta + behavior + subject/object/carriers + facets + observation + extensions;roles.* 迁移为 subject/object/carriers/observation.observer,source_finding 迁移为 observation.assertion,观察者地址多值降级为单值 ip(ip_addresses[] → ip),severity 拆分为 log_level 与 assertion.severity。

影响:M2 注册表/投影、M3 映射与样例、M4 DDL cutover 前运行侧仍为 interim 五层结构

行为契约 Schema ·

0.1.48 项修订
2026-08-26枚举新增

data_src_category 六值闭合枚举

auth / network / audit / system / alert / other。判别以日志内容性质为准(非设备类型),同一产品不同 log_type 可落不同值;other 仅五类尝试后可用。废弃值 security_log / security_device / endpoint_security 附存量迁移映射。

影响:POC 中 sangfor 全部误填 security_log 的收口依据

枚举目录 · 数据来源类别

2026-08-26规则修订

severity 按 record_kind 分治

finding 类 event.severity 经映射注册表统一换算表继承来源检测严重度(须声明 severity_policy: inherit_from_finding);activity 类独立赋值,无证据留空。同一来源值只允许一条换算路径。

影响:POC 审计 #1:两套换算并存致 218 条同源不同值

枚举目录 · 写入规则

2026-08-26规则修订

outcome 取值判别(视角决定词表)

存在访问控制/策略判定 → denied/allowed(站被判定方);纯行为记录 → success/failed/observed(站行为主体)。denied/allowed 须伴随 source_finding.action,缺失视为映射缺陷。来源处置动作写 source_finding.action 标准键(block/allow/alert),禁止写 status。

影响:POC 审计 #2:动作错放 status,6,283 条 outcome 全 unknown

枚举目录 · 事件结果

2026-08-26字段退役

metadata.raw_msg 退役

原始日志全文分离至独立 raw_log 表(event_id 1:1),事件表只存引用。取消 raw_log_id → raw_msg 的临时替换,002 DDL(raw_msg 直装列)与 87 列生成器同日删除,04 物理目录加退役横幅。

影响:逻辑路径 512 → 506;examples 剥离内联 raw_msg(28 个 expected)

结构概览

2026-08-26字段退役

metadata.raw_log_id 退役

其值恒等于 event_id 属冗余列:事件 ↔ raw_log 关联统一用 event_id(raw 表 UNIQUE KEY 即它),来源日志身份用 log_id。

影响:逻辑路径 506 → 505;物理列 54 → 53(49 标量 + 4 VARIANT)

结构概览

2026-08-26字段退役

metadata.original_event_id 退役,身份收敛两列

来源有稳定 ID 写入 log_id,否则 log_id 与 event_id 相同;不伪造第三种号。event_id 为平台分配的标准化事件唯一标识。

影响:逻辑路径 505 → 504(metadata 16 → 15)

结构概览

2026-08-26字段删除

删除无消费方预留字段

metadata.source.*(5 条)与 metadata.payload_refs[].http.*(2 条):既无 writer 也无 reader,多级转发链路未进路线图,删除以免死字段。

影响:逻辑路径 512 计数中的首批裁减

object-registry

2026-08-05基线

event.type × operation 机器字典 v2026-08-05

105 项受控事件类型与合法 operation 组合定型,作为标准化事件定型的唯一查表依据。

影响:字典版本号写入 06 枚举目录头部

枚举目录

Frozen Rules

已冻结规则

设计推演定稿后冻结的结论;变更需经模型评审,不做映射层变通。

规则冻结结论
记录形态当前仅有 event_kind=behavior;观察不能脱离行为单独成事件。state 作为后续保留值
主体/客体空值不设置 status 字段;主体身份未采集、客体未识别或不适用时留空——留空只表示身份缺席,不表示行为不存在
观察基数每条事件最多一个 observation 对象,不使用 observations[]
版本字段保留 meta.mapping_id;删除 mapping_revisionprojection_version
诊断信息不进入事件模型,由独立质量对象治理
行为分类appear/read/change/disappear/flow 五类;behavior.layernetwork/system/application
结果枚举暂保留 allowed/denied/success/failed/observed/unknown 兼容值,语义上区分处置结果、执行结果和记录状态
关联键本阶段暂不定义统一结构;具有明确领域语义的值留在对应 facet,其余待后续定义
Terminology

术语约定

说明
行为(behavior)事件的谓语。已弃用「跃迁」——太物理 / 学术。类型五类:出现 / 读取 / 变更 / 消失 / 流动;处置结果:许可 / 拒绝
主体 / 客体 / 载体事件参与者,agency 语义(谁对谁做、通过什么),不是传输语义(source/target)
观察者不参与事件、只观察 / 记录 / 判断的一方(设备、引擎、AI、人),承载于单对象 observation.observer
事实 / 判断对象层(发生了什么)与观察层(观察者怎么看)的区分——判断是观察者的行为
关联键值非实体关联键的统一结构暂缓定义;实体键由主体、客体、载体承担
Documentation

文档地图

权威字段以逻辑契约字段目录与 07 行为 Schema 为准;机器契约在 contracts/hybrid-event/,DDL 与装载在 schema/。