silx: 2.1.1 -> 2.1.2 (#361612)
[NixPkgs.git] / nixos / modules / services / misc / sssd.nix
blob6d6f855c57f1c021525f49bd1145f0b1426e5cb4
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.sssd;
4   nscd = config.services.nscd;
6   dataDir = "/var/lib/sssd";
7   settingsFile = "${dataDir}/sssd.conf";
8   settingsFileUnsubstituted = pkgs.writeText "${dataDir}/sssd-unsubstituted.conf" cfg.config;
9 in {
10   options = {
11     services.sssd = {
12       enable = lib.mkEnableOption "the System Security Services Daemon";
14       config = lib.mkOption {
15         type = lib.types.lines;
16         description = "Contents of {file}`sssd.conf`.";
17         default = ''
18           [sssd]
19           config_file_version = 2
20           services = nss, pam
21           domains = shadowutils
23           [nss]
25           [pam]
27           [domain/shadowutils]
28           id_provider = proxy
29           proxy_lib_name = files
30           auth_provider = proxy
31           proxy_pam_target = sssd-shadowutils
32           proxy_fast_alias = True
33         '';
34       };
36       sshAuthorizedKeysIntegration = lib.mkOption {
37         type = lib.types.bool;
38         default = false;
39         description = ''
40           Whether to make sshd look up authorized keys from SSS.
41           For this to work, the `ssh` SSS service must be enabled in the sssd configuration.
42         '';
43       };
45       kcm = lib.mkOption {
46         type = lib.types.bool;
47         default = false;
48         description = ''
49           Whether to use SSS as a Kerberos Cache Manager (KCM).
50           Kerberos will be configured to cache credentials in SSS.
51         '';
52       };
53       environmentFile = lib.mkOption {
54         type = lib.types.nullOr lib.types.path;
55         default = null;
56         description = ''
57           Environment file as defined in {manpage}`systemd.exec(5)`.
59           Secrets may be passed to the service without adding them to the world-readable
60           Nix store, by specifying placeholder variables as the option value in Nix and
61           setting these variables accordingly in the environment file.
63           ```
64             # snippet of sssd-related config
65             [domain/LDAP]
66             ldap_default_authtok = $SSSD_LDAP_DEFAULT_AUTHTOK
67           ```
69           ```
70             # contents of the environment file
71             SSSD_LDAP_DEFAULT_AUTHTOK=verysecretpassword
72           ```
73         '';
74       };
75     };
76   };
77   config = lib.mkMerge [
78     (lib.mkIf cfg.enable {
79       # For `sssctl` to work.
80       environment.etc."sssd/sssd.conf".source = settingsFile;
81       environment.etc."sssd/conf.d".source = "${dataDir}/conf.d";
83       systemd.services.sssd = {
84         description = "System Security Services Daemon";
85         wantedBy    = [ "multi-user.target" ];
86         before = [ "systemd-user-sessions.service" "nss-user-lookup.target" ];
87         after = [ "network-online.target" "nscd.service" ];
88         requires = [ "network-online.target" "nscd.service" ];
89         wants = [ "nss-user-lookup.target" ];
90         restartTriggers = [
91           config.environment.etc."nscd.conf".source
92           settingsFileUnsubstituted
93         ];
94         script = ''
95           export LDB_MODULES_PATH+="''${LDB_MODULES_PATH+:}${pkgs.ldb}/modules/ldb:${pkgs.sssd}/modules/ldb"
96           mkdir -p /var/lib/sss/{pubconf,db,mc,pipes,gpo_cache,secrets} /var/lib/sss/pipes/private /var/lib/sss/pubconf/krb5.include.d
97           ${pkgs.sssd}/bin/sssd -D -c ${settingsFile}
98         '';
99         serviceConfig = {
100           Type = "forking";
101           PIDFile = "/run/sssd.pid";
102           StateDirectory = baseNameOf dataDir;
103           # We cannot use LoadCredential here because it's not available in ExecStartPre
104           EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
105         };
106         preStart = ''
107           mkdir -p "${dataDir}/conf.d"
108           [ -f ${settingsFile} ] && rm -f ${settingsFile}
109           old_umask=$(umask)
110           umask 0177
111           ${pkgs.envsubst}/bin/envsubst \
112             -o ${settingsFile} \
113             -i ${settingsFileUnsubstituted}
114           umask $old_umask
115         '';
116       };
118       system.nssModules = [ pkgs.sssd ];
119       system.nssDatabases = {
120         group = [ "sss" ];
121         passwd = [ "sss" ];
122         services = [ "sss" ];
123         shadow = [ "sss" ];
124       };
125       services.dbus.packages = [ pkgs.sssd ];
126     })
128     (lib.mkIf cfg.kcm {
129       systemd.services.sssd-kcm = {
130         description = "SSSD Kerberos Cache Manager";
131         requires = [ "sssd-kcm.socket" ];
132         serviceConfig = {
133           ExecStartPre = "-${pkgs.sssd}/bin/sssd --genconf-section=kcm";
134           ExecStart = "${pkgs.sssd}/libexec/sssd/sssd_kcm --uid 0 --gid 0";
135         };
136         restartTriggers = [
137           settingsFileUnsubstituted
138         ];
139       };
140       systemd.sockets.sssd-kcm = {
141         description = "SSSD Kerberos Cache Manager responder socket";
142         wantedBy = [ "sockets.target" ];
143         # Matches the default in MIT krb5 and Heimdal:
144         # https://github.com/krb5/krb5/blob/krb5-1.19.3-final/src/include/kcm.h#L43
145         listenStreams = [ "/var/run/.heim_org.h5l.kcm-socket" ];
146       };
147       security.krb5.settings.libdefaults.default_ccache_name = "KCM:";
148     })
150     (lib.mkIf cfg.sshAuthorizedKeysIntegration {
151     # Ugly: sshd refuses to start if a store path is given because /nix/store is group-writable.
152     # So indirect by a symlink.
153     environment.etc."ssh/authorized_keys_command" = {
154       mode = "0755";
155       text = ''
156         #!/bin/sh
157         exec ${pkgs.sssd}/bin/sss_ssh_authorizedkeys "$@"
158       '';
159     };
160     services.openssh.authorizedKeysCommand = "/etc/ssh/authorized_keys_command";
161     services.openssh.authorizedKeysCommandUser = "nobody";
162   })];
164   meta.maintainers = with lib.maintainers; [ bbigras ];