Active Directory, LDAP und MediaWiki

Mir stellt sich momentan die Aufgabe, die MediaWiki-Software in unserem Intranet zu integrieren, weil von verschiedenen Stellen Bedarf nach einem Wiki gemeldet wurde. Selbstverständlich sieht die Geschichte mit Zugriffsrechten innerhalb eines Unternehmens immer anders aus als in der “freien Welt” und somit machte ich mich auf die Suche nach einer Möglichkeit.

Es war klar, dass MediaWiki zum Einsatz kommen soll, einfach aufgrund seiner Bekanntheit. Doch wie bringt man es nun dazu, Benutzer mit ihrem Windows-Account authentifizieren zu können? Eigentlich ganz einfach: Mit LDAP steht eine Schnittstelle zu dem bei meinem Arbeitgeber eingesetzten Microsoft Active Directory zur Verfügung. Doch der Teufel steckt im Detail…Nach kurzer Suche im Meta-Wiki bin ich auf den LDAP-Authentification-Patch für die aktuellen MediaWiki-Versionen gestoßen. Nach anfänglichen Schwierigkeiten mit den Konfigurationsbeispielen brachte ich schließlich immerhin die Funktion zum Laufen, dass der Login eines Benutzers im AD geprüft wird und sich der Benutzer bei korrektem Passwort erfolgreich einloggen kann. Die hierfür nötige Konfiguration lautet wie folgt:

[geshi lang=php]# LDAP Authentication patch
require_once( “includes/LdapAuthentication.php” );
$wgAuth = new LdapAuthenticationPlugin();
$wgLDAPDomainNames = array( “unseredomain” );
$wgLDAPServerNames = array( “unseredomain”=>”domaincontroller.unseredomain.firma.net” );
$wgLDAPSearchStrings = array( “unseredomain”=>”unseredomain\USER-NAME” ); //do not change “USER-NAME”!
$wgLDAPUseSSL = false; //not recommended but OK for testing
$wgLDAPUseLocal = false;
$wgMinimalPasswordLength = 1;
$wgLDAPRetrievePrefs = false;
$wgLDAPBaseDNs = array( “unseredomain”=>”dc=unseredomain,dc=firma,dc=net” );[/geshi]

Folgende Einstellungen sollte man noch vornehmen, um grundsätzlich ein Login der Benutzer zu erzwingen, zusammen mit ein bisschen Kosmetik (wir möchten keine IP bei anonymen Benutzern sehen!):
[geshi lang=php]# This snippet prevents new registrations from anonymous users
# (Sysops can still create user accounts)
$wgGroupPermissions[‘*’][‘createaccount’] = false;

# This snippet prevents editing from anonymous users
$wgGroupPermissions[‘*’][‘edit’] = false;

#$wgWhitelistRead = array( “Main Page”, “Special:Userlogin”, “-“, “MediaWiki:Monobook.css” );
$wgWhitelistRead = array( “Hauptseite”, “Spezial:Userlogin”, “-“, “MediaWiki:Monobook.css” );
$wgGroupPermissions[‘*’][‘read’] = false;

# remove IP display in header for non logged-in users
$wgShowIPinHeader = false; # For non-logged in users [/geshi]

Das war allerdings nicht genug. Die Anforderungen besagen, dass es nur bestimmten Benutzern ermöglicht werden soll, auf das jeweilige Wiki zuzugreifen. Bei einem vorhandenen Active Directory kann man dies natürlich wunderbar über eine Gruppe abbilden. Ich habe nun die vergangenen Tage mehrmals die Dokumentation (hier auch) und die Diskussionsseiten gewälzt und sämtliche Parameter durchprobiert – immer ohne Erfolg.

Als kleines Nebenprodukt ist dabei unter Verwendung der Klasse adLDAP ein PHP-Skript enstanden, mit der wir uns nun webbasiert sämtliche wichtigen Infos zu einem Benutzer oder einer Gruppe ausgeben lassen können. Immerhin hatte ich mittlerweile die doch relativ wilde Struktur des AD verinnerlicht, auch dank einer gewohnt guten Präsentation von Kris Köhntopp.

