8.0 KiB
ADR-0264:独立 Cluster Model Provider Credential 管理边界
- 状态:Accepted
- 日期:2026-08-02
- 关联:RFC D-08、D-12、D-85、D-159;ADR-0169、ADR-0263
背景
ADR-0263 已交付 append-only Provider credential catalog、durable use audit、只读
projected material 和显式 Cluster AI composition,但 binding 配置仍没有产品管理 ceremony。
直接让常驻 control 或通用 ql3_ai_maintenance 执行 binding mutation 都不合理:
- control 会从 runtime read/audit authority 升格为 credential mutation authority;
ql3_ai_maintenance同时拥有 Prompt output GC/key-retirement 权限,常驻管理服务复用它会 取得与 credential binding 无关的 Artifact 删除能力;- 只在 HTTP 层检查 Policy、再用 raw repository 写 transition,会留下授权撤销 TOCTOU 和 mutation 已提交但允许审计缺失的窗口;
- 请求体自报 actor、Policy decision 或 fence 无法形成可信产品入口。
决策
1. 使用独立数据库角色但不新增 workspace package
CloudNativePG 增加 ql3_ai_credential_manager,connection limit 为 4。该角色只取得:
ql3.projects、ql3.project_role_bindings、ql3.security_audit_events的 SELECT;ql3.security_audit_events的 INSERT;ql3_ai.ai_schema_migrations、credential binding/transition/use-audit 的 SELECT;- credential binding/transition 的 INSERT。
它没有 UPDATE/DELETE、schema CREATE、Prompt output、price catalog、invocation、runtime、
Worker、Package 或 migration authority。pg-9013 只追加这一 ACL boundary,不修改
pg-9001–pg-9012 checksum。pg-9014 再增加固定
model-provider-credential-management authority 的 identity keyset ledger;manager 只有
SELECT/INSERT/UPDATE,没有 DELETE,ql3_ai_maintenance 也不能读取或改写它。
2. Credential transition 与允许审计必须同事务
@qinglong/ai/model-provider-credential-administration 定义 authorized mutation:
- catalog command;
- server-derived User actor;
- exact Project/RoleBinding fence;
- operation/project/actor/authentication/fence-bound allowed SecurityAudit。
PostgreSQL repository 的 commitAuthorized 在同一 SERIALIZABLE transaction 中取得
Project+Provider advisory lock,复验 active Project 与当前 User binding fence,执行 generation
CAS,append immutable binding/transition 和 SecurityAudit,再统一 COMMIT。exact replay 必须
同时匹配 catalog command 与原 authorization audit;孤立 audit、孤立 transition、身份漂移、
generation 漂移和 fence 漂移都失败关闭。
raw commit 暂时保留给 migration/HA 证据和受控内部测试,但产品 composition 只能取得
commitAuthorized repository。
3. Cluster Admin facade 不接受调用方 authority
能力留在现有 @qinglong/cluster-admin:
- 只接受五分钟内的 MFA/hardware User;
- 固定对 exact Project 请求
secret.manage; - actor、
changedBy、Policy decision、reasons、fence 和 audit 全由服务端派生; - bind 固定
bearerscheme 并要求 canonical Project-bound SecretRef; - revoke 不接受 binding/material;
- transport 只返回 Project、Provider、generation、active revision/digest、transition digest 和 时间,不返回 SecretRef、Secret name、token、header 或 raw error。
transport 暴露 provider-credential.bind|revoke|audit.list。audit query 复用同一强 User、
secret.manage 和 Project/RoleBinding fence,但只返回 bind/revoke 的 actor、fence、时间与游标;
查询访问审计与读取 snapshot 在同一 SERIALIZABLE transaction 中提交。inspect 和 test
connection 在取得同等级隔离执行、rate/quota 与 content-free response 门之前保持关闭。
4. 产品部署已实现但保持默认关闭
以下接受门已经全部完成:
独立 TLS 1.3/mTLS + purpose-bound OIDC management process;已完成,断言使用独立 JWT type/purpose/audience,keyset generation/revocation 由pg-9014耐久围栏;bounded HTTP body/concurrency/peer/rate limit 和 caller-driven client;已完成,固定/api/v3/provider-credentials/management,认证先于 body,客户端零自动 retry;opt-in Kubernetes Deployment、NetworkPolicy、PDB、独立 Secret/CA 与 digest-pinned admin image;已完成,双副本 manager 与 caller-driven Job 均不进入默认 operations;PostgreSQL 真库最小 ACL、COMMIT-response-loss、并发单赢家和 physical HA 晋升证据;已由 PostgreSQL 18.4 arm64 HA 门完成;content-free audit query 与明确不保存/返回 SecretRef 的检查;已完成,固定只读 bind/revoke operation,单页 1–32、降序 keyset;响应删除 Provider/SecretRef、binding/transition digest 与 authentication identity,查询访问审计和 authorization fence 复验同事务;test connection 的 provider allowlist、deadline、零 retry、audit-before-network 和费用/限流 预算,或继续保持关闭。已由 ADR-0265 完成:manager 只签发 server-derived content-free plan,独立 one-shot tester 才能读取投影 Secret 和访问 exact provider endpoint。
被否决方案
- 复用
ql3_ai_maintenance:把 credential manager 扩权到 Prompt Artifact 删除。 - 复用 Cluster Control runtime role:让常驻请求处理进程取得 binding mutation。
- 新建 credential-manager workspace package:部署差异由同一 admin image 的独立 entrypoint/Deployment 表达,代码仍属于已有能力包,不满足第 20 个 importer 门。
- 只写 transition、不写允许审计:无法证明谁在什么 Project fence 下授权。
- 先 audit 后独立写 transition:崩溃会产生虚假允许事实或未审计 mutation。
- 提前开放 inspect/test:会绕过尚未完成的审计、网络和 Provider 费用边界。
当前验证
- AI 全量 176 项:173 通过、3 条外部 PostgreSQL 条件跳过;
- Cluster Admin 全量 242 项:240 通过、2 条外部条件跳过;
- 新增 administration/facade/transport/process/HTTP/client 定向门全部通过;
- dependency audit
findings=[],workspace 保持 19; - CloudNativePG deployment/backup/DR 静态门 24/24;
pg-9013checksum:c02a4c6b2953cc331580b6287283d33739c30c2e189d011f392c13ecea497224;pg-9014checksum:02098fad764199bc5a7750483d050be5e5acdbcecd05c0975c3fe4e5be03c782;- PostgreSQL 18.4 arm64 physical HA 门完成
remote_apply、timeline 1→2、旧主 fencing、pg_rewind只读重入和 fresh controls,总 gatepassed=true;credential management 子门 证明 4 条 content-free SecurityAudit、bind/revoke/rebind、同 generation 双 manager 并发单赢家、 陈旧 CAS 拒绝、COMMIT-response-loss exact replay、专用 manager ACL 和旧 maintenance deny, 且晋升后全部存活;同轮还证明两个 manager 对 identity generation 竞争收敛、回滚/同代改写/ 隐式移除拒绝、COMMIT-response-loss 恢复和 generation 3 跨晋升存活; - manager 与 client 两套 Kustomize 均可渲染;独立 deployment audit 正向与 pool 扩权负向
2/2,dependency audit
findings=[]; - content-free audit query 定向 3/3,facade/transport/client/process 联合定向 18/18;PostgreSQL 18.4 arm64 HA 进一步证明 4 条管理记录的两页 keyset、2 条访问审计、COMMIT-response-loss exact replay,以及 timeline 1→2 后重放不新增 WAL/审计且响应仍不含 SecretRef、Provider、 authentication identity 或 transition/binding digest;
- 首次真库运行发现并修复 migration plan 已登记
pg-9013、history identity 白名单漏登记的 fail-closed 漂移; - ADR-0265 的受预算 test connection 已完成纯协议、manager plan/quota、one-shot executor、 Kubernetes 静态部署边界和 PostgreSQL 18.4 physical HA 证据;真实外部 IdP、证书轮换、 provider 网络与多节点 Kubernetes 纵切面仍是发布证据,因此 Accepted 只表示架构决策与当前 实现门闭合,不表示 credential management 已可生产使用。