NixOS 镜像中的 Secret 管理
给 NixOS 的 Installer Image 加入 Secret 管理支持。 背景 玩 NixOS 玩到一定程度,都将面对 Secret 管理这一经典问题,当然对于一般的 NixOS Setup 来说,这并不是非常复杂的问题,有非常多的工具可以解决,如 sops-nix、agenix、vaultix 等。 但是,我们的 NixOS 系统还包括 Installer,要是 Installer 中也需要使用一些 Secret 怎么办呢?最近我就想定制一个 Installer ISO 包括一个完整的透明代理服务,以方便安装过程中访问某些不存在的网站。透明代理的节点和订阅链接都是需要保密的。然而这些 Secret 管理方案都不能直接用在 ISO 上,这也是本文需要解决的问题。 方案设计 Secret 管理基本机制 首先我们回顾一下在普通的 NixOS 系统中如何管理 Secret。 Secret 的内容需要保密,不可以直接内联在 NixOS 配置中,也不可以在 NixOS 构建阶段直接引用,否则会被复制到 /nix/store 中。这些内容需要首先被加密后再用于构建和部署,在系统真正开始运行时再动态地解密。 每个 Secret 都是以非对称加密的方式被保护的。Secret 需要可以被维护者修改,也需要可以被需要的机器解密。前者的加密解密使用用户所有的密钥对,一般称为 Identity,后者的加解密则使用机器所有的密钥对,一般就称为 Key,大多数情况下会使用 SSH key /etc/ssh/ssh_host_{rsa,ed25519}_key{,.pub}。用户使用 Identity 的 Public Key 加密明文,后续可以使用 Identity Private Key 查看已加密的内容。同时,对于需要使用这个 Secret 的机器,需要使用该机器的 Public Key 重加密内容,以便该机器可以用自己的 Private Key 在运行时解密内容。重加密过程需要用 Identity Private Key 解密获取原始内容。 ...