age + sops 实战:给自建服务的密钥和 .env 上一把真正的锁

自建服务跑得越多,钥匙就越多。数据库密码、第…

自建服务跑得越多,钥匙就越多。数据库密码、第三方 API Key、云存储的 Access Token,还有那一堆 .env 配置文件,散落在十几台机器和 Git 仓库里,几乎全是明文。今天不聊大架构,只推两个我现在每天都在用的小工具——agesops,半小时就能把你的密钥管得明明白白。

为什么是 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

几个踩过的坑

  1. 私钥权限要 chmod 600,而且千万别把 keys.txt 提交进 Git,这是底线。
  2. 私钥一定要异地备份,age 没有「找回密码」这回事,丢了就真的解不开了。
  3. .sops.yaml 里的公钥是公开的,放心提交,泄露了也无所谓。
  4. 如果怀疑私钥泄露,age 不支持吊销,只能换个新密钥把相关文件重新加密一遍。
  5. 自建环境用 age 后端最省心;sops 还支持 AWS KMS、GCP KMS,等真上了云再考虑。

我现在所有项目的 .env、证书、token 都是这套流程在管,写进 Git 也不慌了。工具不复杂,贵在坚持用起来。如果你也在自建服务,建议今晚就花半小时把这套 age + sops 跑通——安全感这东西,是真的会传染。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注