From 08dfc80c98684e672313d65f8554f0a0a1319f75 Mon Sep 17 00:00:00 2001 From: colin Date: Fri, 30 Dec 2022 04:30:41 +0000 Subject: [PATCH] impermanence: split out sops setup --- modules/default.nix | 1 + modules/impermanence/default.nix | 23 ----------------------- modules/sops.nix | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 23 deletions(-) create mode 100644 modules/sops.nix diff --git a/modules/default.nix b/modules/default.nix index 9272ae0b..66084727 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -10,5 +10,6 @@ ./impermanence ./nixcache.nix ./services + ./sops.nix ]; } diff --git a/modules/impermanence/default.nix b/modules/impermanence/default.nix index e1b073b6..aefa78e5 100644 --- a/modules/impermanence/default.nix +++ b/modules/impermanence/default.nix @@ -7,8 +7,6 @@ with lib; let cfg = config.sane.impermanence; - # taken from sops-nix code: checks if any secrets are needed to create /etc/shadow - secrets-for-users = (lib.filterAttrs (_: v: v.neededForUsers) config.sops.secrets) != {}; getStore = { encryptedClearOnBoot, ... }: ( if encryptedClearOnBoot then { device = "/mnt/impermanence/crypt/clearedonboot"; @@ -300,27 +298,6 @@ in } ) - (lib.mkIf secrets-for-users { - # secret decoding depends on /etc/ssh keys, so make sure those are present. - system.activationScripts.setupSecretsForUsers = lib.mkIf secrets-for-users { - deps = [ "etc" ]; - }; - system.activationScripts.etc.deps = lib.mkForce []; - assertions = builtins.concatLists (builtins.attrValues ( - builtins.mapAttrs - (path: value: [ - { - assertion = (builtins.substring 0 1 value.user) == "+"; - message = "non-numeric user for /etc/${path}: ${value.user} prevents early /etc linking"; - } - { - assertion = (builtins.substring 0 1 value.group) == "+"; - message = "non-numeric group for /etc/${path}: ${value.group} prevents early /etc linking"; - } - ]) - config.environment.etc - )); - }) ]); } diff --git a/modules/sops.nix b/modules/sops.nix new file mode 100644 index 00000000..5db00e5c --- /dev/null +++ b/modules/sops.nix @@ -0,0 +1,32 @@ +{ config, lib, ... }: + +let + # taken from sops-nix code: checks if any secrets are needed to create /etc/shadow + secrets-for-users = (lib.filterAttrs (_: v: v.neededForUsers) config.sops.secrets) != {}; + sops-files = config.sops.age.sshKeyPaths ++ config.sops.gnupg.sshKeyPaths ++ [ config.sops.age.keyFile ]; + keys-in-etc = builtins.any (p: builtins.substring 0 5 p == "/etc/") sops-files; +in +{ + config = lib.mkIf (secrets-for-users && keys-in-etc) { + # secret decoding depends on keys in /etc/ (like the ssh host key), so make sure those are present. + system.activationScripts.setupSecretsForUsers = lib.mkIf secrets-for-users { + deps = [ "etc" ]; + }; + # TODO: we should selectively remove "users" and "groups", but keep manually specified deps? + system.activationScripts.etc.deps = lib.mkForce []; + assertions = builtins.concatLists (builtins.attrValues ( + builtins.mapAttrs + (path: value: [ + { + assertion = (builtins.substring 0 1 value.user) == "+"; + message = "non-numeric user for /etc/${path}: ${value.user} prevents early /etc linking"; + } + { + assertion = (builtins.substring 0 1 value.group) == "+"; + message = "non-numeric group for /etc/${path}: ${value.group} prevents early /etc linking"; + } + ]) + config.environment.etc + )); + }; +}