Skip to content

fix(config): standardize runtime secret injection#85

Draft
ULookup wants to merge 2 commits into
3.0-devfrom
fix/62-standardize-secret-injection
Draft

fix(config): standardize runtime secret injection#85
ULookup wants to merge 2 commits into
3.0-devfrom
fix/62-standardize-secret-injection

Conversation

@ULookup

@ULookup ULookup commented Jul 22, 2026

Copy link
Copy Markdown
Owner

关联 Issue

Closes #62
Refs #22

目标版本:3.0-dev

变更摘要

  • 新增统一的 allowlist 型运行时 Secret resolver,为 12 类 JWT、MySQL、RabbitMQ、SMTP 与 S3 输入提供直接环境变量或 _FILE 二选一解析。
  • 将 Identity、Gateway、Push、Conversation、Relationship、Message、Media、Transmite 的密钥消费迁移到启动期解析,移除受跟踪配置、gflags 和私有 getenv fallback。
  • Root Compose 与补充 MinIO Compose 改为显式部署输入;本地模板仅保留不可用 placeholder。
  • 增加仓库级防回归策略、MinIO 测试 helper 的 fail-closed 覆盖,并同步 runtime-secret/JWT 轮换 runbook、架构参考和安全/测试 Skills。
  • 清理历史工程文档中复制的旧凭据字面量,不重写 Git 历史。
  • 按评审边界要求,本 PR 不修改 .github/workflows/ci.yml;CI 注入、执行效率与完整栈门禁归入 Make the clean-slate Compose stack and CI runtime gates executable #78 的独立 PR。

根因

运行时凭据散落在源码默认值、JSON、local/docker 配置和 Compose 中,各服务又存在不同的读取路径与 fallback。仓库缺少一个可执行的注入契约和防回归门禁,导致可用凭据可能被提交、复制或在启动时静默回退。

行为与兼容性

  • 不改变 Proto、HTTP、brpc、MQ、缓存或持久化语义。
  • Secret 只在进程启动阶段读取一次,不进入请求热路径,因此不增加并发路径锁、I/O 或额外网络调用。
  • 缺失、直接值/_FILE 冲突、空值、超限、NUL、symlink、非普通文件、不允许的 owner/mode 均启动失败关闭。
  • 旧 secret flags 与 tracked-file fallback 被有意移除;部署必须先提供新注入契约。
  • 真实凭据轮换、生产挂载与生产发布仍需人工批准。

RED / GREEN 证据

RED(生产代码前):

cd tests && go test ./pkg/agentpolicy -run '^TestRepositoryRejectsTrackedRuntimeSecrets$' -v -count=1

该命令先报告 38 个契约违规:26 个受跟踪赋值、统一 resolver 缺失、9 个消费者未接线与 2 个直接环境读取。MinIO helper 的独立 RED 证明空凭据仍会回退弱默认值。

GREEN / 回归:

  • go test ./pkg/agentpolicy -run '^TestRepositoryRejectsTrackedRuntimeSecrets$' -v -count=1
  • go test ./pkg/agentpolicy ./cmd/agent-policy -count=1
  • go vet ./pkg/agentpolicy ./cmd/agent-policy
  • go test ./pkg/verify -count=1
  • go vet ./pkg/verify
  • go test ./pkg/contracts -count=1
  • go test ./pkg/client -run '^$' -count=1
  • C++17 resolver 语法与运行时正/反例检查通过。
  • Conversation、Gateway、Identity、Media、Message、Relationship、Transmite 均完整编译并链接通过。
  • 两份 Compose 在完整合成输入下解析通过,缺必需输入时按预期失败。
  • git diff --check 通过。

尚未宣称通过的验证

安全与运维

  • 错误只包含逻辑 locator 与稳定原因,不输出值、路径、长度或凭据衍生指纹。
  • _FILE 使用 O_NOFOLLOW | O_CLOEXEC、opened-FD fstat、regular-file、owner/mode、大小与 NUL 校验。
  • 本 PR 不读取或写入真实凭据。
  • 轮换顺序、回滚、审批边界见 docs/operations/runtime-secrets.mddocs/operations/jwt-key-rotation.md

架构与 Skills 同步

已同步 Configuration/Secret Provider 启动边界、消费者所有权、可靠性测试现状和生产审批边界;未引入商业 Secret Manager、动态热加载或新的业务协议。

审核状态

保持 Draft。待本 PR 自身 CI 结果、#82 与后续独立 #78 的验证证据齐备后,再由人工决定是否进入 review-ready;本代理不会合并。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant