#yaml #file-encryption #secret #encryption-key #env-var #encryption #public-key

bin+lib yage

一个简单的工具,用于使用age加密管理YAML文件中的加密秘密

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密码学

Download history 9/week @ 2024-03-08 5/week @ 2024-03-15 17/week @ 2024-03-29 226/week @ 2024-04-26

每月60次下载

MIT 许可证

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-detectyage-encrypt 钩子需要在钩子运行的环境中安装 yage 二进制文件。

yage-detect-rustyage-encrypt-rust 钩子是其他可用的变体,可以从源代码构建 yage。

如果您已经在项目中使用 docker,最简单的替代方案是 yage-detect-dockeryage-encrypt-docker 钩子。它们只需要在钩子运行的环境中安装 docker。在首次运行钩子时,会自动下载 yage 镜像。

为什么?

主要是为了解锁添加到加密文件中的值的能力,而无需解密它,这是 SOPS 无法做到的。这是许多人感到沮丧的事情,请参阅 这里这里这里这里 等。

而且因为用 rust 编写命令行工具很有趣!

还需要完成的工作

  • 支持注释。遗憾的是,我所知的 YAML 库都没有支持注释,所以这将会有点棘手。
  • 支持 age 插件。age 有一个插件系统,可以用来添加对其他加密方法的支持。
  • 支持多文档 YAML 文件。这可以帮助在原地操作和标准输出操作之间使 CLI 更一致。

许可证

yage 在 MIT 许可证条款下分发。

有关详细信息,请参阅 LICENSE

依赖项

~15–26MB
~358K SLoC