将机密传递给NixOps逻辑网络规范

时间:2018-07-07 20:36:47

标签: nix nixops

我正在使用NixOps将Web应用程序部署到AWS。该应用程序需要设置一些环境变量。我可以通过类似于以下内容来实现此目的:

{
  network.description = "Web server";

  webserver = { config, pkgs, ... }: {
    environment.systemPackages = [ webserver ];
    networking.firewall.allowedTCPPorts = [ 80 ];

    systemd.services.webserver = {
      description = "Example webapp";

      environment = {
        SECRET_KEY = "SECRET_VALUE";
      }
    };
  };
}

我希望将此文件检入我的源代码管理系统,但如果可以帮助,我不希望将SECRET_VALUE以明文形式存储。

是否有方法在需要部署时从GPG加密文件中读取这些值?还是有其他方法?还是我需要加密整个文件?

1 个答案:

答案 0 :(得分:1)

理想情况下,您将使用NixOps键,因为它们的目的是在将此类内容存储在Nix存储区之外时向您的应用提供敏感数据。

  

/ nix / store /中的文件可由该主机上的每个用户读取,因此   存储嵌入在nix派生中的秘密密钥是不安全的。至   为了解决这个问题,nixops提供了配置选项   nixops与main分开管理的deployment.keys   每台机器的配置推导。 --   https://nixos.org/nixops/manual/#idm140737318276736

更具体地说,在您的情况下,Nix将为您的Web服务器服务创建一个systemd单位文件,该文件存储在/nix/store中,其中将包含您的SECRET_KEY。

但是如果必须使用环境变量,则可以使用builtins.readFile从外部文件读取环境变量的值。在构建/部署时,该文件将需要存在,因此,可以通过不将其存储在Git存储库中或按照Robert的建议使用透明加密(例如git-crypt)来保护数据。

{
  network.description = "Web server";

  webserver = { config, pkgs, ... }: {
    environment.systemPackages = [ webserver ];
    networking.firewall.allowedTCPPorts = [ 80 ];

    systemd.services.webserver = {
      description = "Example webapp";

      environment = {
        SECRET_KEY = builtins.readFile ./secret.data;
      }
    };
  };
}