5 分•作者: pacmansyyu•5 个月前
大家好,
过去几周我一直在构建这个工具,旨在解决开发团队普遍存在的一个问题:安全地共享环境变量。
大家应该都遇到过这种情况——有人需要预发布环境的数据库 URL,结果通过聊天分享了。生产环境的 API 密钥最终出现在纯文本文件中。或者你设置了一些复杂的密钥管理系统,结果在关键部署期间却成为了单点故障。
在 Zerodha,我们是一家券商,有严格的监管要求。我们的基础设施需要可审计,而且我们的数据必须保留在我们这里以便即时恢复。但更深层的问题是,我们尝试的每一个解决方案都让部署依赖于外部服务。
我们尝试过 GitLab CI 内置的密钥,但它们未加密存储,只有代码库维护者才能访问。HashiCorp Vault 管理起来过于复杂,ACL 设置也很麻烦,而且现在又受到了他们的 BSL 许可证变更的限制。AWS Secrets Manager 会造成我们想要避免的厂商锁定。
转折点出现在我们希望通过 Terraform 管理密钥,以实现幂等性和更好的基础设施即代码实践。但 Terraform 没有内置的方法来加密密钥,除非依赖外部提供商。我们要么将密钥以纯文本形式存储在 Terraform 配置中,要么在部署流程中再添加一个外部依赖项。
这时我有了个想法:如果我们能将加密的环境变量直接注入到 Terraform 中,那么任何拥有正确密钥的人都可以进行部署,而无需从不同的系统中查找密钥呢?随着我对这个想法的不断改进,我意识到同样的模式也适用于任何应用程序——从个人项目到团队部署。
所以我构建了 kiln。它使用 age 加密将环境变量加密到与代码一起存在的文件中。无需服务器,无需网络调用,也无需外部依赖。每个团队成员都有自己的密钥,你可以按环境控制访问权限。
它的工作原理如下:
```
# 生成一个新的 age 密钥,或使用你现有的 SSH 密钥
kiln init key
# 使用团队的公钥进行初始化
kiln init config --recipients "alice=$(curl https://gitlab.company/alice.keys)" --recipients "me=$(cat ~/.ssh/id_ed25519.pub)"
# 设置密钥(安全提示,从不在终端中显示)
kiln set DATABASE_URL
kiln set API_KEY
# 使用解密后的环境运行你的应用程序
kiln run npm start
# 这些加密文件可以安全地提交
git add .kiln.env kiln.toml
```
为什么不使用 SOPS?SOPS 非常适合通用文件加密,但 kiln 专门为环境变量工作流程而构建。它具有“run”、“export”等命令,并内置了团队管理功能。可以把它想象成“针对 .env 文件的 SOPS”,重点在于开发者体验。
为什么不直接使用 age 加密?Age 非常适合加密层,但在日常团队工作流程中却很糟糕。试着用原始的 age 命令管理 20 个团队成员,跨越 5 个环境——你会疯掉的。kiln 处理编排工作。
关于技术细节,kiln:
* 使用 age 加密(现代、经过审计、简单)
* 与现有的 SSH 密钥一起使用,或生成新的 age 密钥
* 通过 TOML 配置进行基于角色的访问控制
* 单个跨平台 Go 二进制文件
* 零网络依赖——一切都离线工作
* MIT 许可
改变游戏规则的是:密钥随代码一起移动。不再有聊天中的“谁能给我发一下预发布环境的密钥?”。不再有因为密钥服务宕机而导致的部署中断。不再希望你的供应商不会改变他们的定价或许可。
试一试吧——我相信它会帮助你改进团队的部署工作流程。欢迎随时向我提问!
GitHub: [https://github.com/thunderbottom/kiln](https://github.com/thunderbottom/kiln)
文档: [https://kiln.sh](https://kiln.sh)
或者立即安装:go install github.com/thunderbottom/kiln@latest