以下是 Apache HTTP Kerberos 模块配置/etc/apache2/sites-available/my.server.tld.conf
:
# ...
<Location />
Authname "SSO Authentication"
AuthType Kerberos
KrbAuthRealms MY.DOMAIN.TLD
KrbServiceName HTTP/[email protected]
Krb5Keytab /etc/apache2/kerb5.my.server.tld.ktab
KrbMethodNegotiate On
KrbMethodK5Passwd On
Require valid-user
</Location>
# ...
Kerberos 配置如下/etc/krb5.conf
:
[libdefaults]
default_realm = MY.DOMAIN.TLD
# ...
[realms]
MY.DOMAIN.TLD = {
kdc = my.ad.server.1.tld
kdc = my.ad.server.2.tld
admin_server = my.ad.server.1.tld
}
# ...
[domain_realm]
friendly.domain.tld = MY.DOMAIN.TLD
.friendly.domain.tld = MY.DOMAIN.TLD
# ...
Apache HTTP Web 服务器安装在 Debian GNU/Linux 10 上。
my.ad.server.1.tld
使用命令在 Windows Server上生成了 keytab 文件ktpass
。
使用此配置,域中 Windows 计算机上的 Edge 和 Firefox 上的一切均正常运行MY.DOMAIN.TLD
。
我的问题来自在域外的 Windows 机器上使用 Microsoft Edge(带有 Chromium 引擎的新版本)或 Google Chrome 的客户端。
第一次连接到 时my.server.tld
,浏览器会接收WWW-Authenticate: Negotiate
和WWW-Authenticate: Basic realm="SSO Authentication"
标头。
使用 Microsoft Edge 时,与 Firefox 不同的是,弹出的身份验证对话框WWW-Authenticate: Negotiate
不是来自浏览器的对话框,而是 Windows 身份验证对话框,而且无论我们输入什么,它都不起作用。
第一次登录尝试失败后,浏览器会发出第二次请求,这次它只接收标WWW-Authenticate: Basic realm="SSO Authentication"
头。浏览器身份验证对话框弹出,并且正常工作。进一步导航到内部my.server.tld
将在后台生成大量 Windows 身份验证对话框。例如,如果页面上有图像,它将显示该图像的身份验证对话框。
我注意到,如果 Windows 机器连接在内部网络中,MY.DOMAIN.TLD
并且我们在 Windows 身份验证对话框中明确指定域,它也可以正常工作(即[email protected]
作为用户名)。
考虑到以上所有问题,我现在想知道......
- 实际上是否可以使其与 Windows 机器上的集成 Windows 身份验证对话框一起工作?
- 有没有办法“强制”使用域进行身份验证,从而无需像
[email protected]
域外的机器那样明确指定它MY.DOMAIN.TLD
?
我已经尝试在 Kerberos 领域配置中添加内容或在 Debian GNU/Linux 10 服务器上default_domain = my.domain.tld
获取 Kerberos TGT,但没有成功。kinit
在每种情况下阅读 Apache HTTP 的日志LogLevel trace8
,似乎只要弹出 Windows 身份验证对话框,就会返回 NTLM 令牌,这使得它无法正常工作。
当它起作用时
随时随地使用 Firefox
或者
使用域内的计算机、内部网络(Edge 或 Chrome)
或者
使用域外、外部网络并使用[email protected]
(Edge 或 Chrome)的计算机:
mod_authz_core.c(820): AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
mod_authz_core.c(820): AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
src/mod_auth_kerb.c(1963): kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
src/mod_auth_kerb.c(1296): Acquiring creds for HTTP/my.server.tld
src/mod_auth_kerb.c(1719): Verifying client data using KRB5 GSS-API
src/mod_auth_kerb.c(1735): Client didn't delegate us their credential
src/mod_auth_kerb.c(1754): GSS-API token of length 180 bytes will be sent back
mod_authz_core.c(820): AH01626: authorization result of Require valid-user : granted
mod_authz_core.c(820): AH01626: authorization result of <RequireAny>: granted
当它不起作用时
使用域外的计算机、外部网络(Edge 或 Chrome):
mod_authz_core.c(820): AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
mod_authz_core.c(820): AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
src/mod_auth_kerb.c(1963): kerb_authenticate_user entered with user (NULL) and auth_type Kerberos
src/mod_auth_kerb.c(1296): Acquiring creds for HTTP/my.server.tld
src/mod_auth_kerb.c(1719): Verifying client data using KRB5 GSS-API
src/mod_auth_kerb.c(1735): Client didn't delegate us their credential
src/mod_auth_kerb.c(1763): Warning: received token seems to be NTLM, which isn't supported by the Kerberos module. Check your IE configuration.
src/mod_auth_kerb.c(1156): GSS-API major_status:00010000, minor_status:00000000
gss_accept_sec_context() failed: An unsupported mechanism was requested (, Unknown error)
令人恼火的是,它在 Firefox 上完美运行,但在使用最新 Chromium 引擎的浏览器上却不行。是因为它回退到 NTLM 身份验证而不是 Basic 身份验证吗?
答案1
我可能错了,但对我来说,导航器只向受信任的站点发送 Kerberos 凭据。因此,对于域中的计算机,它们的导航器将您的 Web 服务器视为“内部网”站点(= 受信任,= 可以发送凭据)。但对于其他计算机,您的 Web 服务器发出的凭据请求将被忽略。因此,也许通过在外部计算机的受信任站点中添加您的 Web 服务器的 FQDN 就可以解决问题?