Fediversity/secrets
2024-12-13 13:16:53 +01:00
..
flake-part.nix s/x_fediversity/fediversity/ 2024-12-13 12:37:25 +01:00
forgejo-database-password.age Handle Forgejo's secrets cleanly 2024-12-12 12:38:20 +01:00
forgejo-email-password.age Handle Forgejo's secrets cleanly 2024-12-12 12:38:20 +01:00
forgejo-runner-token.age Set up a first secret 2024-12-12 12:38:20 +01:00
README.md Update secrets' README 2024-12-13 13:16:53 +01:00
secrets.nix Expose keys and secrets in the global flake 2024-12-13 00:26:43 +01:00

Secrets

Secrets are handled using Agenix.

Cheat sheet

Adding a secret

As an example, let us add a secret in a file “cheeses” whose content should be “best ones come unpasteurised”.

  1. Edit secrets.nix, adding a field to the final record with the file name mapped to the systems that should be able to decrypt the secret, for instance:

    cheeses = [ vm02116 forgejo-ci ];
    
  2. Run Agenix to add the content of the file. Agenix is provided by the development Shell but can also be run directly with nix run github:ryantm/agenix --. Run agenix -e cheeses.age (with the .age extension); this will open your $EDITOR ; enter “best ones come unpasteurised”, save and close.

  3. If you are doing something flake-related such as NixOps4, remember to commit or at least stage the secret.

  4. In the machine's configuration, load our ageSecrets NixOS module, declare the machine's host key and start using your secrets, eg.:

    { self, config, ... }:
    {
      imports = [ self.nixosModules.ageSecrets ];
      fediversity.hostPublicKey = self.keys.systems.vmFromage;
      services.imaginaryCheeseFactory.frenchSecretFile = config.age.secrets.cheeses.path;
    }
    

    If the secrets requires specific owner/group/mode, those can be set with:

    age.secrets.cheeses.owner = "jeanpierre";
    age.secrets.cheeses.group = "france";
    age.secrets.cheeses.mode = "440";
    
  5. Never read the content of the file in Nix, that is never do anything like:

    services.imaginaryCheeseFactory.frenchSecret = readFile config.age.secrets.cheeses.path;
    

    This will put the secret as a world-readable file in the Nix store. The service that you are using must be able to read from a file at runtime, and if the NixOS default module options do not provide that, you must find a way around it.