Wie man sich mit Hilfe von Apache Trac mit dem Active Directory verbindet

Nach langer Überlegungsphase habe ich heute endlich mal den Schritt gewagt und Trac mit dem Active Directory verbunden. Alle Benutzer, die sich an Trac anmelden, werden im AD authentiziert und autorisiert.

Allerdings benutze ich dafür nicht LdapPlugin , sondern AccountManagerPlugin (AMP).

AMP ruft, nachdem Benutzername und Passwort in der Trac-Seite eingegeben worden, eine beliebig definierbare Adresse auf und überprüft, ob der Webserver einen 200er- oder 401er-Statuscode zurückgibt. Das komplette Plugin ist nicht mehr als 30 Zeilen lang.

Zuerst muss AMP installiert werden, danach müssen in der trac.ini des Projekts folgende Optionen gesetzt werden:


[components]
trac.web.auth.LoginModule = disabled
acct_mgr.http.HttpAuthStore = enabled
acct_mgr.web_ui.LoginModule = enabled
acct_mgr.web_ui.RegistrationModule = disabled
acct_mgr.htfile.HtPasswdStore = disabled
acct_mgr.admin.AccountManagerAdminPage = enabled
acct_mgr.web_ui.AccountModule = enabled

[account-manager]
authentication_url = $HOST$/$SUBURL$
password_store = HttpAuthStore

$URL$ wird durch die URL ersetzt, die vom Apache überprüft werden soll.

Die httpd.conf (oder $VHOST$.conf) muss so abgeändert werden:

# Benötigte Module laden
LoadModule auth_module modules/mod_auth.so
LoadModule ldap_module modules/util_ldap.so
LoadModule auth_ldap_module modules/mod_auth_ldap.so

SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir c:/server/trac
PythonOption TracUriRoot /trac

AuthType Basic
AuthName "Trac Active Directory"
AuthLDAPURL "ldap://domaincontroller.domain.local:389/OU=$OU$,DC=$DOMAIN$,DC=local?sAMAccountName?sub?(objectClass=user)"
AuthLDAPBindDN "$LDAP-BENUTZER$@$DOMAIN$.local"
AuthLDAPBindPassword "$PASSWORT$"
authldapauthoritative Off
require group CN=Trac-Gruppe,DC=$DOMAIN$,DC=local

Der obige Code stammt aus einem unserer Virtual-Hosts und muss natürlich entsprechend eurer Umgebung angepasst werden.

Wichtig ist, dass $SUBURL$ auf eine bestehende Datei im DocumentRoot liegt, diese kann leer sein. Außerdem darf die Trac-Instanz nicht direkt über “/” zu erreichen sein, da sonst die $SUBURL$ durch den Python-Handler verwaltet wird.

Das obige Beispiel benutzt kein SSL. $DOMAIN$ muss durch die Domäne ersetzt werden, $LDAP-BENUTZER$ entspricht einem Benutzer, der im Active Directory existiert und $PASSWORT$ entspricht … naja dem Passwort halt.

Das Binden ist nötig, da Windows (2003) von Haus aus keine anonymen Zugriffe erlaubt.

Nun muss im Active Directory eine neue Sicherheitsgruppe mit dem Namen “Trac-Gruppe” erstellt werden, in der die erlaubten Benutzer eingetragen werden.

Das war es eigentlich auch schon.

Zur Fehleranalyse ist es sinnvoll, im Apache den LogLevel auf “debug” zu setzen und zu schauen, dass der Apache sich auch wirklich mit dem Active Directory verbinden kann, d.h. die Binding-Credentials in Ordnung sind.

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>