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