Mir blieb nichts anderes übrig, als den Code step-by-step durchzugehen und nachzuvollziehen, was genau passiert. Herausgekommen ist folgender Patch für die LdapAuthentication.php (1.0g):
[geshi lang=diff]42a43,44
> # Changed by Fabian Fischer (ff@nodomain.cc) to really work with our
> # Active Directory, 24.08.2006 (see LocalSettings.php for configuration!)
754,756c756,761
< if ( in_array( $group, $reqgroups ) ) { < $this->printDebug(“Found user in a group.”,1);
< return true; --- > //case-insensitive search
> foreach ($reqgroups as $item) {
> if (strtolower($item) == $group) {
> $this->printDebug(“Found user in a group.”,1);
> return true;
> }
848,849c853,854
< foreach ($info as $i) { < $mem = strtolower($i['dn']); --- > foreach ($info[0][‘memberof’] as $i) {
> $mem = strtolower($i);
852c857,858
< --- > array_shift($groups);
>[/geshi]

Mit diesen Parametern in der LocalSettings.php bin ich nun endlich in der Lage, definierte Gruppen auf das Wiki zu berechtigen:
[geshi lang=php]# groups
$wgLDAPRequiredGroups = array( “unseredomain”=>array(“CN=WIKIGRUPPE,OU=Group,DC=unseredomain,DC=firma,DC=net”) );
$wgLDAPGroupUseFullDN = array( “unseredomain”=>false );
$wgLDAPGroupObjectclass = array( “unseredomain”=>”*” );
$wgLDAPGroupAttribute = array( “unseredomain”=>”samaccountname” );
$wgLDAPGroupSearchNestedGroups = array( “unseredomain”=>false );
[/geshi]

Ich hoffe, dass dieser Beitrag etwaigen Leidensgenossen helfen wird 🙂
Eine Übersetzung ins Englische sowie Veröffentlichung im Metawiki folgen in Kürze…

Leave a Reply

Your email address will not be published. Required fields are marked *

11 comments

  1. Danke, dein Beitrag het mir sehr geholfen, die LDAP-Authentifizierung einzubauen.

    Zusätzlich versuche ich es noch auf die Kette zu bekommen, dass die User sich einmal an der Domäne authentifizieren (wenn sich die User am System anmelden) und dann sofort automatisch im Wiki angemeldet sind. Also ohne nochmal Benutzername und Passwort zu tippseln.

    Hast du vielleicht ne Idee, wie das funktionieren könnte?

  2. Hi,

    das freut mich 🙂

    Das was du vorhast müsste prinzipiell mit mod_auth_ntlm (o.ä.) machbar sein, ich habe damit allerdings noch nicht experimentiert.

    Evtl. baue ich das aber in der mir vorliegenden Testinstallation noch mit ein.

  3. Hi Fabian,

    habe die Implementierung des Patches soeben ausprobiert, irgendwie tut sich aber nix. Magst du mir evtl. helfen? Hier nochmal meine Vorgehensweise:

    MediaWiki 1.71 installiert

    LdapAuthentication.php (1.0g) von deiner Seite runtergeladen, nach includes kopiert

    Folgende Zeilen in die LocalSettings.php eingefügt:

    require_once( “includes/LdapAuthentication.php” );
    $wgAuth = new LdapAuthenticationPlugin();
    $wgLDAPDomainNames = array( “test.de” );
    $wgLDAPServerNames = array( “test.de”=>”dcf01.test.de dcf02.test.de” );
    $wgLDAPSearchStrings = array( “test.de”=>”test.deUSER-NAME” ); //do not change “USER-NAME”!
    $wgLDAPUseSSL = false; //not recommended but OK for testing
    $wgLDAPUseLocal = false; $wgMinimalPasswordLength = 1;
    $wgLDAPRetrievePrefs = false;
    $wgLDAPBaseDNs = array( “test.de”=>”dc=test,dc=net” );

    # Berechtigung für die Gruppe TestWiki
    $wgLDAPRequiredGroups = array( “test.de”=>array(“CN=TestWiki,OU=Group,DC=test,DC=net”) );
    $wgLDAPGroupUseFullDN = array( “test.de”=>false );
    $wgLDAPGroupObjectclass = array( “test.de”=>”*” );
    $wgLDAPGroupAttribute = array( “test.de”=>”samaccountname” );
    $wgLDAPGroupSearchNestedGroups = array( “test.de”=>false );

    Ist das so in Ordnung oder habe ich etwas übersehen?

    Grüße,
    nec

  4. Hast du die Zeilen gepatched wie von mir angegeben?

    Probier mal folgendes in der LocalSettings.php, dann wirds etwas gesprächiger:

    # debug
    $wgLDAPDebug = 99;

    HTH

  5. Nein – ich komme mit den Zahlen nicht zurecht, was bedeuten die? Und was sagen die Farben aus? Blau ist neu und muss hinzugefügt werden und rot ist bereits vorhanden?

    Das Einfügen der Debug-Zeile in die LocalSettings.php bringt nichts, es wird genau wie vorher einfach das Wiki ohne Abfrage angezeigt.

    Grüße,
    nec

  6. Hi Fabian,

    nun funktionierts! Ein Kollege von mir hat sichs kurz angesehen und korrigiert. Und zwar muss bei uns anstatt

    $wgLDAPRequiredGroups = array(
    “test.net”=>array(“CN=TestGruppe,OU=Users,DC=test,DC=net”) );

    folgendes eingetragen werden:

    $wgLDAPRequiredGroups = array(
    “test.net”=>array(“CN=TestGruppe,cn=Users,DC=test,DC=net”) );

    Vielen Dank für deine Mühe!
    nec

    P.S: Meinen vorherigen Eintrag kannst du ja nun getrost rausnehmen 😉

  7. Hast Du die NTLM-Authentifizierung hinbekommen? Ich grüble immer noch darüber nach und irgendwie will es nicht. Die Anmeldung über das AD haut hin, aber die automatische Anmeldung will nicht.

  8. Hi, nein, mittlerweile wird das über mod_ntlm2 gemacht und das funktioniert auch ganz gut. Wie die Unterstützung von mehreren Domains aussieht kann ich allerdings noch nicht beurteilen.

  9. hallo,

    ich stehe von dem selber problem wie du einst, dass ich eine ad gruppe auf mein wiki berechtigen möchte. leider bin ich mir nicht sicher wo ich die änderungen in der LDAPAuthentication.php eintagen soll, damit dein kleiner patch aktiv wird und ich die optionen über die localsettings.php nutzen kann.

    wäre klasse, wenn du das kurz beschreiben könntest.

    danke und viele grüße
    feidi

  10. Servus zusammen,

    habe mich jetzt auch mal ein wenig mit der Materie beschäftigt
    und muss sagen, dass mir die Zugriffssteuerung per Policy etwas
    zu “undurchschaubar” erscheint. Die Anmeldung an den AD funktioniert wunderbar allerdings habe ich es einfach nicht hinbekommen, dass sich das Modul entsprechende GPO zieht.

    In unserer Firma unterscheiden wir (zum Glück) nur zwischen 2 Gruppen; diejenigen die lesen,schreiben etc können und diejenigen, denen wir das Wiki nur lesend zur Verfügung stellen.
    Natürlich soll man sich vorher am System anmelden, damit nicht jeder auf die enthaltenen Informationen zugreifen kann.
    Nun zur Lösung:

    Benutzeranmeldung Über LDAP (funktioniert prima).
    Gruppenrichtlinien über Extension:GroupPermissionsManager (installieren versteht sich).
    Damit kann man sich durch eine Weboberfläche seine eigenen Gruppen erstellen, denen man dann Rechte zuweisen kann.
    Auf der Seite Spezial:Benutzerrechte kann man dann einen Benutzer in diese neue Gruppe packen.
    Achtung: um dies zu können muss man vorerst der Gruppe “user”
    die Berechtigung $wgGroupPermissions[‘user’][‘grouppermissions’] = true; geben.

    Danach legt man die Gruppen an, weist den Benutzer seine Gruppen zu und entfernt wieder die Berechtigung.
    $wgGroupPermissions[‘user’][‘grouppermissions’] = false;

    2. Achtung:
    Mit der Extension:GroupPermissionsManager muss man im Verzeichnis
    $IP/extensions/GroupPermissionsManager/ ein Verzeichnis /config anlegen, sonst bekommt man eine Fehlermeldung.
    In dem Verzeichnis /config befinden sich dann die Benutzer-
    berechtigungen, die man auch manuell nachtragen kann.

    Ich hoffe für den einen oder anderen ist dieser Tipp wenigstens ein bisschen hilfreich.
    .Gruß Vale

  11. Hallo Fabian,

    Ich muss mich auch damit beschäftigen, wie die Authentifizierung vom Wiki durch die Anmeldung im System ins Wiki eingebunden werden muss.

    Ich habe mir einfach mal deinen CodeBlock 1:1 übernommen und eingefügt.
    Allerdings hab ich keine Ahnung, ob alles soweit funktioniert. Ich kann die Seiten sehen und bearbeiten…

    Das Wiki habe ich derzeit ersteinmal LOKAL auf meinem Rechner installiert.

    Gruß Mario

  12. Hallo zusammen,

    ich weiß, dass dieser Thread schon etwas betagter ist, aber ich versuche trotzdem mein Glück.

    Ich bin derzeit dabei, bei meinem Mediawiki das LDAP – Plugin (http://www.mediawiki.org/wiki/Extension:LDAP_Authentication) einzubinden. Das Einbinden hat soweit bisher auch geklappt und Benutzer können sich (zur Zeit noch alle) anmelden. Nun will ich aber Benutzer ausschließen, welche einen bestimmten Wert/Eigenschaft im LDAP nicht haben. Hat jemand eine Idee, wie ich einen solchen Filter erstelle / konfiguriere? Oben ist mEn nur das Filtern nach Gruppen beschrieben?

    Vielen Dank für die Hilfe