QVINTVS · SCRIBET

Redmine LDAP über STARTTLS beibringen

Redmine kann von Haus aus gegen einen LDAP-Server authentifizieren, sogar mit LDAPS. Nur leider nicht über STARTTLS, was man jedoch mit einem kleinen Kniff ändern kann.

Das Ticket- und Projektverwaltungssystem Redmine unterstützt die Authenfizierung seiner Nutzer sowohl gegen die lokale Datenbank als auch gegen einen zentralen LDAP-Server, wobei letzterer auch über LDAPS, also LDAP über SSL, angebunden sein kann (Seite im Redmine-Wiki). Seit einiger Zeit jedoch gibt es verstärkt einen Drang, Diensten wieder nur einen einzelnen Port zuzuweisen; so ist etwa der Port für SMTPS, 465, heute kaum mehr in Gebrauch, sondern ist durch den klassischen Port 25 wieder abgelöst worden, auf dem die Sitzung zunächst als klassische unverschlüsselte Verbindung beginnt, welche dann durch den STARTTLS-Befehl in eine verschlüsselte überführt wird.

Dieses Vorgehen ist auch bei LDAP möglich und ich setze es bei meinem LDAP-Server ein, d.h. der LDAP-Server lauscht ausschließlich auf dem klassischen LDAP-Port 389, und nicht auch auf 636. Dafür versteht er das STARTTLS-Kommando. Nun ist es aber leider so, dass Redmine diese Variante des LDAP-Protokolls nicht von Haus aus unterstützt, obwohl die zugrundeliegende Programmbibliothek net-ldap dazu sehr wohl in der Lage ist. Es fehlt allein am Interface. Der dazugehörige Bugreport schlummert seit Jahren vor sich hin, eine Besserung ist nicht absehbar. Mittlerweile gibt es aber einen Workaround, der ebenso einfach wie effektiv ist: In der Datei app/models/auth_source_ldap.rb werden die Zeilen

options = { :host => self.host,
            :port => self.port,
            :encryption => (self.tls ? :simple_tls : nil)
          }

ersetzt durch:

options = { :host => self.host,
            :port => self.port,
            :encryption => (self.tls ? :start_tls : nil)
          }                          # ^^^^^^^^^^

Das führt dazu, dass eine im Redmine-Interface als LDAPS-Verbindung angelegte Authentifizierungsmethode statt über LDAPS über LDAP mit STARTTLS geführt wird. Es empfiehlt sich insofern auch, in der Konfiguration die Portnummer nunmehr explizit mit 389 anzugeben, sodass nicht die Standardportnummer von LDAPS, 636, benutzt wird.

Dieser Trick ist zwar einfach und effektiv, führt aber zum Verlust der Authentifizierungsmöglichkeit über LDAPS. Für kleinere Installationen, die nur gegen einen LDAP-Server authentifizieren, sollte das kein Problem darstellen. Es ist aber zurzeit unmöglich, eine Authentifizierungsmethode mit LDAP+STARTTLS und eine andere mit LDAPS anzulegen. Dies erfordert umfangreichere Änderungen am Code von Redmine. Man sollte daher das Ticket im Redmine-Tracker im Auge behalten, denn sobald das dort beschriebene Problem behoben ist, wird der hier vorgestellte Workaround entfallen und durch eine ordentliche Konfiguration ersetzt werden können.

Hinweis: Dieser Artikel bezieht sich auf Redmine >= 3.0.0. Er trifft auch noch auf Redmine 3.1.0 zu, für andere Versionen mag anderes gelten.

Valete.