Michael Biebl wrote:
> Am 12.03.2018 um 11:26 schrieb Laurent Bigonville:
> > Package: nslcd
> > Version: 0.9.9-1
> > Severity: normal
> > User: pkg-systemd-maintain...@lists.alioth.debian.org
> > Usertags: systemd-units
> > 
> > Hi,
> > 
> > nslcd currently doesn't provides a systemd .service file.
> > 
> > This is a problem as nslcd should order itself with the
> > nss-lookup.target and/or nss-user-lookup.target (see systemd.special(7)
> > manpage).
> 
> Well, the SysV init has
> 
> # Should-Start:      $named
> 
> So the generated .service file should already have an
> After=nss-lookup.target ordering. Are you saying this is incorrect?
> If so, is the SysV init script incorrect as well?

I think the current behaviour is wrong.
systemd's sysvinit generator treats any reference to $named as "I depend on 
named", but
in this case you're trying to say "I am named".

i.e. it should be Before=nss-lookup.target not After=nss-lookup.target.

In any case, I think either is DEFINITELY WRONG for the common case of RFC2307
users and groups, i.e. "passwd: files ldap" &c.  In that case it should be 
nss-user-lookup.target.


Attached is my first rough draft for a native systemd nslcd.service.
I haven't done much testing yet; this ticket isn't a priority for me.
I tested on Debian 11 (pam-nss-ldapd=0.9.11-1).
# FIXME: can/should nslcd be socket-activated?
#        In the typical use case of "passwd: files ldap", this
#        allows nslcd to avoid starting until the first remote user login (or 
similar).
#        I don't see an option like "nslcd --inetd" which would implement this.
#
# FIXME: /etc/init.d/nslcd has kerberos integration which I'm not even TRYING 
to reproduce here.
#        Something like this as "nslcd-k5start.service"...
#
#            [Unit]
#            Description="Keep alive Kerberos ticket"
#            PartOf=nslcd.service
#            Environment=K5START_BIN=/usr/bin/k5start
#            Environment=K5START_PIDFILE=$NSLCD_STATEDIR/k5start_nslcd.pid
#            Environment=K5START_MODE=600
#            Environment=K5START_KEYTAB=/etc/krb5.keytab
#            Environment=K5START_CCREFRESH=60
#            Environment=K5START_PRINCIPAL="host/$(hostname -f)"
#            Environment=K5START_CCFILE=$(sed -n 
's/^krb5_ccname[[:space:]]*\(FILE:\)\?\([^:[:space:]]*\)[[:space:]]*$/\2/ip' 
$NSLCD_CFG)
#            EnvironmentFile=-/etc/default/nslcd
#            ConditionEnvironment=K5START_START=yes
#            [Install]
#            WantedBy=nslcd.service
#            [Service]
#            User=nslcd
#            ExecStart=$K5START_BIN -b -p $K5START_PIDFILE -o $K5START_USER -g 
$K5START_GROUP -m $K5START_MODE -f $K5START_KEYTAB -K $K5START_CCREFRESH -u 
$K5START_PRINCIPAL -k $K5START_CCFILE


[Unit]
Description=LDAP connection daemon

# FIXME: I'm really not sure if this is the right place to inject a low-level 
daemon.
# Need to compare with other stuff like systemd-resolved.service...
[Install]
WantedBy=multi-user.target

# Needed unless your nslcd.conf has a local LDAP server, e.g.
#   uri ldapi:///
#   uri ldap://localhost
[Unit]
Wants=network-online.target

# Needed if your nsswitch.conf has "ldap" in any of
#   passwd group shadow gshadow
# FIXME: is "Wants" right here???
#        cf. systemd-user-sessions.service
[Unit]
Before=nss-user-lookup.target
Wants=nss-user-lookup.target

# Needed if your nsswitch.conf has "ldap" in any of
#   hosts networks protocols service ethers rpc
# FIXME: is "Wants" right here???
#        cf. systemdsystemd-resolved.service
[Unit]
Before=nss-lookup.target
Wants=nss-lookup.target


[Service]
Type=forking
ExecStart=
ExecStart=nslcd

# This replaces "uid nslcd" and "gid nslcd" in /etc/nslcd.conf.
# The "Group=nslcd" is implied as that is nslcd user's default group.
# NOTE: because of this, /etc/nslcd.conf must be readable by user/group nslcd.
#       In Debian 11 sysvinit script "root:root 0400 nslcd.conf" works because 
priv drop happens later.
User=nslcd

# This also has to move into the systemd unit due to early priv drop:
OomScoreAdjust=-1000

# SIGUSR1: Cause nslcd to retry any failing connections to the LDAP server, 
regardless of the reconnect_sleeptime and reconnect_retrytime options.
# I'm 80% sure this is a confusing and bad idea, since it doesn't reread 
nslcd.conf.
ExecReload=kill -USR1 $MAINPID

# nslcd listens to /run/nslcd/socket and creates /run/nslcd/nslcd.pid.
# We can tell systemd about this.
RuntimeDirectory=nslcd
WorkingDirectory=/run/nslcd


# Additional security lockdown (optional).
# $ systemd-analyze security nslcd:
# → Overall exposure level for nslcd.service: 1.2 OK 🙂
[Service]
CapabilityBoundingSet=
RestrictAddressFamilies=AF_UNIX AF_INET AF_INTE6
DevicePolicy=closed
NoNewPrivileges=yes
PrivateDevices=yes
PrivateTmp=yes
PrivateUsers=yes
ProtectClock=yes
ProtectControlGroups=yes
ProtectHome=yes
ProtectKernelLogs=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectProc=invisible
ProtectSystem=strict
RestrictSUIDSGID=yes
SystemCallArchitectures=native
SystemCallFilter=@system-service
# We can't drop @privileged because we fail with:
#   nslcd: wait_for_response(): read_response() returned 0 (expected 4)
#   nslcd: unable to daemonize: No data available
#SystemCallFilter=~@privileged
SystemCallFilter=~@resources
RestrictNamespaces=yes
RestrictRealtime=yes
LockPersonality=yes
MemoryDenyWriteExecute=yes
RemoveIPC=yes
UMask=0077
ProtectHostname=yes
ProcSubset=pid
# /run/systemd/generator.late/nslcd.service
# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/nslcd
Description=LSB: LDAP connection daemon
Before=multi-user.target
Before=multi-user.target
Before=multi-user.target
Before=graphical.target
Before=mail-transport-agent.target
Before=x-display-manager.target
Before=am-utils.service
Before=apache2.service
Before=atd.service
Before=autofs.service
Before=citadel.service
Before=courier-ldap.service
Before=courier-mta.service
Before=courier-mta-ssl.service
Before=courier-pop.service
Before=courier-pop-ssl.service
Before=cron.service
Before=cyrus-imapd.service
Before=dovecot.service
Before=exim4.service
Before=gdm3.service
Before=kdm.service
Before=kolab-cyrus-common.service
Before=mail-transport-agent.service
Before=masqmail.service
Before=nullmailer.service
Before=sendmail.service
Before=slim.service
Before=wdm.service
Before=xdm.service
After=remote-fs.target
After=time-sync.target
After=nss-lookup.target
After=network-online.target
After=slapd.service
After=krb5-kdc.service
After=heimdal-kdc.service
After=heimdal-kcm.service
After=shishi-kdc.service
Wants=network-online.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/nslcd start
ExecStop=/etc/init.d/nslcd stop

Reply via email to