2009-05-28 00:59:14 +01:00
|
|
|
|
# Global configuration for the SSH client.
|
|
|
|
|
|
2014-04-14 15:26:48 +01:00
|
|
|
|
{ config, lib, pkgs, ... }:
|
2009-05-28 00:59:14 +01:00
|
|
|
|
|
2014-04-14 15:26:48 +01:00
|
|
|
|
with lib;
|
2012-03-25 16:42:05 +01:00
|
|
|
|
|
2015-02-25 13:29:24 +00:00
|
|
|
|
let
|
|
|
|
|
|
|
|
|
|
cfg = config.programs.ssh;
|
|
|
|
|
cfgd = config.services.openssh;
|
|
|
|
|
|
|
|
|
|
askPassword = "${pkgs.x11_ssh_askpass}/libexec/x11-ssh-askpass";
|
|
|
|
|
|
|
|
|
|
askPasswordWrapper = pkgs.writeScript "ssh-askpass-wrapper"
|
|
|
|
|
''
|
|
|
|
|
#! ${pkgs.stdenv.shell} -e
|
|
|
|
|
export DISPLAY="$(systemctl --user show-environment | ${pkgs.gnused}/bin/sed 's/^DISPLAY=\(.*\)/\1/; t; d')"
|
|
|
|
|
exec ${askPassword}
|
|
|
|
|
'';
|
2012-03-25 16:42:05 +01:00
|
|
|
|
|
|
|
|
|
in
|
2009-05-28 00:59:14 +01:00
|
|
|
|
{
|
2012-03-25 16:42:05 +01:00
|
|
|
|
###### interface
|
|
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
|
|
programs.ssh = {
|
|
|
|
|
|
|
|
|
|
forwardX11 = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.bool;
|
2012-10-10 07:21:45 +01:00
|
|
|
|
default = false;
|
2012-03-25 16:42:05 +01:00
|
|
|
|
description = ''
|
|
|
|
|
Whether to request X11 forwarding on outgoing connections by default.
|
|
|
|
|
This is useful for running graphical programs on the remote machine and have them display to your local X11 server.
|
|
|
|
|
Historically, this value has depended on the value used by the local sshd daemon, but there really isn't a relation between the two.
|
2012-11-18 19:05:18 +00:00
|
|
|
|
Note: there are some security risks to forwarding an X11 connection.
|
|
|
|
|
NixOS's X server is built with the SECURITY extension, which prevents some obvious attacks.
|
2012-10-10 07:21:45 +01:00
|
|
|
|
To enable or disable forwarding on a per-connection basis, see the -X and -x options to ssh.
|
2012-11-18 19:05:18 +00:00
|
|
|
|
The -Y option to ssh enables trusted forwarding, which bypasses the SECURITY extension.
|
2009-05-28 00:59:14 +01:00
|
|
|
|
'';
|
2012-03-25 16:42:05 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
setXAuthLocation = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.bool;
|
2014-04-03 20:19:18 +01:00
|
|
|
|
default = config.services.xserver.enable;
|
2012-03-25 16:42:05 +01:00
|
|
|
|
description = ''
|
2013-10-25 14:47:30 +01:00
|
|
|
|
Whether to set the path to <command>xauth</command> for X11-forwarded connections.
|
2013-10-30 16:37:45 +00:00
|
|
|
|
This causes a dependency on X11 packages.
|
2012-03-25 16:42:05 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
2013-08-25 20:54:21 +01:00
|
|
|
|
|
|
|
|
|
extraConfig = mkOption {
|
2013-10-30 16:37:45 +00:00
|
|
|
|
type = types.lines;
|
2013-08-25 20:54:21 +01:00
|
|
|
|
default = "";
|
|
|
|
|
description = ''
|
|
|
|
|
Extra configuration text appended to <filename>ssh_config</filename>.
|
2013-10-30 16:37:45 +00:00
|
|
|
|
See <citerefentry><refentrytitle>ssh_config</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
|
|
|
|
for help.
|
2013-08-25 20:54:21 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
2014-04-17 23:45:26 +01:00
|
|
|
|
|
|
|
|
|
startAgent = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to start the OpenSSH agent when you log in. The OpenSSH agent
|
|
|
|
|
remembers private keys for you so that you don't have to type in
|
|
|
|
|
passphrases every time you make an SSH connection. Use
|
|
|
|
|
<command>ssh-add</command> to add a key to the agent.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2014-11-13 20:46:02 +00:00
|
|
|
|
agentTimeout = mkOption {
|
2014-11-15 11:33:01 +00:00
|
|
|
|
type = types.nullOr types.string;
|
2014-12-18 14:30:14 +00:00
|
|
|
|
default = null;
|
|
|
|
|
example = "1h";
|
2014-11-13 20:46:02 +00:00
|
|
|
|
description = ''
|
2014-11-15 11:13:19 +00:00
|
|
|
|
How long to keep the private keys in memory. Use null to keep them forever.
|
2014-11-13 20:46:02 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2014-09-12 05:43:58 +01:00
|
|
|
|
package = mkOption {
|
|
|
|
|
default = pkgs.openssh;
|
|
|
|
|
description = ''
|
|
|
|
|
The package used for the openssh client and daemon.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2012-03-25 16:42:05 +01:00
|
|
|
|
};
|
2014-04-17 23:45:26 +01:00
|
|
|
|
|
2012-03-25 16:42:05 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
config = {
|
2013-10-25 14:47:30 +01:00
|
|
|
|
|
|
|
|
|
assertions = singleton
|
|
|
|
|
{ assertion = cfg.forwardX11 -> cfg.setXAuthLocation;
|
|
|
|
|
message = "cannot enable X11 forwarding without setting XAuth location";
|
|
|
|
|
};
|
|
|
|
|
|
2012-03-25 16:42:05 +01:00
|
|
|
|
environment.etc =
|
|
|
|
|
[ { # SSH configuration. Slight duplication of the sshd_config
|
|
|
|
|
# generation in the sshd service.
|
|
|
|
|
source = pkgs.writeText "ssh_config" ''
|
2012-10-29 16:10:17 +00:00
|
|
|
|
AddressFamily ${if config.networking.enableIPv6 then "any" else "inet"}
|
2012-03-25 16:42:05 +01:00
|
|
|
|
${optionalString cfg.setXAuthLocation ''
|
|
|
|
|
XAuthLocation ${pkgs.xorg.xauth}/bin/xauth
|
|
|
|
|
''}
|
2012-10-29 16:10:37 +00:00
|
|
|
|
ForwardX11 ${if cfg.forwardX11 then "yes" else "no"}
|
2013-08-25 20:54:21 +01:00
|
|
|
|
${cfg.extraConfig}
|
2012-03-25 16:42:05 +01:00
|
|
|
|
'';
|
|
|
|
|
target = "ssh/ssh_config";
|
|
|
|
|
}
|
|
|
|
|
];
|
2014-04-17 23:45:26 +01:00
|
|
|
|
|
|
|
|
|
# FIXME: this should really be socket-activated for über-awesomeness.
|
|
|
|
|
systemd.user.services.ssh-agent =
|
|
|
|
|
{ enable = cfg.startAgent;
|
|
|
|
|
description = "SSH Agent";
|
|
|
|
|
wantedBy = [ "default.target" ];
|
|
|
|
|
serviceConfig =
|
2014-04-18 16:37:47 +01:00
|
|
|
|
{ ExecStartPre = "${pkgs.coreutils}/bin/rm -f %t/ssh-agent";
|
2014-11-15 11:13:19 +00:00
|
|
|
|
ExecStart =
|
|
|
|
|
"${cfg.package}/bin/ssh-agent " +
|
|
|
|
|
optionalString (cfg.agentTimeout != null) ("-t ${cfg.agentTimeout} ") +
|
|
|
|
|
"-a %t/ssh-agent";
|
2014-04-18 16:37:47 +01:00
|
|
|
|
StandardOutput = "null";
|
2014-04-17 23:45:26 +01:00
|
|
|
|
Type = "forking";
|
|
|
|
|
Restart = "on-failure";
|
2014-04-18 16:37:47 +01:00
|
|
|
|
SuccessExitStatus = "0 2";
|
2014-04-17 23:45:26 +01:00
|
|
|
|
};
|
2015-02-25 13:29:24 +00:00
|
|
|
|
# Allow ssh-agent to ask for confirmation. This requires the
|
|
|
|
|
# unit to know about the user's $DISPLAY (via ‘systemctl
|
|
|
|
|
# import-environment’).
|
|
|
|
|
environment.SSH_ASKPASS = optionalString config.services.xserver.enable askPasswordWrapper;
|
|
|
|
|
environment.DISPLAY = "fake"; # required to make ssh-agent start $SSH_ASKPASS
|
2014-04-17 23:45:26 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
environment.extraInit = optionalString cfg.startAgent
|
|
|
|
|
''
|
|
|
|
|
if [ -z "$SSH_AUTH_SOCK" -a -n "$XDG_RUNTIME_DIR" ]; then
|
|
|
|
|
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent"
|
|
|
|
|
fi
|
|
|
|
|
'';
|
|
|
|
|
|
2015-02-25 13:29:24 +00:00
|
|
|
|
environment.interactiveShellInit = optionalString config.services.xserver.enable
|
|
|
|
|
''
|
|
|
|
|
export SSH_ASKPASS=${askPassword}
|
|
|
|
|
'';
|
|
|
|
|
|
2012-03-25 16:42:05 +01:00
|
|
|
|
};
|
2009-05-28 00:59:14 +01:00
|
|
|
|
}
|