当我使用 ssh 登录我的 freeipa 客户端时,我获得了 Kerberos 凭据(klist)。但是,在它们过期后,我不再获得凭据(klist 为空)。这导致没有主目录,因为用户没有 nfs 的权限。我可以使用 kinit 来获取新的凭据。重新启动 sssd 并再次使用 ssh 登录,也获得了新的票证。使用 sudo 也可以获得票证。
我什至不知道哪个进程负责请求票证,所以我不知道从哪里开始调试问题。我有 Ubuntu 20.04 并使用 freeipa-client 包安装客户端。
任何帮助,将不胜感激。
如果您使用 ssh 公钥进行身份验证,那么您只是对您的 ssh 守护进程进行身份验证,而不是对系统进行身份验证。SSH 守护进程会声称它执行了身份验证,然后将您登录到 shell。虽然此过程可能使用 PAM 堆栈来设置您的登录会话,但是它不通过 PAM 堆栈处理身份验证。
我可能对你说很明显,但只有在你使用请求它的软件时才能获得 Kerberos 票。在典型的系统上,如果在应用程序使用的 PAM 配置堆栈中定义了其中一个,则将通过 PAM
auth
阶段请求此类票证。当此类应用程序(例如)正在跳过阶段时,不会调用任何负责身份验证的 PAM 模块,并且无法通过这种方式获得 Kerberos 票证。pam_sss
pam_krb5
auth
sshd
auth
当 Kerberos 客户端尝试请求初始票证授予票证 (TGT) 时,它和 Kerberos KDC 交换所谓的“预身份验证方法”列表。在实践中,这些是用于针对 KDC 对客户端进行身份验证的方法。客户端选择的一种方法,如果被 KDC 接受,则实现实际的身份验证过程。没有使用 SSH 密钥对进行身份验证的 Kerberos 预身份验证方法,因此您不能使用 SSH 密钥对来获取 TGT。所有标准的基于密码的预身份验证方法都是围绕 Kerberos 客户端和 Kerberos KDC 构建的,它们知道用户主体的长期密钥(密码),即使它们不通过网络传递它。
你能做什么?您可能想转而使用智能卡进行身份验证。Kerberos 支持智能卡身份验证作为“pkinit”预身份验证方法。除此之外,SSH 守护进程能够处理来自智能卡的证书以进行类似于 SSH 密钥对情况的身份验证。
如果您使用 PKINIT 身份验证,您有两种方法:在您的工作站上获取带有 PKINIT 的 Kerberos TGT,并使用您在本地拥有的 Kerberos 票证登录到其他机器上的 SSH 守护程序,或者使用您的智能卡证书以SSH 密钥,然后使用智能卡转发直接在主机上请求 Kerberos 票证。在前一种情况下,您的原始 TGT 不会自动转发到 SSH 主机,除非您已请求票证委托。在后一种情况下,您仍然需要申请 TGT。
无论使用哪种方法,您都可以从https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_certificates_in_idm/index中受益
如果您不想或不能使用智能卡,那么剩下的唯一方法就是直接使用 Kerberos 登录而忘记 SSH 密钥对身份验证。