Kerberos 如何与 SSH 一起工作?

Phi*_*ilR 22 linux ssh kerberos authentication

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

  • 我使用 PuTTY 或 SSH 从 L 登录到 S1,并提供我的用户名/密码
  • 从 S1 我然后 SSH 到 S2。由于 Kerberos 对我进行身份验证,因此不需要密码

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

(此问题旨在进行社区编辑;请为非专家读者改进它。)

use*_*686 31

首次登录:

  • l 向S1发送用户名和SSH认证请求
  • S1 返回可用的 SSH 身份验证机制,“密码”是其中之一
  • L 选择“密码”并将明文密码发送给 S1
  • S1 向 PAM 堆栈提供用户名和密码。
  • 在 S1 上,PAM(通常pam_krb5pam_sss)从 Kerberos KDC 请求 TGT(票据授予票据)。
    1. S1获得TGT。
      • 旧样式(无预认证):S1 发送 AS-REQ 并接收包含 TGT 的 AS-REP。
      • 新样式(带预认证):S1 使用您的密码加密当前时间戳,并将其附加到 AS-REQ。服务器对时间戳进行解密,验证是否在允许的时间偏差范围内;如果解密失败,密码立即被拒绝。否则,在 AS-REP 中返回 TGT。
    2. S1 尝试使用从您的密码生成的密钥解密 TGT。如果解密成功,则接受密码正确。
    3. TGT 存储到新创建的凭据缓存中。(您可以检查$KRB5CCNAME环境变量以查找 ccache,或用于klist列出其内容。)
  • 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 会为您执行此操作;否则,可以使用MIT Kerberos。PuTTY 0.61 支持使用 Windows (SSPI) 和 MIT (GSSAPI),但您必须手动启用转发(委托)。


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