Active-Directory

在 apache 上使用 ldap auth 調試超時

  • May 16, 2019

幾個月來,我一直在嘗試調試 Apache 的超時問題。

該模式如下所示:

在新會話的每個第一個請求(或在最後一個請求之後的一段時間後)瀏覽器會立即要求提供憑據,然後使用基本身份驗證發送請求。然後伺服器在發送結果之前正好等待 1 分鐘。

在此處輸入圖像描述

隨後的請求會立即得到答复,這只發生在一段時間後的請求(尚無法準確定位,在 5 到 15 分鐘之間)。

等待時間可精確重現 60 秒這一事實對我來說就像是超時。如果我取消請求並點擊重新載入,我會立即獲得請求的 URL。

由於密碼提示也會立即出現,我可以排除客戶端和伺服器之間的 SSL 握手問題,或者那條腿上的 DNS 問題。如果我請求 PHP 腳本或空白文本文件並不重要,這也排除了伺服器上的腳本問題。我猜驗證過程的結果會被記憶體一段時間,因此後續請求不需要它。

請注意,身份驗證總是成功的,所以我也可以排除“域控制器沒有回答”的問題。

Apache 2.4 在 Windows Server 2012 R2 上執行。它是為 LDAP 身份驗證配置的:

<Location />
   AuthType Basic
   AuthName "AD Login"
   AuthBasicProvider ldap
   LDAPReferrals Off
   #AuthLDAPUrl ldap://dc01.domain.de:3268/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*)
   #AuthLDAPUrl ldap://ad.domain.de:389/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*) STARTTLS
   AuthLDAPUrl ldap://ad.domain.de:389/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*) TLS
   AuthLDAPBindDN "service@domain.de"
   AuthLDAPBindPassword "secret"
   Require valid-user
   Require all denied
</Location>

如您所見,我嘗試了與域控制器的不同連接類型,我使用哪種加密方法似乎並不重要,或者我是否傳遞加密。

ad.domain.de 解析到多個域控制器,但如果我連接到特定的 DC,行為是相同的。

錯誤日誌中沒有條目LogLevel info,我還在猶豫是否將其增加到debug,因為我從經驗中知道我無法篩選生成的調試資訊。

有什麼我錯過的東西可以用來調試問題,還是我必須通過調試級別日誌記錄?

增加模組的日誌級別後authnz_ldapldap錯誤日誌中出現以下錯誤消息:

ldap_simple_bind() 在重用連接上超時,被防火牆丟棄?

這讓我看到了這個 mod_ldap 錯誤報告,雖然結果是配置錯誤,但它指出了實際問題:

正如其他地方報導的那樣,Windows 會在 900 秒後關閉 LDAP 連接,但預設的 Apache 行為似乎試圖無限期地重用該連接。如果 Apache 在 windows 關閉連接後嘗試重新使用,則等待連接超時有 60 秒的延遲

$$ … $$

進行一些快速檢查以確認這一點:

MaxConnIdleTimeMicrosoft LDAP Policies 中的預設值為900 秒,這與我的觀察結果相符,即 15 分鐘後問題再次出現。60 秒的延遲也完全符合我的問題。

根據該錯誤報告,應該通過將LDAPConnectionPoolTTL值設置為低於MaxConnIdleTime預設值 -1 的值來解決問題,但這對我不起作用。我必須將值設置為0,禁用現有連接的重用。

LDAPConnectionPoolTTL 0

我預計不會有任何性能問題,因為無論如何都會記憶體 ldap 結果。

唯一仍然是一個謎是為什麼這個問題只發生在我們在 Windows 上執行的 Apache 實例上,而不是在 Linux 上執行的 Apache 實例上。

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