Kerberos如何与SSH协同工作?

假设我有四台电脑,Laptop,Server1,Server2,Kerberos服务器:

  • 我使用从L到S1的PuTTY或SSHlogin,提供我的用户名/密码
  • 从S1我然后SSH到S2。 Kerberos对我进行身份validation时不需要密码

描述所有重要的SSH和KRB5协议交换:“L发送用户名到S1”,“K发送…到S1”等

(这个问题打算由社区编辑,请为非专业读者改进 。)

首次login:

  • L向S1发送用户名和SSHauthentication请求
  • S1返回可用的SSHauthentication机制,其中“password”就是其中之一
  • Lselect“密码”并将简单密码发送给S1
  • S1给PAM堆栈提供用户名和密码。
  • 在S1上,PAM(通常是pam_krb5pam_sss )从Kerberos KDC请求一个TGT(ticket- pam_sss ticket)。
    1. S1获得TGT。
      • 旧样式(不含预定义):S1发送AS-REQ并接收包含TGT的AS-REP。
      • 新样式(带有预定义):S1使用您的密码encryption当前时间戳,并将其附加到AS-REQ。 服务器解密时间戳并validation它是否在允许的时间偏差之内; 如果解密失败,密码立即被拒绝。 否则,在AS-REP中返回一个TGT。
    2. S1尝试使用密码生成的密钥来解密TGT。 如果解密成功,则密码被接受为正确的。
    3. TGT被存储到新创build的凭证caching中。 (您可以检查$KRB5CCNAME环境variables以查找ccache,或使用klist列出其内容。)
  • S1使用PAM执行授权检查(取决于configuration)并打开会话。
    • 如果在授权阶段调用pam_krb5 ,它将检查是否存在~/.k5login 。 如果有,它必须列出客户端Kerberos主体。 否则,唯一允许的主体是username @ DEFAULT-REALM

第二次login:

  • S1向S2发送用户名和SSH authn请求
  • S2返回可用的身份validation机制,其中之一是“gssapi-with-mic” 1
  • S1向host/ s2.example.com @ EXAMPLE.COM请求一张票,通过TGT向host/ s2.example.com @ EXAMPLE.COM发送一个TGS-REQ,并从host/ s2.example.com @ EXAMPLE.COM接收一个带有服务票据的TGS-REP。
  • S1生成“AP-REQ”(authentication请求)并将其发送到S2。
  • S2试图解密请求。 如果成功,则authentication完成。 (PAM不用于authentication。)
    • 其他协议(例如LDAP)可以select使用请求中包含的“会话密钥”来encryption进一步的数据传输; 但是,SSH已经协商了自己的encryption层。
  • 如果authentication成功,S2使用PAM执行授权检查并打开会话,与S1相同。
  • 如果启用了证书转发并且TGT具有“可转发”标志,则S1请求用户的TGT(具有“转发”标志设置)的副本并将其发送到S2,在那里它被存储到新的ccache。 这允许recursion的Kerberosauthenticationlogin。

请注意,您也可以在本地获得TGT。 在Linux上,你可以使用kinit ,然后用ssh -K连接。 对于Windows,如果您login到Windows AD域,则Windows会为您执行此操作; 否则,可以使用MIT Kerberos 。 PuTTY 0.61支持同时使用Windows(SSPI)和MIT(GSSAPI),但您必须手动启用转发(委派)。


1 gssapi-keyex也是可能的,但是没有被官方的OpenSSH接受。

简而言之:理想情况下,应该在terminal(L)上使用kinit命令获取Kerberos票据,或者在所谓的“单一login”设置中将Kerberos票据作为本地login序列的一部分。 远程系统(S1,S2)可以在没有密码提示的情况下访问。 链式访问(L→S1→S2)可以通过使用称为“票据转发”的技术来实现。 这种设置尤其需要从terminal(L)直接访问KDC。

另一个由grawity的答案详细解释了这种方法。

这里唯一不明显的步骤是在S1上有一个PAM模块,它使用您的凭证来执行kinit并从K(客户端身份validation)获取您授予票证的票据。 然后,当您使用Kerberos身份validationSSH到S2时,将进行客户端服务身份validation。 我没有看到通过消息去经历所有乏味的交stream信息的好处。

如果您想查看每条消息并阅读Kerberos的维基百科描述 ,请在您的ssh命令中input-vvv