带有 Kerberos 的 Apache HTTP 无法与域外计算机上的 Chromium 驱动的导航器配合使用

带有 Kerberos 的 Apache HTTP 无法与域外计算机上的 Chromium 驱动的导航器配合使用

以下是 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: NegotiateWWW-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 就可以解决问题?

相关内容