浏览器如何获取 Kerberos TGT 和服务票证

问题描述 投票:0回答:1

在作为 AD 域成员且基于 Kerberos 身份验证的 Windows 主机上,浏览器如何获取 TGT 和服务票证来访问特定服务(例如具有 kerberos 身份验证的代理)?我想了解它在实现层面使用了哪些API。

我确实在 guthub 上找到了 gokrb5 Golang 库,它实现了这一点,但它需要 keytab 文件来获取 TGT 和服务票证。浏览器如何在没有 keytab 文件的情况下获取 kerberos 票证?

kerberos
1个回答
0
投票

在作为 AD 域成员且基于 Kerberos 身份验证的 Windows 主机上,浏览器如何获取 TGT 和服务票证来访问特定服务(例如具有 kerberos 身份验证的代理)?我想了解它在实现层面使用了哪些API。

浏览器使用 SSPI,它是 Microsoft 的 GSS-API 变体 - 一种通用安全协议 API,允许您与 Kerberos 以及 NTLM 进行交互。

使用 SSPI(以及 GSS-API),浏览器根本不直接处理票证 - 它只要求 SSPI 为特定服务主体输出“令牌”,然后 SSPI 负责所有票证获取。

在 Python 中使用 sspilibpyspnego 进行实验。 (我有一些例子。)

(请注意,SSPI 中的“机制”或“安全包”通常设置为“协商”(又名 SPNEGO)而不是原始的“Kerberos”,但 API 保持完全相同......并且通常 SPNEGO 只是简短-无论如何,电路到 Kerberos。)

我确实在 guthub 上找到了 gokrb5 Golang 库,它实现了这一点,但它需要 keytab 文件来获取 TGT 和服务票证。浏览器如何在没有 keytab 文件的情况下获取 kerberos 票证?

它从用户的密码中派生出密钥。用户(客户端)主体具有密码派生密钥,而不是随机生成的密钥(MD4 或 PBKDF2-SHA1 用于密钥派生)。

但是,实际上处理 Kerberos 的并不是浏览器,而是 SSPI 后端 (Windows LSASS.EXE)。浏览器仅向 Windows(通过 SSPI)请求给定服务的令牌,而永远无法访问原始密钥。 (把它想象成 ssh-agent。)

因此,当您登录 Active Directory 帐户时,Windows 会从您的密码(使用 MD4 或 PBKDF2-SHA)派生您帐户的 Kerberos 密钥,并使用它来获取票证。如果您是本地帐户,您可以将 Kerberos 凭据存储在“Windows 凭据存储”中,这些凭据也将由 SSPI 使用。

(事实上,在 AD 上,甚至服务也有密码派生密钥;Linux 主机有系统密钥表,Windows 主机有一个具有相同功能的“计算机帐户密码”。)

Gokrb5 是一个异常值,因为(与 Golang 中的许多事情一样)它坚持从头开始实现整个协议,而不是为操作系统提供的 Kerberos 支持提供接口。因此,它无法访问您的登录凭据,您必须提供密钥表密码才能获取 TGT。

最后,密钥(无论是密码还是密钥表)仅用于获取初始票证(TGT)——之后,仅 TGT 用于服务票证。

© www.soinside.com 2019 - 2024. All rights reserved.