Передача секретов спецификации логической сети NixOps
Я развертываю веб-приложение на AWS с NixOps. Приложение требует установки некоторых переменных среды. Я могу добиться этого с помощью чего-то похожего на следующее:
{
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 ответ
В идеале вы должны использовать ключи NixOps, поскольку их целью является предоставление конфиденциальных данных вашему приложению при хранении такого содержимого вне хранилища Nix.
Файлы в /nix/store/ доступны для чтения каждому пользователю на этом хосте, поэтому хранение секретных ключей, встроенных в деривации nix, небезопасно. Чтобы решить эту проблему, nixops предоставляет опцию конфигурации deploy.keys, которой nixops управляет отдельно от основной конфигурации конфигурации для каждой машины. - https://nixos.org/nixops/manual/
Более конкретно, в вашем случае Nix создаст системный файл systemd для службы веб-сервера и тот файл, который хранится в /nix/store
, будет иметь ваш SECRET_KEY в нем.
Но если использование переменных среды является обязательным, вы можете использовать builtins.readFile
прочитать значение переменной окружения из внешнего файла. Файл должен присутствовать при сборке / развертывании, поэтому вы должны защитить данные, НЕ храня их в репозитории Git, или используя прозрачное шифрование (например, 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;
}
};
};
}