Chrome在使用mod_auth_gssapi的 Kerberos SSO时,显示凭据弹窗,而不是实现透明的单点登录
我正在Debian(12)上尝试用Apache(mod_auth_gssapi)和Symfony(7.4.12)搭建Kerberos SSO。
我的配置:
- Apache 2.4
- mod_auth_gssapi
- 已启用HTTPS
- Windows客户端上的Google Chrome
- Kerberos域正确配置
- 服务主体:
HTTP/[email protected] - Keytab已成功加载(
klist -k显示主体) REMOTE_USER在身份验证成功时正确传递给Symfony
当前的Apache配置:
<Location />
AuthType GSSAPI
AuthName "Kerberos Login"
GssapiCredStore keytab:/path/to/service.keytab
GssapiAllowedMech krb5
GssapiNegotiateOnce On
GssapiLocalName On
Require valid-user
</Location>
Kerberos身份验证本身似乎工作正常。
当Chrome显示Windows凭据弹出框并且用户输入域凭据后,身份验证成功,Apache识别用户,REMOTE_USER 被正确填充,且Symfony按预期将用户登录。
然而,这并不是我想要的行为。
我的目标是:
- 如果用户在Windows上已使用有效域账户登录,Chrome应该自动进行透明的Kerberos单点登录(SSO)。
- 如果用户未在Windows上使用有效域账户登录(或无法使用Kerberos),我希望Apache立即返回自定义的401页面。
- 我不希望Chrome显示凭据弹出框并允许手动认证。
已进行的检查:
- DNS能正确解析
- HTTPS证书有效
- Active Directory中存在SPN
- Keytab包含正确的主体
- Apache重新加载时无错误
- 手动输入凭据后Kerberos验证仍然工作
问题:
- 为什么Chrome会显示凭据弹出框,而不是执行透明的Kerberos验证?
- 是否可以完全禁用手动凭据提示,只允许自动Kerberos SSO?
- 如果Kerberos协商失败,如何强制Apache返回401页面,而不是提示输入凭据?
- 是否有实现该行为所需的特定Chrome策略或Apache/mod_auth_gssapi设置?
- 如何在弹出前验证Chrome实际是否在尝试Kerberos验证?
任何帮助都将不胜感激。谢谢
解决方案
如果用户在Windows上以有效域账户登录,Chrome应该自动进行透明的Kerberos单点登录(SSO)。
请注意,浏览器通常默认不会把Kerberos票据发送给任意服务器。Windows上的Chrome要求你的域要么被列在Chrome特定的AuthServerAllowlist策略中,要么在Windows的 MSIE安全区(“集成Windows身份验证”功能,默认对Intranet和 Trusted区域是允许的)之内。
(在其他操作系统上的Chrome只使用其自己的AuthServerAllowlist策略。Firefox也有类似的策略和/或about:config参数。)
- 是否可以完全禁用手动凭据提示,只允许自动Kerberos SSO?
不能,仅通过服务器端配置就能实现。
如果用户未在Windows上以有效域账户登录(或Kerberos不能使用),我希望Apache立即返回自定义的401页面。
我不希望Chrome显示凭据弹出框并允许手动认证。
请确保 GssapiBasicAuth 已禁用。
除此之外,服务器无法控制显示哪些凭据弹窗。通过提示输入密码来“按需”获取Kerberos票据在Windows上相对常见(你也会在RDP和 SMB中看到),因此Chrome/Edge实现了同样的行为,MSIE也是如此——尽管Firefox不是。但这仍然是Kerberos,而不是简单的密码认证;它只是看起来像Basic的提示。
- 如果Kerberos协商失败,如何强制Apache返回401页面而不是提示输入凭据?
这已经是会发生的情况,401页面正在返回——它恰恰是导致凭据弹窗的原因。
为澄清:浏览器并不会主动发送Kerberos令牌——和其他认证类型一样,只有在服务器提示时才会发送。
因此,Kerberos验证的固定流程是:浏览器在没有凭据的情况下发送请求,然后Apache作为常规流程返回401——具体来说,是带有“需要Negotiate身份验证”的401头部——这就是浏览器知道必须发送Kerberos令牌的方式。
在此时,如果没有Kerberos票据,浏览器要么立即显示收到的401页面的内容,要么要求用户填写Kerberos凭据。Firefox会显示401错误,Chrome/IE会提示输入Kerberos主体和密码。
- 如何在弹出之前验证Chrome实际是否在尝试Kerberos验证?
使用Wireshark或 Microsoft Network Monitor监控发送到你们KDC的 Kerberos请求,查找对 HTTP/domain.com 的TGS-REQ。
chrome://net-export/ 可能包含关于Chrome是否执行Kerberos验证的决策日志。