以下是 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 服务器上使用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
?
我已经尝试default_domain = my.domain.tld
在 Kerberos 领域配置中添加或kinit
在 Debian GNU/Linux 10 服务器上获取 Kerberos TGT,但均未成功。
在每种情况下读取 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 身份验证而不是基本身份验证吗?
我可能错了,但对我来说,导航器只将 Kerberos 凭据发送到受信任的站点。因此,对于域中的计算机,它们的导航器将您的网络服务器视为“内部网”站点(= 受信任,= 可以发送凭据)。但对于其他人,您的网络服务器发出的凭据请求将被丢弃。那么,也许通过在外部计算机的受信任站点中添加您的网络服务器的 FQDN,它会成功吗?