Authentication

帶有 Kerberos 的 Apache HTTP 不能在域外的機器上使用 Chromium 驅動的導航器

  • September 3, 2021

以下是 Apache HTTP Kerberos 模組配置/etc/apache2/sites-available/my.server.tld.conf

# ...
<Location />
 Authname "SSO Authentication"
 AuthType Kerberos
 KrbAuthRealms MY.DOMAIN.TLD
 KrbServiceName HTTP/my.server.tld@MY.DOMAIN.TLD
 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.tldWindows 伺服器上使用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 身份驗證對話框中明確指定域,它也可以正常工作(即my-user@my.domain.tld作為使用者名)。

考慮到以上所有,我現在想知道…

  • 是否真的可以使其與 Windows 機器上的集成 Windows 身份驗證對話框一起使用?
  • 有沒有辦法“強制”域用於身份驗證,以消除像my-user@my.domain.tld域外機器一樣明確指定它的需要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)

使用域外的電腦、外部網路並使用my-user@my.domain.tld(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,它會成功嗎?

引用自:https://serverfault.com/questions/1075721