假设我有四台计算机,Laptop,Server1,Server2,Kerberos 服务器:
- 我使用 PuTTY 或 SSH 从 L 登录到 S1,并提供我的用户名/密码
- 然后我从 S1 通过 SSH 连接到 S2。无需密码,因为 Kerberos 会对我进行身份验证
描述所有重要的 SSH 和 KRB5 协议交换:“L 将用户名发送给 S1”、“K 将...发送给 S1”等等。
(该问题旨在由社区编辑;请改进它对于非专业读者。
答案1
首次登录:
- L 向 S1 发送用户名和 SSH 认证请求
- S1 返回可用的 SSH 身份验证机制,其中之一就是“密码”
- L 选择“密码”,并将明文密码发送给 S1
- S1 向 PAM 堆栈提供用户名和密码。
- 在 S1 上,PAM(通常
pam_krb5
或pam_sss
)从 Kerberos KDC 请求 TGT(票证授予票证)。- S1 获得 TGT。
- 旧式(无预先授权):S1 发送 AS-REQ 并接收包含 TGT 的 AS-REP。
- 新式(带预认证):S1 使用您的密码加密当前时间戳,并将其附加到 AS-REQ。服务器解密时间戳并验证其是否在允许的时间偏差内;如果解密失败,则立即拒绝密码。否则,将在 AS-REP 中返回 TGT。
- S1 尝试使用由您的密码生成的密钥解密 TGT。如果解密成功,则密码被视为正确。
- TGT 存储到新创建的凭据缓存中。(您可以检查
$KRB5CCNAME
环境变量来查找 ccache,或使用klist
它来列出其内容。)
- S1 获得 TGT。
- S1 使用 PAM 执行授权检查(依赖于配置)并打开会话。
- 如果
pam_krb5
在授权阶段调用,它会检查是否~/.k5login
存在。如果存在,它必须列出客户端 Kerberos 主体。否则,唯一允许的主体是。username@DEFAULT-REALM
- 如果
第二次登录:
- S1 向 S2 发送用户名和 SSH 身份验证请求
- S2 返回可用的身份验证机制,其中之一是“gssapi-with-mic” 1
- S1通过向 KDC 发送带有 TGT 的 TGS-REQ来请求 的票证,并从 KDC 接收带有服务票证的 TGS-REP。
host/s2.example.com@EXAMPLE.COM
- S1 生成“AP-REQ”(认证请求)并发送给 S2。
- S2 尝试解密请求。如果成功,则身份验证完成。(不使用 PAM 进行身份验证。)
- 其他协议(例如 LDAP)可能选择使用包含在请求中的“会话密钥”来加密进一步的数据传输;但是,SSH 已经协商了自己的加密层。
- 如果身份验证成功,S2 使用 PAM 执行授权检查并打开会话,与 S1 相同。
- 如果已启用凭据转发且 TGT 具有“可转发”标志,则 S1 会请求用户 TGT 的副本(设置了“已转发”标志)并将其发送到 S2,然后将其存储到新的 ccache 中。这允许递归 Kerberos 身份验证登录。
请注意,您也可以在本地获取 TGT。在 Linux 上,您可以使用kinit
,然后使用 进行连接ssh -K
。对于 Windows,如果您已登录 Windows AD 域,Windows 会为您执行此操作;否则,麻省理工学院 Kerberos可以使用。PuTTY 0.61 支持使用 Windows (SSPI) 和 MIT (GSSAPI),但您必须手动启用转发(委托)。
1 gssapi-keyex
也是可行的,但是没有被官方 OpenSSH 接受。
答案2
长话短说:理想情况下,应该在您的终端 (L) 上获取 Kerberos 票证,可以使用kinit
命令或作为所谓的“单点登录”设置中的本地登录序列的一部分。这样就可以访问远程系统 (S1、S2) 而无需输入密码。通过使用一种称为“票证转发”的技术,可以实现链式访问 (L→S1→S2)。这种设置尤其需要 KDC 可以从终端 (L) 直接访问。
另一个答案来自重力详细解释了这种方法。
答案3
这里唯一不明显的步骤是 S1 上有一个 PAM 模块,它使用您的凭据执行kinit
并从 K(客户端身份验证)获取授予票据的票据。然后,当您使用 Kerberos 身份验证通过 SSH 连接到 S2 时,将进行客户端服务身份验证。我看不出逐条消息进行所有繁琐的交换有什么好处。
-vvv
如果你想查看每条消息并阅读维基百科描述的 Kerberos。