在配置 kerberos 委派时,我对 IIS 10 中的 Windows 身份验证的理解存在差距。
对于访问 Web 服务器(IIS,启用了 Windows 身份验证)且无需担心委派方案或自定义 SPN 的客户端,这就是我解释 kerberos 身份验证的方式:
客户端向 KDC 请求 TGT(和会话密钥)。
收到 TGT 后,客户端使用它向 TGS 请求与 Web 服务器主机名匹配的 SPN 的服务票证。(HTTP/name.company.com)。
客户端库64对服务票据进行编码,并将其插入作为发送到网络服务器进行验证的请求的WWW验证标头。Web 服务器可以对其进行解密以验证客户端的身份。
这些服务器故障帖子(MSSQLSvc 服务主体名称、Kerberos 和 NTLM)和此帖子(为什么在 IIS 中使用 Kerberos 而不是 NTLM?)似乎暗示,如果 TGS 在步骤 #2 中找不到 SPN,客户端将回退使用 NTLM 协议(而不是 Kerberos)对 IIS Web 服务器进行身份验证。
我的问题:
我似乎很困惑在我描述的这个场景中是使用 Kerberos 进行身份验证还是 NTLM - 我一直认为 IIS 使用 kerberos 进行开箱即用的 Windows 身份验证。
步骤 2 中的服务票证 - 我认为服务票证仍会被发回,尽管它不包含 SPN?
如果 IIS 配置为协商身份验证,则它将首先尝试 Kerberos,前提是客户端发送 Kerberos 令牌。IIS 服务器对初始请求(通常为 401)的响应将包含标头“WWW-Authenticate: Negotiate”,也称为“向我发送 Kerberos 令牌”。
如果 Kerberos 身份验证失败,IIS 可以配置为回退到 NTLM,前提是客户端发送 NTLM 令牌。(数据的第一个字符是字符“T”)。
回退到 NTLM 是一个共同的概念,可以在客户端和服务器上启用、禁用和配置,并且适用于与 Windows 主机通信时使用的大多数协议和技术,例如 SMB 和 RPC。
协商的语义可能很微妙并且依赖于实现。例如,Kestrel 在解码后的 WWW-Authenticate 标头响应负载前面加上
NTLM
或HTTP
,这意味着 Kerberos。请注意,回退仅适用于访问 IIS 服务器本地的资源。对于模拟用户访问其他资源(例如数据库或 Web 服务)的应用程序,必须使用 Kerberos。这通常是更常见的情况,IIS 服务器只是一个应用程序服务器,负责前端访问另一个远程资源的请求。
在这种情况下,“失败”并不一定意味着任何失败。特定的故障可能有特定的异常处理程序。此功能旨在解决的一个典型“失败”是令牌大小限制。Windows Active Directory 用户可能是许多组的成员,这些组包含在 Windows Kerberos 实现上的令牌的特权属性证书 (PAC) 中,该证书作为响应的 WWW-Authenticate 标头插入。如果它大于 IIS 允许的大小,则会失败。NTLM 令牌要小得多,通常小于 1kb,并且 NTLM 可以工作。
解决此问题的最佳方法可能是使用 Fiddler/Wireshark 并检查数据包标头。
https://www.crowdstrike.com/cybersecurity-101/ntlm-windows-new-technology-lan-manager/
https://learn.microsoft.com/en-us/iis/configuration/system.webserver/security/authentication/windowsauthentication/providers/
https://specopssoft.com/blog/configuring-chrome-and-firefox-for-windows-integrated-authentication/
https://github.com/dotnet/AspNetCore.Docs/blob/main/aspnetcore/security/authentication/windowsauth.md
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization
https://stackoverflow.com/questions/5597573/how-to-find-if-ntlm-or-kerberos-is-used-from-www-authenticate-negotiate-header