Передача секретов спецификации логической сети 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;
      }
    };
  };
}
Другие вопросы по тегам