在用户模式下使用 systemd 进行 Kinit

在用户模式下使用 systemd 进行 Kinit

keytab我在用户主目录下创建了一个文件$HOME/client.keytab。身份验证缓存文件位于其默认位置/tmp/krb5cc_%U(其中 %U 是 UID)。现在,我有这个简单的systemd unit文件来启动服务并获取身份验证密钥:

[Unit]
Description=Initializes, caches and renews Kerberos tickets for user
After=default.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/bin/kdestroy -q -c /tmp/krb5cc_%U
ExecStart=/usr/bin/kinit -V -l 30d -r 365d -k -t %h/client.keytab -c /tmp/krb5cc_%U %[email protected]
ExecStartPost=/usr/bin/krenew -b -K 60 -k /tmp/krb5cc_%U
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=KerberosTicketing

[Install]
WantedBy=default.target

After如果指向 ,这将完美运行,并创建和存储 Kerberos 身份验证票据default.target。但是,为什么呢default.target?这是启动过程中相当晚的时候。我宁愿让它在 时工作multi-user.target,这样我就可以使用生成的票据从不接受公有/私有身份验证的服务器挂载远程文件系统。

编辑:如果After是除了default.target或更晚的任何内容,kinit则会失败并出现错误kinit: Cannot find KDC for realm "EXAMPLE.COM" while getting initial credentials

我基本上想实现这个目标:使用 Kerberos(GSSAPI)通过 FSTAB 自动挂载 SSHFS

答案1

为了systemd --用户单位,这是时间的开始。整个 --user 管理器在引导过程的后期启动——它是一项系统服务([电子邮件保护]) 由 systemd-logind 启动,而 systemd-logind 本身始终在后期启动期间启动。

要根据早期单元(如 remote-fs.target)对服务进行排序,您需要将其转换为系统服务。然后您的 .mount 单元(或您的 fstab 条目)也将能够指定对您的服务的依赖关系。


请注意 WantedBy=才不是定义您的单元何时排队(以相反的方式)。相反,这是由(隐式和显式)Before=/After= 选项定义的。完全有可能并且很常见的是,有一个单元具有“WantedBy=multi-user.target”,但也有“DefaultDependencies=no”和“Before=remote-fs.target”。


附注:不要通过 ExecStartPost=等方式运行守护进程krenew -K。唯一“正式”允许长时间运行进程(并提供 Restart= 等功能)的地方是主 ExecStart=,因此如果您想要定期更新,请将您放在krenew -K那里。

您可以将 kinit 作为第二个 ExecStartPre= 运行,或者使用k5start -K它来避免手动 kinit 的需要。

ExecStart=/usr/bin/k5start -L -b -K 30 -f %h/client.keytab -k /tmp/krb5cc_%U -u %[email protected]

相关内容