web-dev-qa-db-ja.com

ApacheでLDAP認証を使用してタイムアウトをデバッグする

私は、Apacheで発生しているタイムアウトの問題をデバッグしようとしています。

パターンは次のようになります。

新しいセッションの最初のリクエストごとに(または最後のリクエストの後しばらくすると)、ブラウザは資格情報を即座に要求し、基本認証でリクエストを送信します。その後、サーバーは結果を送信する前に正確に1分間待機します。

enter image description here

後続のリクエストは即座に応答されます。これは、しばらくしてからのリクエストに対してのみ発生します(まだ正確に特定できませんでした、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 "[email protected]"
    AuthLDAPBindPassword "secret"
    Require valid-user
    Require all denied
</Location>

ご覧のとおり、ドメインコントローラーに対してさまざまな接続の種類を試しましたが、どの暗号化方法を使用するか、または暗号化を渡すかどうかは問題ではないようです。

ad.domain.deは複数のドメインコントローラーに解決されますが、特定のDCに接続した場合の動作は同じです。

LogLevel infoのエラーログにエントリがありません。生成されたデバッグ情報を選別するのに問題があることが経験からわかっているので、それをdebugに増やすのはまだためらっています。

問題をデバッグするためにまだ見逃したことはありますか、それともデバッグレベルのロギングを実行する必要がありますか?

5

モジュールauthnz_ldapおよびldapのログレベルを上げた後、次のエラーメッセージがエラーログに表示されました。

ldap_simple_bind()は、再利用された接続でタイムアウトになり、ファイアウォールによってドロップされましたか?

これが this mod_ldap bug report につながり、構成エラーであることが判明しましたが、実際の問題を指摘しました。

別の場所で報告されているように、Windowsは900秒後にLDAP接続を閉じますが、Apacheのデフォルトの動作では、接続を無期限に再利用しようとするように見えます。ウィンドウが接続を閉じた後にApacheが再利用を試みる場合、接続がタイムアウトするのを待つ60秒の遅延があります[...]

これを確認するためにいくつかの簡単なチェックを行います:

MaxConnIdleTime in the Microsoft LDAP Policies のデフォルト値は900秒です。これは、問題が15分後に再び現れるという私の観察と一致します。 60秒の遅延も私の問題と完全に一致します。

そのエラーレポートによると、この問題は LDAPConnectionPoolTTLMaxConnIdleTimeよりも低く、デフォルト値-1以外の値に設定することで解決する必要がありますが、解決されませんでした私のために働きます。値を0に設定して、既存の接続の再利用を無効にする必要がありました。

LDAPConnectionPoolTTL 0

LDAPの結果はとにかくキャッシュされるため、これでパフォーマンスの問題が発生することはないと思います。

謎が残っているのは、この問題がWindowsで実行されているApacheインスタンスでのみ発生し、Linuxで実行されているApacheインスタンスでは発生しない理由です。

3