当我使用 ssh 登录到我的 freeipa 客户端时,我获得了 Kerberos 凭据(klist)。但是,在它们过期后,我不再获得凭据(klist 为空)。这导致没有主目录,因为用户没有 nfs 的权限。我可以使用 kinit 获取新凭据。重新启动 sssd 并使用 ssh 再次登录,也会获得新票证。使用 sudo 也可以获得票证。
我甚至不知道哪个进程负责请求票证,所以我不知道从哪里开始调试这个问题。我有 Ubuntu 20.04 并使用 freeipa-client 包来安装客户端。
任何帮助,将不胜感激。
答案1
如果您使用 ssh 公钥进行身份验证,则您仅向 ssh 守护程序进行身份验证,而不是向系统进行身份验证。SSH 守护程序会声称它已执行身份验证,然后将您登录到 shell。虽然此过程可能利用 PAM 堆栈来设置您的登录会话,但它不会通过 PAM 堆栈处理身份验证。
我可能对您说得很明显,但只有使用请求它的软件才能获得 Kerberos 票证。在典型的系统中,如果应用程序使用的 PAM 配置堆栈中定义了或 ,则将通过 PAMauth
阶段请求此类票证。当此类应用程序(例如)跳过阶段时,不会调用任何负责身份验证的 PAM 模块,因此无法通过这种方式获得 Kerberos 票证。pam_sss
pam_krb5
auth
sshd
auth
当 Kerberos 客户端尝试请求初始票证授予票证 (TGT) 时,它和 Kerberos KDC 会交换所谓的“预认证方法”列表。实际上,这些方法用于根据 KDC 对您的客户端进行认证。如果 KDC 接受客户端选择的一种方法,则该方法将执行实际的认证过程。没有使用 SSH 密钥对进行认证的 Kerberos 预认证方法,因此您无法使用 SSH 密钥对获取 TGT。所有基于密码的标准预认证方法都是围绕 Kerberos 客户端和 Kerberos KDC 构建的,它们都知道用户主体的长期密钥(密码),即使它们不通过网络传递它。目前有一种方法不依赖密码,这就是所谓的 PKINIT 方法,它依赖于使用公钥证书基础结构完成认证。
你能做什么?你可能想扭转局面,改用智能卡进行身份验证。Kerberos 支持智能卡身份验证作为“pkinit”预身份验证方法。除此之外,SSH 守护进程能够处理来自智能卡的证书,类似于 SSH 密钥对的情况。
如果您使用 PKINIT 身份验证,则有两种方法:要么在您的工作站上使用 PKINIT 获取 Kerberos TGT,然后使用您本地的 Kerberos 票证登录到其他计算机上的 SSH 守护程序,要么使用您的智能卡证书作为 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 密钥对身份验证。