![刷新 kerberos 票证而不是提示输入 pam 密码](https://linux22.com/image/788431/%E5%88%B7%E6%96%B0%20kerberos%20%E7%A5%A8%E8%AF%81%E8%80%8C%E4%B8%8D%E6%98%AF%E6%8F%90%E7%A4%BA%E8%BE%93%E5%85%A5%20pam%20%E5%AF%86%E7%A0%81.png)
使用集中式身份验证来对抗 FreeIPA 效果很好。为了在使用来自 jumphosts 的 ssh、scp 等时使用 Kerberos SSO,用户必须先使用 kinit 启动他们的 Kerberos 票证。我已将其添加到用户的 bashrc 中,以便提示他们输入密码,因为所有客户端均未绑定到 IPA 领域。
但是,票证会在 24 小时后过期。因此,如果用户尝试使用过期的票证进行 ssh 或 scp,SSO 会失败,并提示他们输入密码。用户忘记了 kinit,所以我想知道我是否可以做些什么让系统在回退到基于 pam 的密码身份验证之前尝试更新 Kerberos 票证。这样,当用户的票证过期时,他们每 24 小时只会被提示输入一次密码。这样就不需要用户每 24 小时手动进行一次任意操作了kinit
。
请注意,用户可能通过多个 ssh 会话或会话管理器(如 screen 和 byobu)在同一 jumphost 上打开多个会话。我知道,他们从非 IPA 机器连接到的每个 jumphost 的 Kerberos 票证都是独立的。
由于上述原因,我认为这不是解决 Kerberos 票证有效性问题的 crontab 解决方案,因为 1)用户可能处于空闲状态,并且 2)打开多个会话的用户可能会多次提示同一张票,从而导致用户感到困惑和沮丧。
答案1
kinit -R
在跳转箱上使用cronjob。
当用户ssh
的票已经过期时,就什么也做不了了——过期的票无法再续订;需要提前进行续订。
尽管理论上 libkrb5 可以在用户运行时主动延长有效的 TGT ssh
,但实际上这没有多大意义;没有什么可以确保用户确实会ssh
在正确的时刻运行。因此,自动主动续订只有在计划(即 cron 或类似计划)上才有意义。
(当前版本的 libkrb5 可以自动获取新的如果用户已经创建了客户端密钥表,则可以从客户端密钥表获取票证;但我认为将他们的密码存储在跳转箱上是不可取的。)
请注意,用户可以通过多个 ssh 会话或会话管理器(如 screen 和 byobu)在同一个 jumphost 上打开多个会话。
这只有在跳转主机通过 PAM 自动为用户获取 Kerberos 票证时才有意义(例如,如果您使用了 pam_krb5)。但必须手动操作kinit
强烈暗示用户在跳转主机上只有一个“默认”票证缓存,无论他们的会话数是多少——因为,如果他们没有票证,那么几乎可以肯定没有任何东西为他们设置 $KRB5CCNAME——所以你很可能能使用 cron 作业来处理更新。
因此,如果已通过该Renewable
标志获取 TGT,则用户只需执行@hourly
cron 作业(或 systemd .timer,如果您的发行版支持)即可使用 更新其 TGT kinit -R
。克雷纽守护进程(也需要在用户级别运行)也可以执行相同的任务。
不过,即使用户做有多个票证缓存,拥有一个更新所有票证缓存的 cronjob 实际上不是一项艰巨的任务:它只是一个为找到的每个缓存for
运行的 Bash 循环。kinit -R -c $cache
请注意,票证续订通常限制为 7 或 14 天(我不确定 FreeIPA 的默认值是什么,但我相信底层 MIT Krb5 KDC 的硬性限制为 14 天)。
(此外,续订将从缓存中丢弃其他非 TGT 票证,但这并不重要——它们对于已经活跃的会话来说不是必需的,并且它们会在需要时重新获取。)
另一种选择:使用跳转主机作为隧道服务器,而不是交互式 shell 服务器。也就是说,让用户kinit
在他们的系统上执行操作,然后使用跳转主机作为原始 TCP 隧道主机 (使用ProxyJump
)“直接”启动到目标的 SSH。他们将使用本地票据向两个系统进行身份验证;他们的本地系统将处理续订。
我知道,对于从非 IPA 机器连接的每个跳转主机,Kerberos 票证都是分开的。
这不是问题,TGT 的每个副本都可以独立更新。