我试图弄清楚 kerberos 身份验证是如何工作的,我发现的信息总是缺少一些东西,好像它的一部分被认为是理所当然的。我一般都知道这个过程,但缺少一些细节。
获得 TGT:
首先,用户应该从 KDC 获得 TGT(Ticket Granting Tickets) - 用户发送的请求仅包含其用户名 (UPN) 而没有密码。提供了一些额外信息以防止重新发送请求,例如 IP 地址和时间戳。如果需要预认证,则使用用户密码对时间进行哈希处理。
KDC 向用户发送以下信息: A. TGT - 带有时间戳、用户名、IP 地址和会话密钥 - TGT 使用只有 KDC 知道的秘密加密,因此任何人都无法更改。
B. 用户和KDC在以后的通信中使用的会话密钥。这些东西是使用用户密码(KDC 和用户之间的基本共享秘密)加密的。如果使用了预身份验证,服务器将在发回信息之前检查时间戳是否有效。用户接收信息并使用其密码对其进行解密 - 然后将其存储在其内存(kerberos 托盘)中。
获取 TGS:
当用户被要求从服务中验证自己时,他向 KDC 发送 TGS(票证授予服务)请求,该请求包含 TGT、UPN 和 SPN(服务主体名称 - 例如网页的 URI) .
然后 KDC 解密 TGT 并验证它的真实性,它与 UPN 对应,来自相同的 IP 地址并且仍然有效(票证具有有效时间段)。
KDC 向使用服务密码加密的用户发送 TGS。
用户将 TGS 提供给服务 - 它使用自己的密码对其进行解密。
身份验证已完成,因为服务依赖于它的密码仅在它和 KDC 之间共享这一事实,因此它相信 KDC 较早地对用户进行了身份验证。
几个问题:
我错过了什么还是仅此而已?
用户和 KDC 何时使用过会话密钥?在什么时候?为什么有必要?为什么用户密码不够?
用户和服务之间还应该有一个会话密钥(据我所知) - 何时以及为什么使用它(与最后一个问题相同)?
Kerberos 在各方之间有 5 分钟的间隔限制 - 我理解为什么保持时间同步很重要,因为它被用作我们加密和解密的东西,那么为什么任何间隔都可以?为什么是 5 分钟?
如果您有任何更正,我会很高兴。
提前致谢, 托默
1)这似乎很彻底,我不确定所有细节。
2)用户的密码是不够的,因为它必须在两方之间共享,而共享它的只有两方是 KDC 和客户端。如果你要通过网络发送一些东西,即使是加密的,如果它没有很长的使用寿命会更好。所以客户端使用会话密钥来请求服务票证(我认为)。而且,KDC 使用会话密钥生成服务票证,因此当客户端获得 LDAP 或 HTTP 服务的票证时,KDC 会生成一个会话密钥。该会话密钥在服务票证中,并且服务票证还包含发送给服务提供代理(LDAP 或 HTTP 服务器)的加密消息,该消息还包括会话密钥。因此,现在客户端和服务器都共享一个 KDC 告诉他们双方的临时秘密。当有使用它的协议时使用此密钥。因此,例如,如果启用了 kerberos,则可能会说 telnet 服务器可以通过线路加密流量。
4)包括时间,5分钟的余地是确保时钟不必精确同步到毫秒的一种方式,您可以容忍任何正常水平的网络延迟或短暂的中断,但您不能稍后重播请求。去拿票是不好的,让国家安全局窥探电线,然后几天/几周/几年后,在暴力破解你的密码或使用后来发现的花哨的数学攻击解密后,他们去使用票再次。确保票是最近的可以防止这种问题。
会话密钥并非一直使用。例如,如果您使用 kerberos 身份验证连接到 https 网站,通常您会使用 kerberos 进行身份验证,但会话密钥是使用标准 https 方法(即 SSL/TLS)协商的