关于 using-sops
用于管理仓库中经 sops 加密的 dotenv 密钥,要求通过项目的 `pnpm secrets` 封装工具操作。它说明开发与经授权的生产密钥流程,并强调避免将私钥写入文件或日志。
主要功能
- 01加密 dotenv 密钥工作流
- 02项目的 `pnpm secrets` 封装工具
- 03开发密钥读取与编辑命令
- 04经授权的生产访问流程
- 05私钥处理防护措施
适用场景
- 01读取或更新开发密钥
- 02使用解密后的环境变量运行进程
- 03为获授权的任务访问生产密钥
- 04在环境变量架构和密钥文件中添加变量
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jssblck/ agents --skill using-sops安装后在 Claude Code 中输入/using-sops确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlreferences/setup.mdsops-notes.md详细介绍
使用 sops
采用此布局的仓库会将机密作为经 sops 加密的 dotenv 文件提交到 git,每个部署环境对应一个文件:secrets/dev.env、secrets/prod.env。这些文件使用 age 身份解密。没有 .env,没有机密服务,也无需登录。每次克隆时,所有 checkout、worktree 和云沙箱都会包含这些加密文件;唯一需要的输入是 age 私钥。
pnpm secrets(tools/secrets.ts)是唯一接口。在包含此封装工具的仓库中,不要直接调用 sops。
身份
| 身份 | 范围 | 私钥所在位置 | 可解密 |
|---|---|---|---|
agent | 用户级 | 每台运行 Agent 的机器上的 ~/.config/sops/age/keys.txt;云沙箱中的 SOPS_AGE_KEY | dev.env |
personal | 用户级 | 用户的密码管理器 | 列出其公钥的文件 |
prod | 每个项目 | 该项目的生产平台和文档记录的密码管理器条目 | prod.env |
.sops.yaml 按公钥列出接收者。加密不需要私钥;解密或编辑则需要某个接收者的私钥。agent 和 personal 是所有项目共享的本地开发密钥;prod 则按项目单独生成,因此泄露一个部署变量只会暴露一个项目。这些是约定,并不保证一定存在相应接收者。现有仓库可能只使用共享的 dev 和 prod 密钥。选择密钥前,请阅读仓库的机密指南和 .sops.yaml;加密文件的接收者元数据决定了哪些身份可以解密它。
Agent 工作流
开发环境的密钥由你自行管理,无需询问:
pnpm secrets show dev # everything, decrypted
pnpm secrets get dev STRIPE_KEY
pnpm secrets set dev STRIPE_KEY sk_test_1
pnpm secrets unset dev STRIPE_KEY
pnpm secrets exec dev -- node apps/worker/src/main.ts
exec 会将解密后的值放入子进程的环境中(覆盖 shell 环境),从中移除
SOPS_AGE_KEY*,转发信号,并以子进程的状态退出。
当已授权的任务需要生产环境密钥时,请自行执行提权。不要要求用户运行命令,也不要要求用户再次确认已授权的任务。
- 使用
pnpm secrets exec prod -- true检查访问权限,该命令不会输出任何密钥值。 仅有现成的.age/elevated文件并不能证明其中的密钥可以解密 prod。 - 如果访问失败,请阅读仓库的密钥指南和接收方配置。使用文档中指定的账户、保险库、条目和字段来获取匹配的密钥。不要假定使用
Personal保险库、age-personal接收方或 CLI 的默认账户。 - 自行运行文档中说明的读取命令,并将密钥直接传入包装器:
op read 'op://VAULT/ITEM/FIELD' --account ACCOUNT | pnpm secrets elevate。 将占位符替换为查明的标识符;切勿输出密钥。 - 使用
pnpm secrets exec prod -- true确认可以解密,然后继续执行任务。
如果文档中记录的 1Password 位置不存在,请使用 op account list --format json
和 op vault list --account ACCOUNT --format json 来查明正确的账户和保险库。使用
op item list --account ACCOUNT --vault VAULT --format json 搜索该保险库中的条目元数据,
仅检查匹配的条目。后续读取时请传入 --account。Private、Personal 和 Shared 是
不同的名称,不能互换。如果找到了密钥但无法解密,请将其公钥与文件中的接收方进行比较,而不是反复尝试不同的保险库名称。切勿让私钥出现在工具输出中。
仅当任务进展需要用户介入时才询问用户,例如需要解锁 1Password 或授予当前不可用的访问权限。请说明实际阻碍。提权仅适用于当前检出目录,在删除 .age/elevated 前一直有效;不要将其复制到其他工作树。
添加变量时,请将其加入环境变量 schema,以及所有你能够解密的 secrets/<env>.env 文件。如果无法解密 prod,请在 PR 中说明:类型化环境变量检查会导致 prod 启动失败,直到设置该值为止;这正是预期的提示信号。
绝不要将 AGE-SECRET-KEY-... 写入受版本控制的文件、日志或提交中。绝不要将 personal 或 prod 用作云环境。
人工设置
关于一次性步骤(生成密钥、安装 sops 和 age、将 agent 密钥接入 Agent 工具和云沙盒、配置 prod 平台以及轮换密钥),请阅读 references/setup.md。当用户要求你提醒他们这些步骤时,请按顺序引导他们完成该文件中的内容。
关于设计所依赖的 sops 和 age 行为(身份联合、updatekeys、exec-env 的限制、dotenv 的特殊行为),请阅读 references/sops-notes.md。