Files
pikasTech-agentrun/docs/reference/spec-v01-secret-distribution.md
T
2026-05-29 12:07:00 +08:00

9.2 KiB
Raw Blame History

v0.1 Secret 与 provider credential 分发规格

本文定义 AgentRun v0.1 的 Secret 和 Code Agent provider credential 分发边界。真实 Code Agent backend 需要上游模型凭据;Codex 测试凭据以 ~/.codex/auth.json~/.codex/config.toml 为输入源,通过 Kubernetes Secret 投影进入 runner/backend Pod。这些值不得进入 Git source、GitOps branch、artifact catalog、event、trace、日志或 CLI 输出。

设计目标

  • API Key、Codex auth/config 等 provider credential 只通过 Kubernetes SecretRef 分发到需要它的 manager、runner 或 backend adapter。
  • deploy/deploy.json 只记录 SecretRef 名称、key 名称、mount/env intent 和 secret scope,不记录 Secret 值。
  • v0.1-gitops 的 rendered manifests 只能引用 Secret 名称和 key,不包含 Secret data。
  • agentrun-mgr 保存 run 的 executionPolicy.secretScope,但保存的是 credential source reference,不是 credential value。
  • runner 和 backend adapter 只能消费 manager 已授权的 secret scope,不能枚举 namespace 内所有 Secret。

Secret 分类

Secret 类别 用途 默认消费者 v0.1 规则
Postgres DSN manager 连接 durable store agentrun-mgr 只通过 agentrun-v01-mgr-db/DATABASE_URL 注入。
Codex 测试凭据文件 真实 Code Agent backend 调上游模型 runner 或 backend adapter 测试来源固定为 ~/.codex/auth.json~/.codex/config.toml,只通过 Kubernetes SecretRef 文件投影注入,不写入 run payload。
Git SSH deploy key Tekton checkout source/GitOps promotionArgo 读取 GitOps branch Tekton、Argo CD 只存在于 agentrun-ciargocd Secret;不进入 runtime Pod。
Registry credential push/pull private registry Tekton、runtime imagePullSecret 只作为 ServiceAccount/imagePullSecret 引用。
Future tenant credential tenant 专属工具或外部服务 runner/backend adapter 必须先定义 SecretRef 和 secret scope,再允许 run 引用。

固定命名建议

对象 v0.1 建议
Manager DB Secret agentrun-v01-mgr-db key DATABASE_URL
Provider Secret agentrun-v01-provider-codex keys auth.jsonconfig.toml
Provider projection target runner/backend 容器用户的 ~/.codex/auth.json~/.codex/config.toml
Provider config 非敏感 base URL/model 可以来自 config.toml 或 ConfigMapcredential value 不得放入 ConfigMap。
Tekton Git SSH Secret agentrun-ci/agentrun-git-ssh
Argo Git SSH Secret argocd/agentrun-git-ssh
Runtime ServiceAccount agentrun-v01-mgragentrun-v01-runner

命名可以在实现时因集群约束调整,但必须满足 lane 独立、用途单一、最小 RBAC 和不跨 v0.1/v0.2 复用的原则。

Codex 测试凭据注入

v0.1 综合联调使用的 Codex 测试凭据源固定为 operator 环境中的:

~/.codex/auth.json
~/.codex/config.toml

这两个文件只能作为 Kubernetes Secret 创建或轮换的输入源。禁止把宿主机 ~/.codex 以 hostPath 挂入 runner/backend Pod,禁止复制进镜像,禁止提交到 source branch、GitOps branch、artifact catalog、issue、PR、event、trace、日志或 CLI 输出。

默认 Secret projection 规则:

项目 v0.1 规格
Kubernetes Secret agentrun-v01/agentrun-v01-provider-codex
Secret key auth.json,来自 ~/.codex/auth.json
Secret key config.toml,来自 ~/.codex/config.toml
Projection path runner/backend 容器用户的 ~/.codex/auth.json~/.codex/config.toml
Projection mode 只读,建议 0400 或等价最小权限
Runtime env 如 backend 需要,可设置 HOME 或等价 Codex config root 指向投影后的 home;不得 fallback 到节点宿主机 home。

Secret 创建和轮换必须通过 Kubernetes 密钥管理完成。deploy/deploy.json 只写 SecretRef 名称、key 和 mount intentv0.1-gitops rendered manifests 只引用 Secret,不包含 Secret data。

Run secretScope 合同

Run 的 executionPolicy.secretScope 只能包含引用,不包含值。示例形态:

{
  "providerCredentials": [
    {
      "profile": "codex",
      "secretRef": {
        "namespace": "agentrun-v01",
        "name": "agentrun-v01-provider-codex",
        "keys": ["auth.json", "config.toml"],
        "mountPath": "~/.codex"
      }
    }
  ],
  "allowCredentialEcho": false
}

规则:

  • allowCredentialEcho 必须固定为 false
  • secretRef.namespace 默认只能是 run 所在 lane namespace 或明确批准的 platform namespace。
  • manager 可以保存 secretRef,但不得读取 Secret 值后存库。
  • runner/backend adapter 获得 Secret 的方式必须来自 Kubernetes env/file projection 或受限 Secret API 读取;Codex 默认使用文件 projection 到 ~/.codex/auth.json~/.codex/config.toml,不得通过 run payload、event、CLI 参数或日志传递。
  • SecretRef 不存在或 RBAC 不允许时,run 必须失败为结构化 failureKind=secret-unavailable 或等价错误,不得降级成无凭证重试风暴。

分发路径

v0.1 默认路径:

deploy/deploy.json
  -> declares SecretRef names and mount/env intent only
Tekton promotion
  -> renders SecretRef references into v0.1-gitops manifests
Argo CD
  -> syncs workload references to agentrun-v01
Kubernetes Secret
  -> created from ~/.codex/auth.json and ~/.codex/config.toml by operator or approved secret-management flow
runner/backend Pod
  -> receives Codex auth/config via read-only file projection

Secret 创建和轮换不由 source branch 自动生成;source branch 只声明需要哪个 SecretRef。后续如果接入 External Secrets、Vault、SealedSecrets 或 SOPS,必须新增或更新本 spec,明确 controller、source of truth、rotation 和 redaction 规则。

Codex Secret dry-run 工具

v0.1 提供只读 CLI 工具,用 operator 本地 ~/.codex/auth.json~/.codex/config.toml 构造 Kubernetes Secret 创建计划:

bun scripts/agentrun-cli.ts secrets codex render --dry-run

可选参数:

  • --codex-home <dir>:覆盖默认 ~/.codex 输入目录。
  • --auth-file <path> / --config-file <path>:分别覆盖输入文件路径。
  • --namespace <name>:默认 agentrun-v01
  • --secret-name <name>:默认 agentrun-v01-provider-codex

输出必须是 JSON,并且只包含 namespacesecretNamekeys、每个输入文件的 bytessha256/contentHash、整体 hash、redaction 状态、apply 命令形状和 Secret manifest 摘要。输出不得包含 Secret value、auth.json 明文、config.toml 明文、base64 data 字段或可直接恢复 credential 的内容。工具只支持 --dry-run;不得执行 kubectl apply

失败必须结构化返回 failureKind:缺文件、不可读文件或空 credential 归类为 secret-unavailable;非法 JSON/TOML 归类为 schema-invalid

日志与事件 Redaction

  • event、trace、日志、CLI 输出、health 和 diagnostics 不得打印 Secret 值。
  • Authorizationapi_keytokenpassword、URL credential、DSN password、Codex auth.jsonconfig.toml 文件内容必须 redacted。
  • 可以打印 SecretRef 名称、key 名称、credential source、是否存在、是否被挂载、是否通过 readiness 检查。
  • provider auth 失败只能报告 failure kind、HTTP status 分类和 request id;不得打印请求 header 或 body 中的凭据。

测试规格

T1 SecretRef render

阅读本文和 spec-v01-cicd.md,然后检查 deploy/deploy.json 只包含 SecretRef 名称/key 和 mount/env intentrendered GitOps manifest 也只包含 SecretRef,不包含 Secret data。

T2 Runner credential projection

阅读本文,然后启动一个最小 backend runner dry-run,确认 Pod file projection 能看到 ~/.codex/auth.json~/.codex/config.toml,但 event、日志和 CLI 输出只显示 redacted credential source,不显示文件内容。

T3 Missing secret failure

阅读本文,然后用一个不存在的 provider SecretRef 创建 run,确认 run 失败为结构化 secret-unavailable,不会打印 Secret 值,也不会无限重试。

规格的实现情况

规格项 状态 说明
Secret 分发规格 已定义 本文为 v0.1 provider credential 分发权威。
Kubernetes SecretRef 注入 部分实现 runner Job dry-run 渲染已按 run executionPolicy.secretScope.providerCredentials 生成 Secret volume projection 和 CODEX_HOME,但尚未 apply 到集群。
Codex Secret dry-run 工具 已实现 bun scripts/agentrun-cli.ts secrets codex render --dry-run 只输出 Secret 创建计划、hash 和 redacted manifest 摘要,不执行 apply。
Codex auth/config file projection 部分实现 backend readiness 检查 auth.json/config.toml 可读性,缺失时返回 secret-unavailable;self-test 使用临时文件模拟投影。
redaction 最小规则 部分实现 Secret dry-run 工具、event、Job dry-run 输出和 self-test 已验证不打印测试 token;复杂审计仍待后续补齐。
外部 secret manager 未采用 如需 Vault/ExternalSecrets/SOPS,后续单独更新规格。