# SOPS configuration: # docs: https://github.com/Mic92/sops-nix # # for each new user you want to edit sops files: # create a private age key from ssh key: # $ mkdir -p ~/.config/sops/age; ssh-to-age -private-key -i ~/.ssh/id_ed25519 > ~/.config/sops/age/keys.txt; chmod 600 ~/.config/sops/age/keys.txt # if the private key was password protected, then first decrypt it: # $ cp ~/.ssh/id_ed25519 /tmp/id_ed25519 # $ ssh-keygen -p -N "" -f /tmp/id_ed25519 # # for each user you want to decrypt secrets: # $ cat ~/.ssh/id_ed25519.pub | ssh-to-age # add the result to .sops.yaml # since we specify ssh pubkeys in the nix config, you can just grep for `ssh-ed25519` here and use those instead # # for each host you want to decrypt secrets: # $ cat /etc/ssh/ssh_host_ed25519_key.pub | ssh-to-age # add the result to .sops.yaml # $ sops updatekeys secrets/example.yaml # # to create a new secret: # $ sops secrets/example.yaml # control access below (sops.secret..owner = ...) # # to read a secret: # $ cat /run/secrets/example_key { config, lib, sane-lib, ... }: let secretsForHost = host: let extraAttrsForPath = path: lib.optionalAttrs (sane-lib.path.isChild "guest" path && builtins.hasAttr "guest" config.users.users) { owner = "guest"; }; secretsInSrc = ( if builtins.pathExists ../../secrets/${host} then sane-lib.enumerateFilePaths ../../secrets/${host} else [] ); in sane-lib.joinAttrsets ( map (path: lib.optionalAttrs (lib.hasSuffix ".bin" path) (sane-lib.nameValueToAttrs { name = lib.removeSuffix ".bin" path; value = { sopsFile = ../../secrets/${host}/${path}; format = "binary"; } // (extraAttrsForPath path); })) secretsInSrc ); in { # sops.age.sshKeyPaths = [ "/home/colin/.ssh/id_ed25519_dec" ]; sops.gnupg.sshKeyPaths = []; # disable RSA key import # This is using an age key that is expected to already be in the filesystem # sops.age.keyFile = "/home/colin/.ssh/age.pub"; # sops.age.keyFile = "/var/lib/sops-nix/key.txt"; # This will generate a new key if the key specified above does not exist # sops.age.generateKey = true; # This is the actual specification of the secrets. # sops.secrets.example_key = { # owner = config.users.users.colin.name; # }; # sops.secrets."myservice/my_subdir/my_secret" = {}; sops.secrets = lib.mkMerge [ (secretsForHost "common") (secretsForHost config.networking.hostName) { "jackett_apikey".owner = config.users.users.colin.name; "mx-sanebot-env".owner = config.users.users.colin.name; "transmission_passwd".owner = config.users.users.colin.name; } ]; }