帶有 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/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.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 身份驗證對話框中明確指定域,它也可以正常工作(即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,它會成功嗎?