sops-nix 加密敏感信息
将 NixOS 配置托管在公开的 GitHub 仓库中,是实践声明式管理和分享的最佳方式,但这引出了一个关键问题:如何处理 SSH 密钥和密码等敏感信息?
所以我们需要一个既安全又能融入 NixOS 哲学的方案 — 采用 sops-nix 来加密私密信息,并将其无缝集成到我公开配置中。
寻找那把合适的“锁”
我的目标是:找到一个工具,能将我的私密文件加密后安全地存入 Git,并且在 nixos-rebuild switch 时,系统能自动用机器上的密钥解密它们。
社区里主流的方案有两个:agenix 和 sops-nix。agenix 更轻量,只专注于 age 加密;而 sops-nix 则更像一个瑞士军刀,支持 age、GPG 等多种后端,社区也更庞大。本着一步到位的原则,我选择了 sops-nix。
配置 .sops.yaml
万里长征第一步,是配置 sops 的规则文件——.sops.yaml。这个文件告诉 sops:“当你加密一个文件时,应该用哪些人的‘公钥锁’把它锁上?”
我很快写出了第一版配置,并满怀信心地创建了一个 ssh.secrets.yaml 文件,准备加密。
sops --encrypt --in-place ssh.secrets.yaml
回车!然后……
1 | |
这是我遇到的第一个拦路虎。经过一番排查,我意识到 sops 命令对执行路径非常敏感,它需要在我项目的根目录下执行,那里才有 .sops.yaml。吸取教训后,我决定采用一种更优雅、可维护性更高的方式来组织我的公钥,使用了 YAML 的“锚点”特性:
1 | |
这种写法不仅清晰,而且以后如果我有多个服务器或者协作者,只需要在 keys 部分添加,然后在规则里引用别名即可,非常方便。
将 sops 融入我的 Flake
加密工作流跑通了,接下来就是把它集成到我的 NixOS 配置中。
首先,修改 flake.nix,加入 sops-nix 作为输入源,并把它传递给 outputs 函数。
1 | |
接着,我开始在我的 home-manager 配置里使用它。我的目标是将加密的 SSH 私钥部署到 ~/.ssh/ 目录下。
1 | |
最终章:梦想照进现实
经过一番折腾,我的配置终于成型了。
- 一个可靠的
.sops.yaml文件定义了加密规则。 - 一个加密的
ssh.secrets.yaml文件安全地躺在我的 Git 仓库里。 flake.nix正确地引入了sops-nix模块。home-manager配置在正确的层级结构下,声明了我的 SSH 密钥,并让programs.ssh直接引用解密后的文件路径。
我深吸一口气,最后一次运行 sudo nixos-rebuild switch --flake .#miLaptop。
构建过程顺利通过,系统切换成功!我立刻检查 ~/.ssh/ 目录:
1 | |