1

我正在使用 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 加密文件中读取这些值?还是有其他方法?还是我需要加密整个文件?

4

1 回答 1

2

理想情况下,您会使用 NixOps 密钥,因为它们的目的是向您的应用程序提供敏感数据,同时将此类内容存储在 Nix 商店之外。

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

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

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

{
  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;
      }
    };
  };
}
于 2018-07-09T01:50:12.237 回答