2014-04-14 16:26:48 +02:00
|
|
|
{ config, lib, pkgs, ... }:
|
2007-01-12 00:55:25 +01:00
|
|
|
|
2014-04-14 16:26:48 +02:00
|
|
|
with lib;
|
2009-12-16 21:51:25 +01:00
|
|
|
|
2009-03-06 13:27:40 +01:00
|
|
|
let
|
2009-07-15 13:34:55 +02:00
|
|
|
|
2009-03-06 13:27:40 +01:00
|
|
|
nssModulesPath = config.system.nssModules.path;
|
2014-01-31 14:07:44 +01:00
|
|
|
cfg = config.services.nscd;
|
2009-07-15 13:34:55 +02:00
|
|
|
|
2009-03-06 13:27:40 +01:00
|
|
|
in
|
2007-01-12 00:55:25 +01:00
|
|
|
|
2009-03-06 13:27:40 +01:00
|
|
|
{
|
2009-12-16 21:51:25 +01:00
|
|
|
|
|
|
|
###### interface
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
services.nscd = {
|
|
|
|
|
|
|
|
enable = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
type = types.bool;
|
2009-12-16 21:51:25 +01:00
|
|
|
default = true;
|
2012-06-16 06:19:43 +02:00
|
|
|
description = "Whether to enable the Name Service Cache Daemon.";
|
2009-12-16 21:51:25 +01:00
|
|
|
};
|
|
|
|
|
2014-01-31 14:07:44 +01:00
|
|
|
config = mkOption {
|
|
|
|
type = types.lines;
|
|
|
|
default = builtins.readFile ./nscd.conf;
|
|
|
|
description = "Configuration to use for Name Service Cache Daemon.";
|
|
|
|
};
|
|
|
|
|
2009-12-16 21:51:25 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2012-08-06 18:26:52 +02:00
|
|
|
|
2009-12-16 21:51:25 +01:00
|
|
|
###### implementation
|
|
|
|
|
2014-01-31 14:07:44 +01:00
|
|
|
config = mkIf cfg.enable {
|
2016-04-14 20:18:09 +02:00
|
|
|
environment.etc."nscd.conf".text = cfg.config;
|
2011-09-14 20:20:50 +02:00
|
|
|
|
2013-01-16 12:33:18 +01:00
|
|
|
systemd.services.nscd =
|
2009-10-12 19:27:57 +02:00
|
|
|
{ description = "Name Service Cache Daemon";
|
2009-07-15 13:34:55 +02:00
|
|
|
|
2012-12-27 10:04:05 +01:00
|
|
|
wantedBy = [ "nss-lookup.target" "nss-user-lookup.target" ];
|
2009-07-15 13:34:55 +02:00
|
|
|
|
2009-07-15 17:24:11 +02:00
|
|
|
environment = { LD_LIBRARY_PATH = nssModulesPath; };
|
2011-09-14 20:20:50 +02:00
|
|
|
|
2016-04-14 20:18:09 +02:00
|
|
|
restartTriggers = [
|
|
|
|
config.environment.etc.hosts.source
|
|
|
|
config.environment.etc."nsswitch.conf".source
|
|
|
|
config.environment.etc."nscd.conf".source
|
|
|
|
];
|
2013-06-11 16:15:24 +02:00
|
|
|
|
2019-07-12 21:07:45 +02:00
|
|
|
# We use DynamicUser because in default configurations nscd doesn't
|
|
|
|
# create any files that need to survive restarts. However, in some
|
|
|
|
# configurations, nscd needs to be started as root; it will drop
|
|
|
|
# privileges after all the NSS modules have read their configuration
|
|
|
|
# files. So prefix the ExecStart command with "!" to prevent systemd
|
|
|
|
# from dropping privileges early. See ExecStart in systemd.service(5).
|
2012-08-14 22:45:50 +02:00
|
|
|
serviceConfig =
|
nixos/nscd: only drop privs after nss module init
NixOS usually needs nscd just to have a single place where
LD_LIBRARY_PATH can be set to include all NSS modules, but nscd is also
useful if some of the NSS modules need to read files which are only
accessible by root.
For example, nixos/modules/config/ldap.nix needs this when
users.ldap.enable = true;
users.ldap.daemon.enable = false;
and users.ldap.bind.passwordFile exists. In that case, the module
creates an /etc/ldap.conf which is only readable by root, but which the
NSS module needs to read in order to find out what LDAP server to
connect to and with what credentials.
If nscd is started as root and configured with the server-user option in
nscd.conf, then it gives each NSS module the opportunity to initialize
itself before dropping privileges. The initialization happens in the
glibc-internal __nss_disable_nscd function, which pre-loads all the
configured NSS modules for passwd, group, hosts, and services (but not
netgroup for some reason?) and, for each loaded module, calls an init
function if one is defined. After that finishes, nscd's main() calls
nscd_init() which ends by calling finish_drop_privileges().
There are provisions in systemd for using DynamicUser with a service
which needs to drop privileges itself, so this patch does that.
2019-07-07 17:43:41 +02:00
|
|
|
{ ExecStart = "!@${pkgs.glibc.bin}/sbin/nscd nscd";
|
2012-10-01 22:27:42 +02:00
|
|
|
Type = "forking";
|
2019-07-03 22:11:05 +02:00
|
|
|
DynamicUser = true;
|
nixos/nscd: let systemd manage directories
Previously this module created both /var/db/nscd and /run/nscd using
shell commands in a preStart script. Note that both of these paths are
hard-coded in the nscd source. (Well, the latter is actually
/var/run/nscd but /var/run is a symlink to /run so it works out the
same.)
/var/db/nscd is only used if the nscd.conf "persistent" option is turned
on for one or more databases, which it is not in our default config
file. I'm not even sure persistent mode can work under systemd, since
`nscd --shutdown` is not synchronous so systemd will always
unceremoniously kill nscd without reliably giving it time to mark the
databases as unused. Nonetheless, if someone wants to use that option,
they can ensure the directory exists using systemd.tmpfiles.rules.
systemd can create /run/nscd for us with the RuntimeDirectory directive,
with the added benefit of causing systemd to delete the directory on
service stop or restart. The default value of RuntimeDirectoryMode is
755, the same as the mode which this module was using before.
I don't think the `rm -f /run/nscd/nscd.pid` was necessary after NixOS
switched to systemd and used its PIDFile directive, because systemd
deletes the specified file after the service stops, and because the file
can't persist across reboots since /run is a tmpfs. Even if the file
still exists when nscd starts, it's only a problem if the pid it
contains has been reused by another process, which is unlikely. Anyway,
this change makes that deletion even less necessary, because now systemd
deletes the entire /run/nscd directory when the service stops.
2019-07-03 21:39:48 +02:00
|
|
|
RuntimeDirectory = "nscd";
|
2012-10-01 22:27:42 +02:00
|
|
|
PIDFile = "/run/nscd/nscd.pid";
|
|
|
|
Restart = "always";
|
|
|
|
ExecReload =
|
2015-04-26 19:54:51 +02:00
|
|
|
[ "${pkgs.glibc.bin}/sbin/nscd --invalidate passwd"
|
|
|
|
"${pkgs.glibc.bin}/sbin/nscd --invalidate group"
|
|
|
|
"${pkgs.glibc.bin}/sbin/nscd --invalidate hosts"
|
2012-10-01 22:27:42 +02:00
|
|
|
];
|
|
|
|
};
|
2012-01-21 20:13:43 +01:00
|
|
|
};
|
|
|
|
|
2009-03-06 13:27:40 +01:00
|
|
|
};
|
2007-01-12 00:55:25 +01:00
|
|
|
}
|