python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / networking / ssh / lshd.nix
blob41c4ec2d2951e29aca84db20251ee6d6930ff2b8
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
7   inherit (pkgs) lsh;
9   cfg = config.services.lshd;
15   ###### interface
17   options = {
19     services.lshd = {
21       enable = mkOption {
22         type = types.bool;
23         default = false;
24         description = lib.mdDoc ''
25           Whether to enable the GNU lshd SSH2 daemon, which allows
26           secure remote login.
27         '';
28       };
30       portNumber = mkOption {
31         default = 22;
32         type = types.port;
33         description = lib.mdDoc ''
34           The port on which to listen for connections.
35         '';
36       };
38       interfaces = mkOption {
39         default = [];
40         type = types.listOf types.str;
41         description = lib.mdDoc ''
42           List of network interfaces where listening for connections.
43           When providing the empty list, `[]', lshd listens on all
44           network interfaces.
45         '';
46         example = [ "localhost" "1.2.3.4:443" ];
47       };
49       hostKey = mkOption {
50         default = "/etc/lsh/host-key";
51         type = types.str;
52         description = lib.mdDoc ''
53           Path to the server's private key.  Note that this key must
54           have been created, e.g., using "lsh-keygen --server |
55           lsh-writekey --server", so that you can run lshd.
56         '';
57       };
59       syslog = mkOption {
60         type = types.bool;
61         default = true;
62         description = lib.mdDoc "Whether to enable syslog output.";
63       };
65       passwordAuthentication = mkOption {
66         type = types.bool;
67         default = true;
68         description = lib.mdDoc "Whether to enable password authentication.";
69       };
71       publicKeyAuthentication = mkOption {
72         type = types.bool;
73         default = true;
74         description = lib.mdDoc "Whether to enable public key authentication.";
75       };
77       rootLogin = mkOption {
78         type = types.bool;
79         default = false;
80         description = lib.mdDoc "Whether to enable remote root login.";
81       };
83       loginShell = mkOption {
84         default = null;
85         type = types.nullOr types.str;
86         description = lib.mdDoc ''
87           If non-null, override the default login shell with the
88           specified value.
89         '';
90         example = "/nix/store/xyz-bash-10.0/bin/bash10";
91       };
93       srpKeyExchange = mkOption {
94         default = false;
95         type = types.bool;
96         description = lib.mdDoc ''
97           Whether to enable SRP key exchange and user authentication.
98         '';
99       };
101       tcpForwarding = mkOption {
102         type = types.bool;
103         default = true;
104         description = lib.mdDoc "Whether to enable TCP/IP forwarding.";
105       };
107       x11Forwarding = mkOption {
108         type = types.bool;
109         default = true;
110         description = lib.mdDoc "Whether to enable X11 forwarding.";
111       };
113       subsystems = mkOption {
114         type = types.listOf types.path;
115         description = lib.mdDoc ''
116           List of subsystem-path pairs, where the head of the pair
117           denotes the subsystem name, and the tail denotes the path to
118           an executable implementing it.
119         '';
120       };
122     };
124   };
127   ###### implementation
129   config = mkIf cfg.enable {
131     services.lshd.subsystems = [ ["sftp" "${pkgs.lsh}/sbin/sftp-server"] ];
133     systemd.services.lshd = {
134       description = "GNU lshd SSH2 daemon";
136       after = [ "network.target" ];
138       wantedBy = [ "multi-user.target" ];
140       environment = {
141         LD_LIBRARY_PATH = config.system.nssModules.path;
142       };
144       preStart = ''
145         test -d /etc/lsh || mkdir -m 0755 -p /etc/lsh
146         test -d /var/spool/lsh || mkdir -m 0755 -p /var/spool/lsh
148         if ! test -f /var/spool/lsh/yarrow-seed-file
149         then
150             # XXX: It would be nice to provide feedback to the
151             # user when this fails, so that they can retry it
152             # manually.
153             ${lsh}/bin/lsh-make-seed --sloppy \
154                -o /var/spool/lsh/yarrow-seed-file
155         fi
157         if ! test -f "${cfg.hostKey}"
158         then
159             ${lsh}/bin/lsh-keygen --server | \
160             ${lsh}/bin/lsh-writekey --server -o "${cfg.hostKey}"
161         fi
162       '';
164       script = with cfg; ''
165         ${lsh}/sbin/lshd --daemonic \
166           --password-helper="${lsh}/sbin/lsh-pam-checkpw" \
167           -p ${toString portNumber} \
168           ${if interfaces == [] then ""
169             else (concatStrings (map (i: "--interface=\"${i}\"")
170                                      interfaces))} \
171           -h "${hostKey}" \
172           ${if !syslog then "--no-syslog" else ""} \
173           ${if passwordAuthentication then "--password" else "--no-password" } \
174           ${if publicKeyAuthentication then "--publickey" else "--no-publickey" } \
175           ${if rootLogin then "--root-login" else "--no-root-login" } \
176           ${if loginShell != null then "--login-shell=\"${loginShell}\"" else "" } \
177           ${if srpKeyExchange then "--srp-keyexchange" else "--no-srp-keyexchange" } \
178           ${if !tcpForwarding then "--no-tcpip-forward" else "--tcpip-forward"} \
179           ${if x11Forwarding then "--x11-forward" else "--no-x11-forward" } \
180           --subsystems=${concatStringsSep ","
181                                           (map (pair: (head pair) + "=" +
182                                                       (head (tail pair)))
183                                                subsystems)}
184       '';
185     };
187     security.pam.services.lshd = {};
188   };