All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m31s
268 lines
27 KiB
Markdown
268 lines
27 KiB
Markdown
# 多视角审计中心功能总结
|
||
|
||
本文汇总 `build-multi-view-audit-center` 第一阶段已经交付的能力、边界和验收依据。实现以当前 Action/Resource Registry 和覆盖基线为准;旧账号、旧资产 operation log 只保留独立历史查询,不回填、不转换、不进入新审计中心。
|
||
|
||
## 1. 交付范围
|
||
|
||
- 统一不可变 `Audit Event + Event Resource`,记录真实操作者、入口、动作、结果、风险、多资源关系、资源快照、前后变化和跨步骤链路。
|
||
- 平台提供全局事件、操作者、资源、request、correlation、资金、风险和 Integration Log 调查视角。
|
||
- 代理和企业使用独立安全资源活动投影,只查看当前有权资源的允许业务结论。
|
||
- Audit Event 与 Integration Log 按 `Asia/Shanghai` 完整自然日归档;整月完整性门禁通过后,可受控物理清理 PostgreSQL 上月在线数据。
|
||
- 现行覆盖门禁已登记 692 个源码入口、219 个 Action Registry 动作、61 个 Resource Registry 类型、146 个已使用资源角色和 5 组敏感读取。
|
||
|
||
实现入口:`internal/infrastructure/audit/`、`internal/query/audit/`、`internal/query/integration/`、`internal/application/auditarchive/`、`internal/handler/admin/audit.go`、`internal/routes/audit.go`。完整逐入口决定见 [审计覆盖基线](../../.scratch/tech-global-audit/审计覆盖基线.md)。
|
||
|
||
## 2. 四类事实边界
|
||
|
||
| 事实 | 回答的问题 | 权威内容 | 明确不承担 |
|
||
|---|---|---|---|
|
||
| Access Log | 这次 HTTP 请求收发了什么、耗时多久 | method、path、query、status、duration、request/response body、request_id 等调试信息 | 不证明业务事实成功,不进入审计数据库查询,不上传本次冷归档 |
|
||
| Audit Event | 谁从什么入口,对哪些资源做了什么,结果如何 | 操作者、动作、结果、风险、多资源关系、资源快照、before/after、request/correlation/parent | 不替代订单、钱包流水等业务账本,不替代外部交互或可靠投递事实 |
|
||
| Integration Log | 系统与外部系统实际发生或未发生了哪次交互 | provider、direction、operation、result、attempt、外部状态、受控请求/响应摘要 | 不把投递成功或外呼成功伪装成内部业务成功,不承担人工恢复 |
|
||
| Domain Ledger | 金额、状态、权益最终以什么为准 | 订单、支付、退款、充值、钱包流水、审批、套餐权益、佣金等业务表 | 不负责解释完整操作者上下文,不被 Audit Event 重算或覆盖 |
|
||
|
||
Outbox/Asynq/手动轮询是可靠副作用和任务运行事实:跨视角时间线可展示其摘要或引用,但仍保持独立生命周期。Outbox `delivered` 只表示投递事实,不表示消费者业务成功;手动轮询表继续保存进度和结果。
|
||
|
||
链路字段固定语义:`request_id` 关联一次 HTTP 请求;`correlation_id` 关联跨请求、Outbox、Asynq、回调和后续业务步骤;`parent_event_id` 表示直接因果;Integration 的 `trigger_series + attempt` 才表示技术尝试序列。
|
||
|
||
## 3. 核心字段字典
|
||
|
||
### 3.1 Audit Event
|
||
|
||
| 字段组 | 字段 | 语义 |
|
||
|---|---|---|
|
||
| 身份 | `event_id`、`occurred_at`、`created_at` | 稳定公开事件 ID、真实发生时间、持久化时间 |
|
||
| 动作 | `category`、`action_code`、`action_name`、`summary` | 稳定动作类别/编码、中文名称快照和内部摘要 |
|
||
| 操作者 | `actor_kind/id/name`、`actor_shop_id/name`、`actor_enterprise_id/name` | 事件发生时的真实人工、OpenAPI、系统任务、计划任务或外部系统身份快照 |
|
||
| 入口 | `source`、`request_path/method`、`ip_address`、`user_agent` | admin/personal/openapi/worker/scheduler/callback 等来源及 HTTP 摘要 |
|
||
| 范围 | `scope_type/id/name` | 平台、店铺、企业、个人等本次主要业务范围快照 |
|
||
| 结果 | `result`、`risk_level`、`error_code`、`error_summary` | `success/failed/denied/partial/unknown`、风险和安全错误摘要 |
|
||
| 链路 | `request_id`、`correlation_id`、`parent_event_id` | 请求、业务链路和直接父事件 |
|
||
| 批量 | `batch_total`、`success_count`、`fail_count` | 批次根统计;子事件通过 parent/correlation 关联 |
|
||
| 完整性 | `metadata`、`content_hash` | 有界安全业务参数和标准化内容 SHA-256 |
|
||
|
||
### 3.2 Event Resource
|
||
|
||
| 字段 | 语义 |
|
||
|---|---|
|
||
| `resource_type/id/key/display_name` | Registry 类型、可空内部 ID、事件时稳定业务 Key 和展示名 |
|
||
| `relation` | `primary`、`affected`、`reference`;每个事件必须且只能按动作契约确定主要资源 |
|
||
| `role` | `old_card/new_card/bound_card/entry_device/order/wallet_transaction` 等稳定业务角色 |
|
||
| `identity_snapshot` | 事件发生时资源身份,不依赖当前业务表是否删除、更名、换号 |
|
||
| `before_data/after_data` | 该资源本次真实涉及的字段,不使用事件级万能 JSON |
|
||
| `subject_visibility` | `internal_only`、`subject_result`、`subject_detail` |
|
||
| `subject_summary/subject_data` | 写入时生成的主体安全结论及 Registry 白名单字段 |
|
||
| `sort_order/created_at` | 稳定展示顺序和落库时间 |
|
||
|
||
### 3.3 Integration Log
|
||
|
||
| 字段组 | 字段 | 语义 |
|
||
|---|---|---|
|
||
| 身份 | `integration_id`、`provider`、`direction`、`operation`、`external_id` | 稳定交互身份、提供方、方向、动作和外部业务标识 |
|
||
| 资源 | `resource_type/id/key` | 本次外部交互的直接主资源;其他资源通过关联 Audit Event 展开 |
|
||
| 触发 | `trigger_source/scene/series`、`attempt` | 来源、业务场景和显式技术尝试序列 |
|
||
| 结果 | `result`、`http_status`、`provider_code/message`、`duration_ms`、`state_changed` | 原始结果、安全可读摘要、耗时和是否改变本地事实 |
|
||
| 内容 | `request_summary`、`response_summary`、`metadata`、`content_hash` | 写入和返回前均经过白名单及凭据删除的结构化摘要 |
|
||
| 链路 | `request_id`、`correlation_id`、`audit_event_id` | 与请求、业务链路和内部状态变化事件的稳定关联 |
|
||
|
||
派生结果类别固定为:`pending→processing`、`success→succeeded`、`unknown→indeterminate`、明确失败结果→`failed`、`ignored/merged/rate_limited/completed/cancelled→not_sent`。`completed` 不计外部请求成功。
|
||
|
||
### 3.4 留存与调查引用
|
||
|
||
| 结构 | 字段 | 语义 |
|
||
|---|---|---|
|
||
| `retention` | `online_from`、`archived_before`、`timezone` | 当前 PostgreSQL 在线窗口、已归档边界、`Asia/Shanghai` 时区 |
|
||
| `investigation_refs` | `event_id`、`actor_ref`、`resource_refs[]`、`request_id`、`correlation_id`、`integration_refs[]` | 平台各调查视角唯一允许使用的稳定跳转引用 |
|
||
| `tb_log_archive_run` | source/date/instance/schema/revision/status/is_final、range、object/manifest key、数量、字节、SHA-256、attempt、cleanup 时间 | 归档与清理轻量 ledger,不保存日志正文 |
|
||
|
||
## 4. 当前领域、资源与动作矩阵
|
||
|
||
下表按领域归并当前 Registry。动作列使用稳定编码前缀及代表动作;219 个动作的唯一权威清单是 `pkg/constants/audit.go` 与 `internal/infrastructure/audit/registry.go`,逐入口事务和 N/A 决定以覆盖基线为准。
|
||
|
||
| 领域 | 主要资源 | 已接入动作范围 | 权威事实/边界 |
|
||
|---|---|---|---|
|
||
| 账号与认证 | account、authentication、role、permission | `account.*`、`auth.*`、`role.*`、`permission.*` | 账号、角色权限和认证状态表;密码、Token、Cookie 不入审计 |
|
||
| 店铺与企业 | shop、enterprise、企业卡/设备授权 | `shop.*`、`enterprise.*`、`enterprise_card.*`、`enterprise_device.*` | 店铺层级和当前有效授权关系 |
|
||
| 个人客户 | personal_customer、手机号、OpenID、资产绑定 | `personal_customer.*` | 客户及绑定表;外部主体标识按 Registry 快照 |
|
||
| IoT 卡 | iot_card、批次、分配记录、Integration | `iot_card.*`,含创建、删除、分配/回收、系列、实名、停复机、刷新、限速、Worker 同步 | 卡表保存本地事实;Gateway 尝试进入 Integration Log;限速审计记录谁操作、谁被限速、档位及外部结果 |
|
||
| 设备与卡槽 | device、iot_card、device_sim_binding、分配记录 | `device.*`,含分配/回收、绑解绑、切当前卡、Wi-Fi、模式、重启、重置、Worker 观测 | 设备、卡及卡槽均为一等资源,多卡逐张关联 |
|
||
| 换货 | exchange_order、旧新卡/设备、绑定、客户、钱包、权益 | `exchange.card.*`、`exchange.device.*` | 换货状态机、资产/钱包/权益等业务表;不压缩为单一资产标识 |
|
||
| 套餐配置 | package_series、package、店铺授权、价格历史、批次 | `package_series.*`、`package.*`、`shop_series_grant.*`、`shop_package.*` | 套餐、授权和价格历史表 |
|
||
| 套餐权益 | package_usage、订单、套餐、资产、退款 | `package_usage.*`,含激活、到期、扣减/重置、退款/资产失效、队列及迁移 | `tb_package_usage` 和流量业务表为权威 |
|
||
| 订单与支付 | order、payment、资产、套餐、钱包/流水 | `order.*`、`payment.*` | 订单/支付状态、渠道流水;每次渠道尝试另写 Integration Log |
|
||
| 退款 | refund、订单、审批、钱包/流水、佣金、权益、通知 | `refund.*` | 退款、钱包流水、佣金和权益事实同事务收口 |
|
||
| 充值与钱包 | agent_recharge、recharge_order、agent/asset wallet、流水、预占 | `agent_recharge.*`、`asset_recharge.*`、`agent_wallet.*` | 金额和余额以钱包流水/业务单为权威;审计只解释操作者和动作 |
|
||
| 佣金与提现 | commission_record、commission_withdrawal、钱包/流水 | `commission.*`、`commission_withdrawal.*` | 佣金、提现、钱包和流水状态机 |
|
||
| 审批与企微 | approval_instance、业务单、Integration、Outbox | `approval.*`、`wecom.*` | 本地审批事实、企微交互和可靠终态分发各自保留 |
|
||
| 系统与连接配置 | system_config、payment_config、carrier、wecom_application/scene | `system_config.*`、`payment_config.*`、`carrier.*`、`wecom.*` | 配置表权威;只记录 `credentials_configured` 等安全事实 |
|
||
| 导入、批量与导出任务 | 各 task、批次资源、实际业务资源 | `*_import_task.*`、`asset_package_batch_order_task.*`、`order_package_invalidate_task.*`、`export_task.*` | 任务表保存进度;实际变化资源另有子事件;审计中心本身不导出 |
|
||
| 通知 | notification、read/cleanup batch、业务目标 | `notification.deliver/read/read_all/cleanup/cleanup_item` | 通知正文和已读状态以通知表为准 |
|
||
| 轮询与监控 | polling_config/concurrency/alert/manual_trigger、卡 | `polling_config.*`、`polling_concurrency.*`、`polling_alert.*`、`polling_manual_trigger.*` | 人工触发写 Audit;每次 Gateway 尝试写 Integration;手动任务表继续保存运行事实 |
|
||
| 可靠事件与留存 | outbox_event、log_archive_month | `outbox.*`、`audit.retention_cleanup` | Outbox 投递、归档 ledger、对象存储事实保持独立 |
|
||
|
||
普通列表、详情、统计和装配入口为 N/A;Registry 标记的敏感读取在返回结果前写审计,写入失败则不返回敏感结果。
|
||
|
||
## 5. 各资源身份快照
|
||
|
||
| 资源 | 最小可读快照 |
|
||
|---|---|
|
||
| 账号/角色/权限 | ID、用户名、手机号、账号类型、店铺/企业、企微身份;角色 ID/名称/类型;权限 code/name |
|
||
| 店铺/企业 | ID、编码、名称、上级或 owner shop、层级 |
|
||
| 个人客户 | ID、昵称、手机号、微信主体标识及资产绑定标识 |
|
||
| IoT 卡 | ID、ICCID、VirtualNo、MSISDN、运营商、店铺、系列、generation |
|
||
| 设备 | ID、VirtualNo、IMEI、SN、名称/型号、店铺、系列、generation |
|
||
| 设备卡槽 | binding ID、设备标识、slot_position、卡 ICCID/VirtualNo、is_current |
|
||
| 分配/换货 | 分配单号或换货单号、资产类型/ID/完整标识、来源/目标主体、旧新资产、店铺、状态 |
|
||
| 套餐/权益 | 套餐/系列 ID、编码、名称、期限、价格、状态;权益 ID、订单、资产、generation、激活/到期时间 |
|
||
| 订单/支付 | 订单/支付 ID 和单号、买家、资产、套餐、金额、支付方式/状态、渠道交易号、配置 ID |
|
||
| 退款/充值 | 业务单号、订单/资产/店铺、申请/批准金额、审批、支付方式、状态 |
|
||
| 钱包/流水/预占 | 钱包 ID/类型、店铺或资产、币种、流水/预占 ID、reference、amount、balance before/after |
|
||
| 佣金/提现 | 记录或申请 ID、店铺、订单、系列、金额、状态、结算周期 |
|
||
| 审批 | 实例 ID、业务类型/ID、提交人、provider、external ref、correlation、状态 |
|
||
| 配置 | 配置 Key/模块或 ID/name/provider、状态、`credentials_configured`;不保存密钥正文 |
|
||
| 任务/通知/轮询 | 任务 ID/单号、文件名、目标、操作者、统计;通知 event/接收人/类别/ref;轮询配置/触发 ID、资产、任务类型 |
|
||
| Integration/Outbox | integration ID/provider/operation/resource/external ID;event ID/type/aggregate |
|
||
|
||
手机号、IP、ICCID、VirtualNo、金额和交易号对平台按已存业务值完整展示;密码、验证码、Token、Secret、私钥、支付密钥、回调凭据、Authorization、Cookie、签名 URL 和完整第三方原始正文从持久化前删除。
|
||
|
||
## 6. 查询视角与 DTO
|
||
|
||
| 视角/API | 请求 DTO 重点 | 响应 DTO 重点 |
|
||
|---|---|---|
|
||
| `GET /audit/events` | 时间、action/category、actor、source/result/risk、scope、resource、request/correlation、分页 | `EventPage{total,page,page_size,items[],retention}` |
|
||
| `GET /audit/events/{event_id}` | 稳定 event ID | `EventDetail`:完整 `EventView`、全部 `ResourceView`、retention |
|
||
| `GET /audit/actors/{kind}/{id}/events` | actor、action/result/risk/resource、时间、分页 | 与事件列表相同的稳定分页投影 |
|
||
| `GET /audit/resources/search` | 首批 `iot_card/device/shop/order/refund`、精确 keyword、分页 | `ResourceCandidate{type,id,key,display_name,identity_snapshot,historical}` |
|
||
| `GET /audit/resources/{type}/{id}/timeline` | Registry type、内部稳定 ID、时间、action/result、分页 | 资源以任意 relation 参与的 `EventPage` |
|
||
| `GET /audit/requests/{request_id}/timeline` | 稳定 request ID | `LinkTimeline`、Access Log 检索 ID、按 `record_source` 分组节点 |
|
||
| `GET /audit/correlations/{correlation_id}/timeline` | 稳定 correlation ID | Audit、Integration、Outbox、任务摘要和 Domain Ledger 引用节点 |
|
||
| `GET /audit/finance/timeline` | shop/wallet/order/payment/refund/recharge/approval/trade/actor/correlation/time 任一稳定条件 | `FinanceTimelineNode`、amount/balance、权威表字段、调查引用 |
|
||
| `GET /audit/risks/overview` | 最长 31 天时间范围、risk/result/action/source | signals、risks、results、actions、sources、trend、retention |
|
||
| `GET /audit/risks/events` | 总览同源筛选及分页 | 风险范围内的 `EventView` 分页 |
|
||
| `GET /audit/integrations/overview` | 时间、bucket 及 Integration 组合筛选 | 总量、异常/unknown/陈旧 pending/状态变化、平均/P95、分布、趋势、retention |
|
||
| `GET /audit/integrations` | provider/direction/operation/result/category/resource/series/linkage 等组合筛选、分页 | `ListItem` 稳定编码/中文名、资源、结果、耗时、链路 |
|
||
| `GET /audit/integrations/{integration_id}` | 稳定 integration ID | identity/resource/trigger/result/content/linkage/timestamps/attempts/fidelity/retention |
|
||
| `GET /agent/resource-activities/{type}/{identifier}` | 业务稳定 identifier、时间、分页;范围来自认证上下文 | 资源摘要、`SubjectActivity[]`、retention |
|
||
| `GET /enterprise/resource-activities/{type}/{identifier}` | 企业仅支持当前有效授权卡/设备 | 与代理相同安全 DTO,不含内部调查引用 |
|
||
|
||
所有完整路径均以 `/api/admin` 开头。`request_id/correlation_id` 生命周期、15 条接口入参与返回、页面字段来源和降级规则统一见[审计链路与前端接入指南](跨视角调查与前端导航契约.md);专题说明见[平台基础审计调查接口](平台基础审计调查接口.md)、[外部集成调查接口](外部集成调查接口.md)和[主体资源活动接口](主体资源活动接口.md)。OpenAPI 权威制品为 `docs/admin-openapi.yaml` 和运行时生成的 `logs/openapi.yaml`。
|
||
|
||
平台调查节点统一使用 `investigation_refs`。字段不存在时隐藏跳转;只有稳定 Key、没有内部 ID 时先精确资源搜索,零命中或多命中均不自动选择,禁止按名称、时间、中文描述或编号前缀猜测关系。
|
||
|
||
## 7. 平台与主体可见性
|
||
|
||
| 身份 | 可见能力 | 不可见能力 |
|
||
|---|---|---|
|
||
| 超级管理员/平台账号 | 全部 `/api/admin/audit/*` 在线数据;完整已存业务字段、操作者、风险、before/after、Integration 安全摘要 | 系统安全凭据、归档对象读取、修改/删除/导出/恢复/风险处置 |
|
||
| 代理 | 自己及下级店铺当前有权资源的 `subject_result/subject_detail` | 平台 actor、内部原因/备注/风险/before/after、event ID、request/correlation、Integration 内容、`internal_only` |
|
||
| 企业 | 当前有效授权卡/设备的安全活动;授权撤销后立即不可读 | 平台接口、企业 ID 伪造范围、分配/换货独立内部调查、所有内部字段 |
|
||
| 个人客户 | 不开放本审计中心调查接口 | 平台及主体资源活动接口 |
|
||
|
||
代理/企业查询先验证当前资源归属,再读主体投影;不存在、不支持、越权或授权撤销统一返回“无权限操作该资源或资源不存在”,不泄露资源或事件是否存在。`subject_data` 必须在写入时按 Registry 白名单生成,Query 不从内部 before/after 临时删字段拼装。
|
||
|
||
## 8. 代表性业务样例
|
||
|
||
### 多卡设备
|
||
|
||
操作设备第二卡槽的卡时,目标卡是 primary/affected,入口设备是 reference,绑定关系保存 `slot_position=2` 和当时 `is_current`。切换当前卡同时关联设备、旧卡、新卡和两个 binding,分别写各自前后状态,因此设备、两张卡和绑定关系时间线都能定位该事件。
|
||
|
||
### 换货
|
||
|
||
卡换货按角色关联换货单、旧卡、新卡、旧新钱包、流水、套餐权益和客户绑定,并分别保存旧新卡 ICCID/VirtualNo。设备换货保存旧新设备 VirtualNo/IMEI/SN,并逐张关联实际涉及的绑定卡和卡槽;不会用一个 `asset_identifier` 掩盖多资源关系。
|
||
|
||
### 资金
|
||
|
||
订单钱包扣款、退款回充、充值入账、预占/释放、佣金和提现的成功审计与钱包、唯一流水、业务单及必要 Outbox 同一 GORM 事务;审计失败则业务回滚。资金时间线返回 `amount_authority`,金额与余额冲突时以钱包流水及业务表为准,不修改历史 Audit Event。
|
||
|
||
### 批量
|
||
|
||
批量分配、批量配置、导入购包等写一条根事件,记录 total/success/fail 和 `success/partial/failed`;每个实际变化或已识别失败资源写子事件,共享 correlation 并以根 event 为 parent。未命中、未处理和幂等无变化项不伪造成功子事件。
|
||
|
||
## 9. 异常闭环与事务策略
|
||
|
||
| 场景 | 处理 |
|
||
|---|---|
|
||
| 关键成功或 partial 且改变业务事实 | Audit 与 Domain Ledger/必要 Outbox 同事务;审计失败整体回滚 |
|
||
| 已定位主要资源的业务拒绝 | 业务不落地,随后用独立短事务写 `denied` |
|
||
| 已定位主要资源后的执行失败 | 保留原业务错误,独立短事务写 `failed` |
|
||
| 失败审计二次失败 | 不覆盖原错误;写 critical 日志并递增监控计数 |
|
||
| 参数解析前失败或无法定位主要资源 | 不造无资源 Audit Event,只进入 Access/Security Log |
|
||
| 外部交互未改变内部事实 | 只写 Integration Log |
|
||
| Callback/Worker 改变内部事实 | 保留 Integration/任务事实,并以真实 external/system actor 写 Audit Event |
|
||
| 普通查询 | N/A,不写 Audit Event |
|
||
| Registry 敏感读取 | 返回敏感结果前写 Audit;失败关闭,不返回结果 |
|
||
|
||
Writer 对未知 action、未知 resource/role、缺少主要资源、资源关系不完整、安全凭据未清理和不符合事务要求的动作保持 fail-closed。业务修正通过新的受控动作产生新事件,不更新旧事件。
|
||
|
||
## 10. 每日归档、月度清理与在线窗口
|
||
|
||
1. 每日任务按 `Asia/Shanghai` 前一完整自然日半开区间归档。
|
||
2. Audit 对象使用 UTF-8 JSONL+gzip,每行一个事件及完整 `resources[]`;Integration 每行一条结构化持久化事实。
|
||
3. 每个对象有 manifest、SHA-256、对象 metadata 和 `tb_log_archive_run` ledger;内容变化创建新 revision,不覆盖旧对象。
|
||
4. 月初先完成上月最后一天归档,并用数据库当前内容形成 Integration 最终 revision;任何 pending、缺日、数量/hash/对象不一致都阻止整月清理。
|
||
5. 门禁通过后,Retention Worker 以 1000 行有界批次按 Event Resource → Audit Event → Integration Log 顺序物理删除目标月 PostgreSQL 数据,并通过 cleanup 时间断点续跑。
|
||
6. 清理任务在当前月写 `audit.retention_cleanup`,不写回被清理月份;对象和 manifest 长期保留,不被该任务删除。
|
||
|
||
默认生产开关为 `JUNHONG_WORKER_AUDIT_RETENTION_CLEANUP_ENABLED=false`。灰度、仿真、SQL 观测、告警和启停步骤见[审计归档灰度操作手册](归档灰度操作手册.md)。
|
||
|
||
所有在线调查 DTO 返回 `retention`。显式范围早于在线边界或跨越边界时返回 `CodeAuditDataArchived`;ID-only 详情在线库不存在仍按资源不存在处理。接口不扫描对象存储,也不返回误导性的成功空结果或部分历史。
|
||
|
||
## 11. 发布、回滚与监控
|
||
|
||
发布前要求迁移版本 `205`、`dirty=false`,旧 Writer 生产调用为 0,Registry/覆盖门禁通过,两份 OpenAPI 可生成,生产物理清理开关保持关闭。
|
||
|
||
回滚只影响后续流量:保留当前在线 Audit、Integration、Domain Ledger、Outbox、归档 ledger 和已校验对象;不得恢复旧账号/资产 Writer,不得用 migration down 删除已有事实,不得从对象存储回填 PostgreSQL 伪造在线历史。错误事实通过前向业务动作修正。
|
||
|
||
| 监控项 | 阈值 |
|
||
|---|---|
|
||
| 关键成功审计写入失败 | 任一失败即 critical |
|
||
| failed/denied 短事务二次失败 | 增量必须为 0 |
|
||
| 未注册 action/resource/role | 必须为 0 |
|
||
| 安全凭据落库或响应命中 | 必须为 0 |
|
||
| 批量根子计数、parent/correlation 差异 | 必须为 0 |
|
||
| 旧 Writer 生产写调用 | 必须为 0 |
|
||
| 数据库受控查询 | < 50ms |
|
||
| 审计读接口 | P95 < 200ms,P99 < 500ms;发布后用既有 Access Log 观测 |
|
||
| 每日归档缺失/失败、对象或 manifest 不一致、月度非 final | critical,阻止清理 |
|
||
|
||
## 12. 明确未实现项
|
||
|
||
- 细粒度平台审计权限码和平台数据行过滤。
|
||
- 面向用户的审计导出、归档下载、对象存储历史查询或恢复。
|
||
- PostgreSQL 冷热联合查询、归档回填和月分区。
|
||
- 审计事件修改、删除、专用纠错 API;Retention Worker 的受控整月清理是唯一删除例外。
|
||
- Integration Log 重试、补偿、结果确认、外部单号绑定、人工恢复、修改或删除。
|
||
- 风险处置工单、自动封禁和自动恢复。
|
||
- 任意关系图、任意 JSONB/JSONPath 搜索、JSONB GIN 和 Redis 查询缓存。
|
||
- 将旧 operation log 回填、转换或拼入新审计中心。
|
||
- 从 Access Log、相近时间、相似资源或中文描述猜测业务链路和技术重试。
|
||
|
||
## 13. 验收依据
|
||
|
||
- 实现:`internal/model/audit_event.go`、`internal/model/integration_log.go`、`internal/model/log_archive_run.go`、`internal/infrastructure/audit/`、`internal/query/audit/`、`internal/query/integration/`、`internal/application/auditarchive/`。
|
||
- API:`internal/handler/admin/audit.go`、`internal/routes/audit.go`、`internal/model/dto/audit_dto.go`、`docs/admin-openapi.yaml`、`logs/openapi.yaml`。
|
||
- 覆盖:`.scratch/tech-global-audit/审计覆盖基线.md`、`.scratch/tech-global-audit/审计覆盖清单.json`、`cmd/audit-coverage`。
|
||
- 发布与留存:[审计归档灰度操作手册](归档灰度操作手册.md)。测试环境完整月仿真为 `2001-02`:56/56 归档成功,Integration 28/28 final,清理后三张目标日志表归零,6 条边界哨兵和对象归档全部保留。
|
||
- 性能只读观测:事件列表 0.315ms、资源时间线 0.116ms、Integration 列表 0.186ms、风险聚合 0.123ms;API P95/P99 使用既有 9.4 证据及发布后 Access Log 阈值,不执行接口压测。
|
||
- 本 Change 按明确约束不新增、修改或运行自动化测试;交付验证使用 OpenAPI 生成、覆盖静态门禁、编译、LSP、迁移/数据核对、只读性能观测和文档一致性检查。
|
||
|
||
## 14. 最终验收结论
|
||
|
||
2026-08-07 按 proposal、design、8 份 delta spec 和 77 项 tasks 完成最终核对:
|
||
|
||
| 门禁 | 最终证据 | 结论 |
|
||
|---|---|---|
|
||
| 静态覆盖 | `cmd/audit-coverage` 重新生成 692 条当前入口;Action/Resource Registry、敏感读取、N/A 和旧 Writer 白名单无未登记项 | PASS |
|
||
| LSP 与构建 | 变更 Go 文件 `gopls check` 无诊断;`go build ./...` 退出码 0 | PASS |
|
||
| 迁移 | `.env.local` 测试库只读核对版本 205、未标 dirty;无事实隔离 schema 已完成 `000199`~`000205` up/down,现有事实库未执行破坏性 down | PASS |
|
||
| OpenAPI | `cmd/gendocs` 与运行时生成成功;两份制品各含 15 条平台调查及代理/企业活动路径且契约一致;固定请求/响应枚举已生成真实 `enum`,审计相关公开 schema 无缺失字段说明,RouteSpec 已写明业务页字段、调查引用和通知目标映射 | PASS |
|
||
| 前端接入文档 | [审计链路与前端接入指南](跨视角调查与前端导航契约.md) 已覆盖 request/correlation/parent/integration/series 生命周期、数据库落点、自动与人工轮询边界、15 条接口全部入参与主要返回字段、现有业务页面入口矩阵和完整调用链;OpenAPI 48 个请求参数名无遗漏 | PASS |
|
||
| 数据库与 API 性能 | 四条代表性数据库查询均小于 1ms且低于 50ms;API P95/P99 复用 9.4 既有证据,发布后以 Access Log 按 200ms/500ms 阈值持续观测 | PASS |
|
||
| 身份与凭据 | 平台、代理店铺层级、企业有效授权和 `internal_only` 边界已核对;数据库/响应凭据抽样为 0 命中,无审计导出、归档读取/恢复或业务删除路由 | PASS |
|
||
| 事务与业务链路 | 关键成功同事务、失败短事务保留原错、批量根子计数、真实 actor、request/correlation/parent/series 及四类事实边界证据已在 11.4 收口 | PASS |
|
||
| 旧写切换 | 旧账号/资产 Writer 生产写为 0;旧表、旧资产历史查询和手动轮询运行 ledger 按契约保留 | PASS |
|
||
| 归档与清理 | `2001-02` 共 56/56 归档成功、Integration 28/28 final;dry-run 后测试库目标月三表归零,6 条边界哨兵、56 条断点及全部对象/manifest 保留,生产清理开关关闭 | PASS |
|
||
| 制品一致性 | `git diff --check` 无错误;`openspec validate build-multi-view-audit-center --strict` PASS | PASS |
|
||
|
||
验收范围内已知错误为零,77 项任务全部完成,Change 可归档。未实现项仍严格保持第 12 节边界,不因验收扩展。
|