>我使用PuTTY或SSH从L到S1登录,提供我的用户名/密码
>从S1我然后SSH到S2. Kerberos对我进行身份验证时无需密码
描述所有重要的SSH和KRB5协议交换:“L发送用户名到S1”,“K发送…到S1”等.
(此问题旨在进行社区编辑;请为非专业读者改进.)
解决方法
> L向S1发送用户名和SSH认证请求
> S1返回可用的SSH身份验证机制,其中“password”作为其中之一
> L选择“密码”并将普通密码发送到S1
> S1为PAM堆栈提供用户名和密码.
>在S1上,PAM(通常是pam_krb5或pam_sss)从Kerberos KDC请求TGT(票证授予票证).
> S1获得TGT.
>旧样式(没有preauth):S1发送AS-REQ并接收包含TGT的AS-REP.
>新样式(带有preauth):S1使用您的密码加密当前时间戳,并将其附加到AS-REQ.服务器解密时间戳并验证它是否在允许的时间偏差内;如果解密失败,则立即拒绝密码.否则,在AS-REP中返回TGT.
> S1尝试使用密码生成的密钥解密TGT.如果解密成功,则接受密码为正确.
> TGT存储到新创建的凭证缓存中. (您可以检查$KRB5CCNAME环境变量以查找ccache,或使用klist列出其内容.)
> S1使用PAM执行授权检查(取决于配置)并打开会话.
>如果在授权阶段调用pam_krb5,它会检查是否存在〜/ .k5login.如果是,则必须列出客户端Kerberos主体.否则,唯一允许的主体是username @ DEFAULT-REALM.
第二次登录:
> S1向S2发送用户名和SSH authn请求
> S2返回可用的auth mechs,其中一个是“gssapi-with-mic”1
> S1通过向TGC发送带有TGT的TGS-REQ并从其接收带有服务票据的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会为您执行此操作;否则,可以使用MIT Kerberos. PuTTY 0.61支持同时使用Windows(SSPI)和MIT(GSSAPI),但您必须手动启用转发(委派).
1 gssapi-keyex也是可能的,但未被官方OpenSSH接受.