1d85329a6a
Build and Test Quality Gate / Contract Web typecheck and build (pull_request) Successful in 9m12s
Build and Test Quality Gate / Isolated Alibaba and Tencent KMS gateway (pull_request) Failing after 4m53s
Build and Test Quality Gate / Python tests and Contract API migration (pull_request) Failing after 24m55s
Security Quality Gate / npm audit, Bandit, pip-audit, detect-secrets (pull_request) Failing after 8m42s
92 lines
5.1 KiB
Markdown
92 lines
5.1 KiB
Markdown
# P1-04.9.1 实施与验收报告:KMS/Vault、SLO 升级、回放死信接管与错误手册
|
||
|
||
日期:2026-08-24
|
||
状态:实现、迁移、全量自动化与超级管理员 Chrome UAT 均完成。
|
||
|
||
## 1. 本阶段目标
|
||
|
||
1. 将企业日历 OAuth token、国内企业应用 secret、短期 token 与增量游标从单一本地主密钥扩展为可插拔 Vault Transit / 企业 KMS 托管。
|
||
2. 建立持久化恢复探针和不可变演练证据,确认“能加密”之外也“能恢复历史密文”。
|
||
3. 把日历 SLO 从只读仪表盘升级为打开、提醒、升级、恢复的通知生命周期。
|
||
4. 为回放死信增加负责人、人工重入、人工解决和不可变事件账本。
|
||
5. 将确定性错误分类发布为管理端可查的版本化运营手册。
|
||
|
||
## 2. 已实现范围
|
||
|
||
### 2.1 密钥托管
|
||
|
||
- 后端:`local_fernet`、`vault_transit`、`kms_gateway`。
|
||
- 新密文使用带后端版本的 envelope,错误后端不会静默尝试解密。
|
||
- Vault Transit 使用实际 encrypt/decrypt HTTP 契约;KMS 网关使用实际 HTTPS/Bearer 最小契约,可在网关侧适配阿里云、腾讯云或 HSM。
|
||
- 外部托管凭据只从文件读取,HTTP 不跟随重定向,生产强制 HTTPS。
|
||
- production 使用 `local_fernet` 时运行时检查返回 error。
|
||
- 旧 Fernet 密文通过独立、临时、只读 legacy recovery key file 双读,不允许与新密文后端混淆。
|
||
|
||
### 2.2 恢复演练
|
||
|
||
- 管理端展示脱敏托管状态、生产门禁、key reference 和旧密文恢复状态。
|
||
- `round_trip` 用于即时加解密验证;`recovery_canary` 会优先解密此前持久化的同一探针。
|
||
- 数据库不保存探针明文,只保存密文、期望摘要、恢复摘要、匹配结果、耗时和脱敏错误。
|
||
- 成功和失败都形成租户隔离的不可变证据。
|
||
|
||
### 2.3 SLO 告警升级
|
||
|
||
- 租户策略新增:告警开关、冷却分钟、升级等待分钟、恢复通知开关。
|
||
- Worker 生成 `opened`、`reminded`、`escalated`、`resolved` 事件。
|
||
- L1/L2 与首次观察时间一并保存;外部通知失败不影响 SLO 事件证据。
|
||
- 现有通知通道迁移时自动订阅 SLO 打开、升级、恢复和回放死信事件。
|
||
|
||
### 2.4 回放死信人工接管
|
||
|
||
- 回放任务新增负责人、接管原因、接管时间、人工重入累计、人工结论。
|
||
- 新增动作:`take_over`、`requeue`、`resolve`、`cancel`。
|
||
- 仅死信可接管、重入或人工解决;运行中任务禁止人工取消。
|
||
- 人工重入重置本轮 attempt count,但保留 `manual_requeue_count`、原失败运行和完整事件账本。
|
||
- 回放进入死信时自动发出站内及已订阅外部通知。
|
||
|
||
### 2.5 提供方错误手册
|
||
|
||
- 九类错误均定义默认重试性、首响/升级分钟、负责人角色和操作步骤。
|
||
- API 返回版本与 SHA-256 摘要,管理页展示同一目录,便于确认前后端手册一致。
|
||
- 本地详细手册:`project-docs/playbook-calendar-provider-error-operations-runbook-2026-08-24.md`。
|
||
|
||
## 3. 数据与接口
|
||
|
||
迁移:`20260824_0062`。
|
||
|
||
新增表:
|
||
|
||
- `playbook_secret_recovery_drills`
|
||
- `playbook_calendar_slo_alert_events`
|
||
- `playbook_calendar_replay_events`
|
||
|
||
新增接口:
|
||
|
||
- `GET /governance/secret-custody/status`
|
||
- `GET|POST /governance/secret-custody/recovery-drills`
|
||
- `GET /governance/calendar-slo-alert-events`
|
||
- `GET /governance/calendar-provider-error-catalog`
|
||
- `GET /governance/calendar-replay-jobs/{job_id}/events`
|
||
- `POST /governance/calendar-replay-jobs/{job_id}/intervention`
|
||
|
||
OpenAPI 当前为 117 paths / 174 schemas;最终验收会再次验证 YAML 可解析。
|
||
|
||
## 4. 明确边界
|
||
|
||
- 本地/UAT 没有伪造真实 Vault、阿里云 KMS 或腾讯云 KMS 账号;外部适配器通过隔离 MockTransport 验证请求、响应、密文 envelope 和 legacy 双读。
|
||
- 真正发布前仍需客户提供 Vault/KMS endpoint、key、文件凭据、CA 链和网络白名单,在隔离预发布环境执行恢复演练。
|
||
- KMS 网关负责云厂商认证、密钥轮换与 AAD 元数据;合同 API 不持有云厂商 AccessKey。
|
||
|
||
## 5. 验收证据
|
||
|
||
最终结果:
|
||
|
||
- [x] 后端:355 collected,351 passed,4 skipped;无失败。新增用例覆盖 Vault Transit、KMS 网关、legacy 双读、production 门禁、持久化恢复探针、SLO 打开/升级/恢复、回放死信接管/重入。
|
||
- [x] PostgreSQL:升级到 `20260824_0062 (head)`;全新 SQLite 从零升级到 head 也通过。
|
||
- [x] 前端:typecheck 通过;45/45 测试通过;生产 build 通过,143 个页面/路由。
|
||
- [x] OpenAPI:YAML 可解析,117 paths / 174 schemas,所有 schema `$ref` 均可解析。
|
||
- [x] 服务:Contract API `8100` health=ok,Web `3000` HTTP 200,AI API `8101` 保持运行;治理 Worker 重启且 stderr 无错误。
|
||
- [x] 超级管理员 Chrome UAT:账号 `uat.legal.20260823@example.test`、工作区“Playbook 隔离 UAT”;P1-04.9.1、托管状态、恢复探针、SLO 升级、错误手册、回放人工接管均可见,治理数据加载错误为 false。
|
||
|
||
UAT 未点击“解密持久化恢复探针”,避免在用户租户写入额外演练证据;该写操作已由隔离 API 自动化覆盖。
|