age + sops 实战:给自建服务的密钥和 .env 上一把真正的锁
自建服务跑得越多,钥匙就越多。数据库密码、第…
自建服务跑得越多,钥匙就越多。数据库密码、第三方 API Key、云存储的 Access Token,还有那一堆 .env 配置文件,散落在十几台机器和 Git 仓库里,几乎全是明文。今天不聊大架构,只推两个我现在每天都在用的小工具——age 和 sops,半小时就能把你的密钥管得明明白白。
为什么是 age + sops
先说 age。这是个现代化的文件加密工具,作者是 Go 安全圈的 Filippo Valsorda。它想干的事就一件:把 GPG 那套复杂到劝退新手的体验,砍到只剩下「生成密钥、加密、解密」三步。没有 Web of Trust,没有吊销证书,简单到你会怀疑它是不是漏了什么功能。
age 适合加密整个文件,但现实里我们更常见的需求是:一个 .env 里只有 API Key 和密码是敏感的,其余配置都想保持明文可读。这时候就该 sops 上场了。它是 Mozilla 开源的配置加密工具,跟 age 配合后,能做到「只加密值、保留键名」,加密后的文件照样能进 Git 做版本管理。
安装与生成密钥
sudo apt install age sops
mkdir -p ~/.config/sops/age
age-keygen -o ~/.config/sops/age/keys.txt
macOS 用户直接 brew install age sops。生成的 keys.txt 里有一行 # public key: age1xxxx...,那个 age1 开头的就是公钥;下面的 AGE-SECRET-KEY- 是私钥,必须妥善保管。
加密与解密单文件
# 用公钥加密
age -r age1xxxx... -o secret.txt.age secret.txt
# 用私钥解密
age -d -i ~/.config/sops/age/keys.txt secret.txt.age > secret.txt
一句命令,一个文件。公钥可以随便贴出来,私钥自己留着就行。
用 sops 加密 .env
先写一个 .sops.yaml,告诉 sops 用哪个公钥:
creation_rules:
- path_regex: \.env$
age: age1xxxx...
然后把 .env 原地加密:
sops -e --in-place .env
之后想改配置,直接 sops .env,它会打开解密后的临时文件,保存时自动重新加密;要读取真实值就 sops -d .env。
几个踩过的坑
- 私钥权限要
chmod 600,而且千万别把keys.txt提交进 Git,这是底线。 - 私钥一定要异地备份,age 没有「找回密码」这回事,丢了就真的解不开了。
.sops.yaml里的公钥是公开的,放心提交,泄露了也无所谓。- 如果怀疑私钥泄露,age 不支持吊销,只能换个新密钥把相关文件重新加密一遍。
- 自建环境用 age 后端最省心;sops 还支持 AWS KMS、GCP KMS,等真上了云再考虑。
我现在所有项目的 .env、证书、token 都是这套流程在管,写进 Git 也不慌了。工具不复杂,贵在坚持用起来。如果你也在自建服务,建议今晚就花半小时把这套 age + sops 跑通——安全感这东西,是真的会传染。
