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
5.1 KiB
5.1 KiB
P1-04.9.1 实施与验收报告:KMS/Vault、SLO 升级、回放死信接管与错误手册
日期:2026-08-24
状态:实现、迁移、全量自动化与超级管理员 Chrome UAT 均完成。
1. 本阶段目标
- 将企业日历 OAuth token、国内企业应用 secret、短期 token 与增量游标从单一本地主密钥扩展为可插拔 Vault Transit / 企业 KMS 托管。
- 建立持久化恢复探针和不可变演练证据,确认“能加密”之外也“能恢复历史密文”。
- 把日历 SLO 从只读仪表盘升级为打开、提醒、升级、恢复的通知生命周期。
- 为回放死信增加负责人、人工重入、人工解决和不可变事件账本。
- 将确定性错误分类发布为管理端可查的版本化运营手册。
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_drillsplaybook_calendar_slo_alert_eventsplaybook_calendar_replay_events
新增接口:
GET /governance/secret-custody/statusGET|POST /governance/secret-custody/recovery-drillsGET /governance/calendar-slo-alert-eventsGET /governance/calendar-provider-error-catalogGET /governance/calendar-replay-jobs/{job_id}/eventsPOST /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. 验收证据
最终结果:
- 后端:355 collected,351 passed,4 skipped;无失败。新增用例覆盖 Vault Transit、KMS 网关、legacy 双读、production 门禁、持久化恢复探针、SLO 打开/升级/恢复、回放死信接管/重入。
- PostgreSQL:升级到
20260824_0062 (head);全新 SQLite 从零升级到 head 也通过。 - 前端:typecheck 通过;45/45 测试通过;生产 build 通过,143 个页面/路由。
- OpenAPI:YAML 可解析,117 paths / 174 schemas,所有 schema
$ref均可解析。 - 服务:Contract API
8100health=ok,Web3000HTTP 200,AI API8101保持运行;治理 Worker 重启且 stderr 无错误。 - 超级管理员 Chrome UAT:账号
uat.legal.20260823@example.test、工作区“Playbook 隔离 UAT”;P1-04.9.1、托管状态、恢复探针、SLO 升级、错误手册、回放人工接管均可见,治理数据加载错误为 false。
UAT 未点击“解密持久化恢复探针”,避免在用户租户写入额外演练证据;该写操作已由隔离 API 自动化覆盖。