mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-23 03:18:09 +08:00
130 lines
8.0 KiB
Markdown
130 lines
8.0 KiB
Markdown
# 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 固定 `bearer` scheme 并要求 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. 产品部署已实现但保持默认关闭
|
||
|
||
以下接受门已经全部完成:
|
||
|
||
1. ~~独立 TLS 1.3/mTLS + purpose-bound OIDC management process;~~ 已完成,断言使用独立
|
||
JWT type/purpose/audience,keyset generation/revocation 由 `pg-9014` 耐久围栏;
|
||
2. ~~bounded HTTP body/concurrency/peer/rate limit 和 caller-driven client;~~ 已完成,固定
|
||
`/api/v3/provider-credentials/management`,认证先于 body,客户端零自动 retry;
|
||
3. ~~opt-in Kubernetes Deployment、NetworkPolicy、PDB、独立 Secret/CA 与 digest-pinned admin
|
||
image;~~ 已完成,双副本 manager 与 caller-driven Job 均不进入默认 operations;
|
||
4. ~~PostgreSQL 真库最小 ACL、COMMIT-response-loss、并发单赢家和 physical HA 晋升证据;~~
|
||
已由 PostgreSQL 18.4 arm64 HA 门完成;
|
||
5. ~~content-free audit query 与明确不保存/返回 SecretRef 的检查;~~ 已完成,固定只读
|
||
bind/revoke operation,单页 1–32、降序 keyset;响应删除 Provider/SecretRef、binding/transition
|
||
digest 与 authentication identity,查询访问审计和 authorization fence 复验同事务;
|
||
6. ~~test connection 的 provider allowlist、deadline、零 retry、audit-before-network 和费用/限流
|
||
预算,或继续保持关闭。~~ 已由 ADR-0265 完成:manager 只签发 server-derived content-free
|
||
plan,独立 one-shot tester 才能读取投影 Secret 和访问 exact provider endpoint。
|
||
|
||
## 被否决方案
|
||
|
||
1. **复用 `ql3_ai_maintenance`**:把 credential manager 扩权到 Prompt Artifact 删除。
|
||
2. **复用 Cluster Control runtime role**:让常驻请求处理进程取得 binding mutation。
|
||
3. **新建 credential-manager workspace package**:部署差异由同一 admin image 的独立
|
||
entrypoint/Deployment 表达,代码仍属于已有能力包,不满足第 20 个 importer 门。
|
||
4. **只写 transition、不写允许审计**:无法证明谁在什么 Project fence 下授权。
|
||
5. **先 audit 后独立写 transition**:崩溃会产生虚假允许事实或未审计 mutation。
|
||
6. **提前开放 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-9013` checksum:
|
||
`c02a4c6b2953cc331580b6287283d33739c30c2e189d011f392c13ecea497224`;
|
||
- `pg-9014` checksum:
|
||
`02098fad764199bc5a7750483d050be5e5acdbcecd05c0975c3fe4e5be03c782`;
|
||
- PostgreSQL 18.4 arm64 physical HA 门完成 `remote_apply`、timeline 1→2、旧主 fencing、
|
||
`pg_rewind` 只读重入和 fresh controls,总 gate `passed=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 已可生产使用。
|