5个版本 (破坏性更新)
0.5.0 | 2024年2月18日 |
---|---|
0.4.0 | 2024年2月12日 |
0.3.0 | 2024年2月11日 |
0.2.0 | 2024年2月7日 |
0.1.0 | 2024年2月3日 |
#1131 在 密码学
每月60次下载
62KB
953 行
yage: yaml age
一个简单的工具,用于使用age加密管理YAML文件中的加密秘密。
yage
使用 age加密 来加密YAML文件中的值,同时保持键不变。
一个简单的yaml文件,如下所示
backend:
url: https://example.com
username: gaspard
password: api_s3cr3t_k3y
会被yage
加密成
backend:
url: yage[YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1KzZiNVVvTThaQ0dSbVZBMElRUEpZRlVxb1VaamU3SGtWRWxseFBHMkVNClBsUGJMWFJ0MnA0czA0MEE0VnRjY3Q3VnE4NElpUHQ2aTNKUlVMOUJnbEUKLT4gZGVVYFRQcVwtZ3JlYXNlIHR+OSVVZyMhCituclJ0ZTZJU1grSmpxaTZvb2hMYlBvMnpIbGFja0ltRm9BdE9sTVJ5RG14RkhNaXNsc0xUbUViT1lyRVh6dWYKdHRsVU10SHJ1YytaY2hhdWdjQ0lJVnFkczJFcHBMMXl3QTNEQUc1SW9YM0hscGZVbEdPdWZWTQotLS0gcTVIZzZrdnVJNGNoNm51UEE1alJHVmJsQnRMdStuVXU0Q1pJSzFzVlU1QQqH64hS0UV4JI6CtYHpSCEslxLqi3764zaxF/VJy67gQOBrj2TV1z6NwJaBmlUPBQB2zROq|r:age15eesfkh778yljxzgwdq5vaqmmchg5py480vplsymzzqf0dwe5gnqrexdq6]
username: yage[YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVU2tuOWFpV2NDT05DSC9FbHNadzVVTTJmSFQwekRjRjZiOERDVTZ0aGdnCnhKTGpQcGY1SUw0bFd2cFhudC9yY1I0VTJxWklBYUkvYlhzNHhUeCtIVmsKLT4gTGJ+LWdyZWFzZSAhClJlTU5TZ3NldGRaRzRGQThOZmMrdkFnS0NzUnBpMmFpRTM4d0hGQXEKLS0tIGQvSXIxcXpDYk9yTU9ERDlEMHV1d0VmTGovWU9SVkJ5TkswYS9rMmdGbHMK3GehcWJL1GUKFGLJXQFGUQLhs56mgHRYpBIsFgYpyW818dG27bz1jQ==|r:age15eesfkh778yljxzgwdq5vaqmmchg5py480vplsymzzqf0dwe5gnqrexdq6]
password: yage[YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyRVUyTHpmQnZuTlc5MGJhODFuSE5WMmdzalNid0ExamliNDREbWlJUXdvClFhS3JGSGV2cjlnL0dWUnNwSDNvWGVHUDVDendkNzFWWXJCcTNDTVJNLzgKLT4geW0tZ3JlYXNlIF8zJ3MpXksKeXRwMW9aeitydwotLS0gWVNjbnZsUmNRWTdtM0pjVjNKQjBDZ1k2cVNhcWkwMnAxREwwMXptREhLZwrpCkrMFiq/XWfAyFRrLuLkkEPhnZ9Kt68pg5ENgDTV9+3iRcy6XKYdkqnEBRidMg==|r:age15eesfkh778yljxzgwdq5vaqmmchg5py480vplsymzzqf0dwe5gnqrexdq6]
由于键未加密,可以轻松地在版本控制系统中管理文件,如git,并在CI/CD管道或GitOps工作流中使用此文件。
如果你认为这很像是 SOPS,你就对了!这基本上就是SOPS所做的事情,但有一些关键的区别
yage
不在加密文件中包含任何元数据,特别是没有 MAC。yage
专注于age加密,并将所需的一切包含在一个单独的二进制文件中。
缺少MAC,虽然这可能被视为添加一些安全性的机会,但实际上允许一些有趣的用例
- 只有公钥的人也可以修改加密文件,同时仍然保留加密的值。
- 多人可以修改加密文件,并将其合并到版本控制系统中,而无需先解密。
- 加密文件仅包含原始键和加密的值,因此可以用于验证它是否可用于特定任务,而无需解密或删除元数据。
安装
从二进制文件安装
前往 版本页面,下载您平台的二进制文件,解压缩它,并将 yage
二进制文件放入您的 PATH
目录中。
例如,在linux上使用英特尔/AMD64处理器,您可以使用以下命令将 yage
安装到 ~/.local/bin
curl -ssL https://github.com/glehmann/yage/releases/download/0.5.0/yage-0.5.0-linux-amd64.tar.gz | tar xzf - -C ~/.local/bin --strip-components=1
Docker
yage
还可以作为 Docker 镜像使用。
以下是使用它就地加密文件的方法
docker run --rm -t -v $(pwd):/src ghcr.io/glehmann/yage:0.5.0 encrypt -iR prod.pub secrets.yaml
从源代码开始
只需在此存储库中运行
$ cargo install --path .
命令行参考
yage
包含其命令和选项的完整描述。只需运行 yage --help
即可获取。
$ yage --help
A simple tool to manage encrypted secrets in YAML files with age encryption
Usage: yage [OPTIONS] [COMMAND]
Commands:
check Check the encryption status of a YAML file
decrypt Decrypt the values in a YAML file
edit Edit an encrypted YAML file
encrypt Encrypt the values in a YAML file
env Execute a command with the environment from the encrypted YAML file
keygen Generate a new age key
pubkey Convert private age keys to their public key
recipients List the recipients of the encrypted data
re-encrypt Re-encrypt the values in a YAML file
help Print this message or the help of the given subcommand(s)
Options:
--completion <SHELL> Generate the completion code for this shell [possible values:
bash, elvish, fish, powershell, zsh]
-v, --verbose... Increase logging verbosity
-q, --quiet... Decrease logging verbosity
-h, --help Print help
-V, --version Print version
还可以查看 命令行参考的 Markdown 版本。
您还可以方便地安装您 shell 的自动完成功能。例如对于 fish
$ yage --completion fish > ~/.config/fish/completions/yage.fish
用法
首先生成一个新的 age 密钥对
$ yage keygen -o prod.key -p prod.pub
Public key: age15eesfkh778yljxzgwdq5vaqmmchg5py480vplsymzzqf0dwe5gnqrexdq6
公钥可以与任何人共享。它允许任何拥有该密钥的人加密一个只能由拥有私钥的人解密的秘密。私钥必须保密。
这两个密钥都是文本
$ cat prod.key
AGE-SECRET-KEY-1EZEU9RUTW3K5GV98ER6RHMS73QJNQ37ARWG6MWHXM4JP8FVD3A9QK2DD70
公钥可以被提交到 git 仓库
$ git add prod.pub
$ git commit -m "Add prod public key"
确保私钥不会意外地被提交到仓库中,例如通过将其添加到 .gitignore
文件中,并使用像 gitleaks 这样的工具。
$ echo "*.key" > .gitignore
私钥应保存在安全的地方,例如密码管理器中。它还可以作为 秘密 添加到 CI/CD 管道中。
一旦您拥有了私钥和公钥,就可以加密 YAML 文件。使用 --recipient-file
或 -R
选项指定一个包含用于加密的公钥的文件。接收者也可以通过 --recipient
或 -r
选项直接在命令行中指定。
$ yage encrypt --recipient-file prod.pub secrets.yaml --output secrets.enc.yaml
如果您愿意,可以使用 --in-place
或 -i
选项就地加密文件
$ yage encrypt -iR prod.pub secrets.yaml
您需要私钥才能访问解密后的值,因此如果您没有私钥,加密文件将显示加密的内容,例如 backend.password
,但不会显示值。
backend:
password: yage[YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRVW9wTXo0dG9lWTRyd1gxdm8yTGNOb1VuQWZSajBETzF4YThMbVVGM21FCjBTQXZxVDIvTWxGd1N6YXlUTHpoVlMzbTVURDZHcXBYaVc5NitYaE1LSW8KLT4gayMtZ3JlYXNlIFwganwhJUcyS1QgTT5sWTMzblYKCi0tLSBLUnREbytjalY3Rm45aEdVVnIzWG8yWC9RUVdlK1A4Mm9BSFdtamg5N2RNCm38HthiQvHqtUIu6+wKOyOH0WShltaeTGk2Qilym+9WFFb0n8g5Eb/6|r:age15eesfkh778yljxzgwdq5vaqmmchg5py480vplsymzzqf0dwe5gnqrexdq6]
但仅凭公钥,您仍然可以修改文件,例如添加新的秘密
mail:
apiKey: my_secret_key_to_send_emails
backend:
password: yage[YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRVW9wTXo0dG9lWTRyd1gxdm8yTGNOb1VuQWZSajBETzF4YThMbVVGM21FCjBTQXZxVDIvTWxGd1N6YXlUTHpoVlMzbTVURDZHcXBYaVc5NitYaE1LSW8KLT4gayMtZ3JlYXNlIFwganwhJUcyS1QgTT5sWTMzblYKCi0tLSBLUnREbytjalY3Rm45aEdVVnIzWG8yWC9RUVdlK1A4Mm9BSFdtamg5N2RNCm38HthiQvHqtUIu6+wKOyOH0WShltaeTGk2Qilym+9WFFb0n8g5Eb/6|r:age15eesfkh778yljxzgwdq5vaqmmchg5py480vplsymzzqf0dwe5gnqrexdq6]
您可以通过使用与之前相同的命令来加密新的秘密
$ yage encrypt -iR prod.pub secrets.yaml
或者您可以省略接收者,而 yage
将使用加密文件中的接收者
$ yage encrypt -i secrets.yaml
secrets.yaml
现在包含加密的值
mail:
apiKey: yage[YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPTmRHcGhPUnJQa2ZjbTVEUEtyT3g1bFd5REdnckF6Z0ZLQzlTekV5THdJCkoybXY3SEI2N3FTcXlHenByRHJOVGFtR2VRUWFBWGhEOGphbkd2ekV3bVkKLT4geUt2b0I2Ly1ncmVhc2UKODVocmxxODlZME1Sa1UvV2RnQkNPcjhvTWpZZFlKYzNkQmsKLS0tIHhsNEpvYzNwT1FMd1c2bmxLQmxOeGZxWnlXbDJUUmVsTklxZVIweUxSQXcK51Wf0RiFIAXYfsbmyMsyQRON5rhQxver8PUU8PDAMIm0XeBSKOzL3ngCmOKGeacahMOY5tWC6DgP20MrtQ==|r:age15eesfkh778yljxzgwdq5vaqmmchg5py480vplsymzzqf0dwe5gnqrexdq6]
backend:
password: yage[YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRVW9wTXo0dG9lWTRyd1gxdm8yTGNOb1VuQWZSajBETzF4YThMbVVGM21FCjBTQXZxVDIvTWxGd1N6YXlUTHpoVlMzbTVURDZHcXBYaVc5NitYaE1LSW8KLT4gayMtZ3JlYXNlIFwganwhJUcyS1QgTT5sWTMzblYKCi0tLSBLUnREbytjalY3Rm45aEdVVnIzWG8yWC9RUVdlK1A4Mm9BSFdtamg5N2RNCm38HthiQvHqtUIu6+wKOyOH0WShltaeTGk2Qilym+9WFFb0n8g5Eb/6|r:age15eesfkh778yljxzgwdq5vaqmmchg5py480vplsymzzqf0dwe5gnqrexdq6]
请注意,backend.password
没有被重新加密,因此您可以在版本控制系统中轻松跟踪更改。
要解密文件,您需要私钥
$ yage decrypt --key-file prod.key secrets.enc.yaml --output secrets.yaml
或者直接就地解密
$ yage decrypt -iK prod.key secrets.yaml
如果您在 CI/CD 管道中解密,您可能希望将私钥放入 YAGE_KEY
环境变量中。这样,您就可以使用 yage decrypt -i secrets.yaml
。
您还可以方便地将私钥通过标准输入传递,例如避免将私钥存储在磁盘上
$ vault-get-key | yage decrypt --key-file - secrets.yaml
如果您有私钥,您可以使用配置在 EDITOR
环境变量中的您喜欢的文本编辑器就地编辑文件
$ export EDITOR=micro
$ yage edit -K prod.key secrets.yaml
在编辑器中编辑文件后,保存和退出时会重新加密。这里再次只重新加密修改后的值。其他值保持不变,以便轻松跟踪更改。
最后,使用私钥,您可以使用加密文件中的机密来运行命令,并将环境变量设置为单个命令中解密后的值。
$ yage run -K prod.key secrets.yaml env terraform apply
预提交钩子
yage
可用于 预提交钩子,以确保在提交到仓库之前始终加密机密。以下是一个使用 yage
在提交之前检测 YAML 文件中的未加密机密的 .pre-commit-config.yaml
文件示例
repos:
- repo: https://github.com/glehmann/yage
rev: 0.5.0
hooks:
- id: yage-detect
files: "secrets-.+\\.yaml"
files
选项是一个正则表达式,它匹配 yage
应该检查的文件。
如果您的公钥在仓库中,您还可以在提交之前添加钩子来加密机密。
repos:
- repo: https://github.com/glehmann/yage
rev: 0.5.0
hooks:
- id: yage-encrypt
files: "secrets-prod-.+\\.yaml"
args: ["--in-place", "--recipient-file=prod.pub"]
yage-detect
和 yage-encrypt
钩子需要在钩子运行的环境中安装 yage
二进制文件。
yage-detect-rust
和 yage-encrypt-rust
钩子是其他可用的变体,可以从源代码构建 yage。
如果您已经在项目中使用 docker,最简单的替代方案是 yage-detect-docker
和 yage-encrypt-docker
钩子。它们只需要在钩子运行的环境中安装 docker。在首次运行钩子时,会自动下载 yage
镜像。
为什么?
主要是为了解锁添加到加密文件中的值的能力,而无需解密它,这是 SOPS 无法做到的。这是许多人感到沮丧的事情,请参阅 这里、这里、这里、这里 等。
而且因为用 rust 编写命令行工具很有趣!
还需要完成的工作
- 支持注释。遗憾的是,我所知的 YAML 库都没有支持注释,所以这将会有点棘手。
- 支持 age 插件。age 有一个插件系统,可以用来添加对其他加密方法的支持。
- 支持多文档 YAML 文件。这可以帮助在原地操作和标准输出操作之间使 CLI 更一致。
许可证
yage
在 MIT 许可证条款下分发。
有关详细信息,请参阅 LICENSE。
依赖项
~15–26MB
~358K SLoC