summaryrefslogtreecommitdiff
path: root/modules/programs
diff options
context:
space:
mode:
authorsbh69840 <sbh69840@gmail.com>2023-05-09 15:57:49 +0530
committersbh69840 <sbh69840@gmail.com>2023-05-10 19:28:00 +0530
commit64a15676ac5b7cb8990d683f19ad78ac9a6bc4ef (patch)
treeb71cdcb3137539d4c3deb2e17ca56773ee143c7a /modules/programs
parent379d42fad6bc5c28f79d5f7ff2fa5f1c90cb7bf8 (diff)
support authorized_keys for users
Diffstat (limited to 'modules/programs')
-rw-r--r--modules/programs/ssh/default.nix61
1 files changed, 54 insertions, 7 deletions
diff --git a/modules/programs/ssh/default.nix b/modules/programs/ssh/default.nix
index f93890f..2c0117c 100644
--- a/modules/programs/ssh/default.nix
+++ b/modules/programs/ssh/default.nix
@@ -47,10 +47,56 @@ let
hostNames = mkDefault [ name ];
};
};
+ userOptions = {
+
+ options.openssh.authorizedKeys = {
+ keys = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ description = ''
+ A list of verbatim OpenSSH public keys that should be added to the
+ user's authorized keys. The keys are added to a file that the SSH
+ daemon reads in addition to the the user's authorized_keys file.
+ You can combine the <literal>keys</literal> and
+ <literal>keyFiles</literal> options.
+ Warning: If you are using <literal>NixOps</literal> then don't use this
+ option since it will replace the key required for deployment via ssh.
+ '';
+ };
+
+ keyFiles = mkOption {
+ type = types.listOf types.path;
+ default = [];
+ description = ''
+ A list of files each containing one OpenSSH public key that should be
+ added to the user's authorized keys. The contents of the files are
+ read at build time and added to a file that the SSH daemon reads in
+ addition to the the user's authorized_keys file. You can combine the
+ <literal>keyFiles</literal> and <literal>keys</literal> options.
+ '';
+ };
+ };
+
+ };
+ authKeysFiles = let
+ mkAuthKeyFile = u: nameValuePair "ssh/authorized_keys.d/${u.name}" {
+ text = ''
+ ${concatStringsSep "\n" u.openssh.authorizedKeys.keys}
+ ${concatMapStrings (f: readFile f + "\n") u.openssh.authorizedKeys.keyFiles}
+ '';
+ };
+ usersWithKeys = attrValues (flip filterAttrs config.users.users (n: u:
+ length u.openssh.authorizedKeys.keys != 0 || length u.openssh.authorizedKeys.keyFiles != 0
+ ));
+ in listToAttrs (map mkAuthKeyFile usersWithKeys);
in
{
options = {
+
+ users.users = mkOption {
+ type = with types; attrsOf (submodule userOptions);
+ };
programs.ssh.knownHosts = mkOption {
default = {};
@@ -80,12 +126,13 @@ in
(data.publicKey != null && data.publicKeyFile == null);
message = "knownHost ${name} must contain either a publicKey or publicKeyFile";
});
-
- environment.etc."ssh/ssh_known_hosts".text = (flip (concatMapStringsSep "\n") knownHosts
- (h: assert h.hostNames != [];
- concatStringsSep "," h.hostNames + " "
- + (if h.publicKey != null then h.publicKey else readFile h.publicKeyFile)
- )) + "\n";
-
+
+ environment.etc = authKeysFiles //
+ { "ssh/ssh_known_hosts".text = (flip (concatMapStringsSep "\n") knownHosts
+ (h: assert h.hostNames != [];
+ concatStringsSep "," h.hostNames + " "
+ + (if h.publicKey != null then h.publicKey else readFile h.publicKeyFile)
+ )) + "\n";
+ };
};
}