Timeouts mit Apache/Windows/LDAP/Active Directory

Ich hatte eine ganze Zeit lang versucht ein Timeout-Problem bei einem Apache-Server zu analysieren. Das Muster sah folgendermaßen aus:

Bei jedem ersten Zugriff auf den Server fragte der Server sofort nach Benutzernamen und Passwort, danach wartete der Server exakt eine Minute bevor er die Antwort sendete.

Direkt darauffolgende Anfragen hat der Server sofort beantwortet. Nach einer gewissen Zeit, geschätzt irgendwas zwischen 5 und 15 Minuten, trat das Problem wieder auf.

Die Tatsache, dass die Wartezeit reproduzierbar exakt eine Minute war, klang für mich verdächtig nach einem Timeout. Wenn ich die Wartezeit abbrach (ESC drücken), und die Seite neu geladen habe, bekam ich sofort eine Antwort.

Da die Passwortabfrage des Servers sofort kam, konnte ich ein Problem beim SSL-Handshake, oder auch ein DNS-Problem ausschließen. Es machte keinen Unterschied, ob ich ein PHP-Script oder einfach nur eine txt-Datei abgerufen habe, also kam auch ein Problem mit den Scripten auf dem Server nicht in Frage. Ich nehme an das Ergebnis des Authentifizierungsprozesses wird für eine Weile gecached, so dass es für die nachfolgenden Anfragen nicht wieder nötig ist.

Weiterhin ist zu erwähnen, dass die Authentifizierung immer erfolgreich ist, also konnte ich auch ausschließen dass der Domain Controller einfach nicht antwortet.

Apache 2.4 läuft auf einem Windows Server 2012 R2. Er ist folgendermaßen für LDAP-Auth konfiguriert:

<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>

Wie man sehen kann habe ich verschiedene Verbindungsarten zum Domain Controller probiert, es hat keinen Unterschied gemacht welche Verschlüsselungsmethode ich verwendet habe, wenn überhaupt. ad.domain.de löst auf mehrere Domain Controller auf, aber das Verhalten ist das Gleiche wenn ich direkt zu einem bestimmten DC verbinde.

Im Error Log traten mit LogLevel info keine Fehler auf. Ich war nicht sonderlich scharf darauf das LogLevel auf debug zu erhöhen, da ich aus Erfahrung wusste dass das Unmengen von Einträgen erzeugt durch die man kaum durchblickt.

Nachdem ich dann nur für die Apache-Module authnz_ldap und ldap das LogLevel erhöht hatte erschien folgende Fehlermeldung im Error Log:

ldap_simple_bind() timed out on reused connection, dropped by firewall?

Die Fehlermeldung führte mich zu diesem mod_ldap Bugreport, der zwar von einer Fehlkonfiguration verursacht wurde, mich aber auf die richtige Spur brachte:

As reported elsewhere, windows closes an LDAP connection after 900 seconds, but the default Apache behavior appears to try to re-use the connection indefinitely. If Apache tries to re-use after windows has closed the connection, there’s a 60 second delay waiting for the connection to timeout […]

Ein paar schnelle Überprüfungen bestätigten das:

Der Standardwert von MaxConnIdleTime in den Microsoft LDAP Policies beträgt 900 Sekunden, was zu meiner Beobachtung passt, dass das Problem nach 15 Minuten wieder auftritt. Die Wartezeit von 60 Sekunden passt ebenfalls exakt zu meinem Problem.

Laut dem Fehlerbericht sollte das Problem zu beheben sein indem man die Einstellung LDAPConnectionPoolTTL auf einen Wert setzt, der niedriger ist als die
MaxConnIdleTime und einen anderen Wert als -1, aber das funktionierte bei mir nicht. Ich musste den Wert auf 0 setzen, was die Wiederverwendung von existierenden Verbindungen deaktiviert.

LDAPConnectionPoolTTL 0

Ich erwarte hier keine Performance-Einbußen, da das Ergebnis ohnehin gecached wird. Das Einzige, was ein Mysterium bleiben wird, ist warum das Problem nur bei dieser einen Apache-Instanz auftritt die unter Windows läuft, und nicht bei den Apache-Instanzen die unter Linux laufen.

Veröffentlicht von

Gerald

Diplom-Informatiker (DH) in Darmstadt. Ich blogge über Entwicklung, Internet, mobile Geräte und Virtualisierung. Meine Beiträge gibt es auch bei Google+ und Facebook.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.