Individuelle, geschützte und dynamisch erstellte SVN-Repositories

facesDas Problem: Es sollen individuelle SVN Verzeichnisse erstellt werden. Ein Bereich also, in dem eine Person beliebig viele Repositories erstellen kann, die nur von ihr selbst angesehen und bearbeitet werden können. Mann könnte jetzt meinen – vorallem mit viel jugendlichem Leichtsinn – das sei ein einfaches, allgemein bekanntes Problem. Pustekuchen! Das muss ein ganz fremder wohl ganz abstruser Wunsch sein.

Verschiedene Dinge schränken die Chance ein, eine einigermassen vernünftige und allgemeine Lösung zu finden 🙁 .Doch der Reihe nach. Was ist gegeben:

  • Ein wunderbarer Server, mit SSL und allem.
  • Das Einrichten eines neuen Users sollte ungefähr 0,01 Sekunden menschlicher Arbeitskraft bedürfen.
  • Die Benutzer sind in einem Active Directory gespeichert.
  • Apache2, PHP, und alles was man will ist installiert.

Einschränkende Dinge

Die grösste Peinlichkeit ist die Direktive SVNParentPath (von mod_dav_svn). An sich sollte die Direktive ein Basisverzeichnis für die SVN-Repositories angeben aber:

  • Der Parameter (das Verzeichnis) ist absolut undynamisch. Er nimmt keine Umgebungsvariable, Regexp oder sonst was, sondern ganz stur nur einen festen Pfad.
  • Kann nicht in einer .htaccess Datei gesetzt werden

Gna! Das ist echt 2002! So wird das nichts mit dynamisch erstellten SVN-Verzeichnissen. Aus reinem Masochismus hane ich verschiedene Lösungen wie mod_rewrite, symbolischen Links, LocationMatch und alles was sonst noch so Zeit kostet ausprobiert. Keine Chance…
Erschwerend hinzu kommt, dass sich SVN überhaupt nicht mit der Alias Direktive anfreunden kann und konsistent stur auf eine jungfräuliche Location beharrt: Der Versuch wird mit einem Repository moved permanently, please relocate belohnt.

Die Krönung: mod_authz_path

mod_authz_path klingt vielversprechend. An Hand des Pfades sollte der User und das Realm festgelegt werden können. Jaaa, aber nicht als Location, sondern nur als Pfad (<Directory> im Apache), wie man mit dem Debuggen feststellen kann:

AuthNamePathMatch (.+) "Persoenliches SVN $1"
AuthzUserPathMatch (.+) $1

Mit dem Pfad findet sich aber – wie schon weiter oben geflucht – das SVN nicht zurecht.

Ganz nebenbei hat mich dieses Modul etwa viertausend Stunden gekostet. Wenn es geladen wird, funktioniert authnz_ldap nicht mehr richtig. Nicht überhaupt nicht, sondern einfach das require Statement spielt verrückt und verhält sich unberechenbar. Nach langer Zeit habe ich dann das auch gemerkt :irre: . Aber erst nachdem ich unter viel Wehklagen in einer Panik die anderen Server getestet habe, ob die Authentifizierung dort auch nur scheinbar funktioniert.

Die Lösung

Nach ein paar Jahren die Lösung: Gutes, altes PHP.

Auf dem SSL-Port des Servers ist eine Website, auf der sich die User mal als erstes über Apache am Active Directory authentifizieren müssen. Dadurch habe ich Zugriff auf den Benutzername mittels $_SERVER['AUTHENTICATE_SAMACCOUNTNAME']. Loggt sich jemand ein den wir noch nicht kennen, dann:

  1. Wird der svn-Grundpfad erstellt, wenn er noch nicht existiert.
  2. Wird eine Apache-Konfiguration für diesen neuen Grundpfad erstellt, die das ParentPath und den entsprechenden User beinhaltet.
  3. Wird Apache neu gestartet → und der Benutzer währenddessen zum Warten gebracht. Das ist leider notwendig zum Einlesen der Konfigurationserweiterung.

Die neue Konfigurationsdatei wird „lokal“ erstellt und in der Grundkonfiguration /etc/apache2/sites-available/isvn.myhost.ch eingebunden:

        Include /data/www/isvn.myhost.ch/config/svn.conf

PHP Code für die neuen Benutzer:

  $svn_user=strtolower($_SERVER['AUTHENTICATE_SAMACCOUNTNAME']);
  if(!$svn_user) { echo "Hacker, you will be disintegrated!"; exit(1); }
  $svn_root=SVNROOT."/".$svn_user;
  if(!is_dir($svn_root)) { // NEW USER
        // Make svn Parent Path
        mkdir($svn_root);
        // Write Config
        $fh = fopen(SVNCONF, 'a') or die("can't open file");
        $svnDirective =<<<EOD

<Location /svn/lp/$svn_user>
        DAV svn
        SVNParentPath /data/svn/lp/$svn_user
        AuthName "Persoenliches SVN von $svn_user"
        AuthType Basic
        AuthBasicProvider ldap
        AuthLDAPBindDN ldapanonymous@myhost.local
        AuthLDAPBindPassword g3h31M3Sp+
        AuthLDAPUrl ldap://adc1.myhost.local/ou=Accounts,dc=myhost,dc=local?sAMAccountName?sub
        require ldap-user $svn_user
</Location>

EOD
;
        fwrite($fh, $svnDirective);
        fclose($fh);

        // Make th User wait
        echo "<html><head><title>SVN wird eingerichtet</title>\n";
        echo '<meta http-equiv="refresh" content="5; URL=https://isvn.myhost.ch">'."\n";
        echo "</head><body>".implode(" ", explode(".",$_SERVER['AUTHENTICATE_SAMACCOUNTNAME'])).": Ihr SVN Grundverzeichnis wird erstellt. Bitte warten Sie.</body></html>";

        // Restart Apache
        exec('echo "/usr/bin/sudo /etc/init.d/apache2 restart" | /usr/bin/at now');
        exit();
  }

Damit der User www-data den Apache restarten darf, muss ihm das per /etc/sudoers erlaubt werden:

www-data ALL=NOPASSWD: /etc/init.d/apache2

Dass die Berechtigungen auch für alle benötigten Zusatzdateien reichen, machen wir den Trick mit dem at.

Somit haben wir also eine hochindividuelle Konfigurationsdatei für alle User und Ihr SVN Grundverzeichnis. Die PHP-Seite ermöglicht es, SVN-Repositories anzulegen und zeigt auch gerade den annektierten Platz an:

Die SVN-Steuerkonsole

Die SVN-Steuerkonsole

Die Quellen

Hier sind die PHP-Quellen. Für weitere Details stehe ich gerne zur Verfügung.

CMS? Erschlag mich!

Der Auftrag

desperateIch möchte für die Website www.oncode.info ein schnuggeliges opensource CMS, das mir ermöglicht, meinen abgesonderten Code irgendwie halbwegs schön zu präsentieren und zum Download anzubieten. Als besondere Extremhürde würde ich zusätzlich gerne den RSS-Feed dieses Blogs anzeigen und irgendein schönes Design übernehmen, da ich die Fähigkeit habe, alles hässlich aussehen zu lassen wenn ich es selbst in die Hand nehme. In Java hingegen möcht ichs nicht, da Tomcat mich nicht mag…

Die Ausführung

Das kann doch nicht so schwer sein! hat sichs gedacht, obwohl mans doch besser weiss. Xoops kenne ich schon und mit Typo3 habe ich auch schon Erfahrungen gesammelt, was Neues sollts schon sein irgendwie. Bei opensourcecms kann man verschiedene OSS CMS ausprobieren (genial! Mit Adminfrontend!) und bei cmsmatrix können ebendiese verglichen werden. Es scheinen also auch schon andere arme Kerle mit diesem Problem konfrontiert worden zu sein. Obwohl Joomla! unterschiedlich gute Schlagzeilen macht, hat es auf den ersten Blick doch gut und vielseitig ausgesehen. Nundenn: Fröhlich eingerichtet, ein Template gesucht und installiert. Das erste Template ging nicht, weil es irgendeine %#*(/+ Sublib brauchte. Ich wollte nicht die nächsten 24 Stunden wirklich nicht mit Suchen verbringen und so habe ich wohl oder übel die zweite Wahl eingesetzt. In dieser zweiten Wahl hatte es ein wunderbares Bildchen, das ich natürlich in liebevoller Kleinarbeit angepasst und verschandelt habe. Tja, nach dem ersten mal herumschrauben im Adminpanel ist es dann leider – wohl von sich selbst angewiedert – verschwunden… Nunja, ok. Man kann in ebendiesem Adminpanel RSS-Feed-URLs eintippen: Hab ich gemacht, aber darstellen ist nicht… Nunja. Ich lade dann halt mal ein Modul herunter und installiere es mit dem Installer. Es erscheint, aber nur genügend lange bis ich es konfigurieren konnte. Danach verschwindet es (wohl zum hässlichen Bildchen) und meine Website wird nur noch halb angezeigt, ohne Fehlermeldung, (sogar im Debug-Modus)… Wahrscheinlich die Rache des J’s im Namen des RSS Aggregatormoduls. Das hat mir gereicht: Ich bin zu dumm… Bin ich schon raus oder was?

Auch von PHPWCMS hört man viel Gutes. Dass aber im Titel der Dokumentationsseite eine Art HTML-Tags dargestellt werden, hat mich doch eher abgeschreckt… Nunja, wahrscheinlich ist es ein designerisches Mittel und absichtlich, aber ich hab auch echt keine Nerven dafür das herauszufinden nach dem Joomla!-Debakel… AddOns gibt es leider auch noch nicht viele… PHPWCMS ist wirklich gut und hat sich im Einsatz bewährt, für mich scheints aber nicht zu sein…

Dritter Versuch: e107. Geiler Name, schöne Site, viele Erweiterungen, aber leider ist die Theme-Site nicht erreichbar. Nunja, vielleicht kommt sie ja wieder (nachdem sie sich mit dem hässlichen Bild und dem J-Aggregatormodul genügend unterhalten hat), aber nachdem ich auf der Pluginsite eine Entschuldigung für die lange Downtime gelesen habe, hats mir gereicht. (Ok, ich gebs zu, viel geschlafen habe ich in letzter Zeit nicht, darum bin ich auch nicht so geduldig, aber das ist eine GANZ andere Geschichte 🙂 ).

Naja, dann suche ich halt mal weiter… Die Verlockung, selber was Kleines zu schreiben wird aber immer grösser…. Das wäre dann wohl das gazillionste CMS…

Mit Apache 2.2 an einem Windows ADC authentifizieren

Zentrale Accountverwaltung (oder in Managerdeutsch: Single Signon) ist etwas schönes! Der IT-Support kann sich darum kümmern, spontan Änderungen vornehmen und die Websiteverantwortlichen müssen nicht mehr rennen und vergessene Passworte zurücksetzen. Viele Zentrale Verzeichnisse laufen unter Windows mittels ADCs (Active Directory Connector). Der ist so nett und stellt seine Dienste auch als LDAP (Lightweight Directory Access Protocol) zur Verfügung. Der Apache kann darüber (auch unter Linux) authentifizieren mit Basic Authentication, also mit dem Passwortfenster aber ohne PHP und PERL und so…

Benötigt wird das Modul authnz-ldap. Unter Debian kann das eingeschaltet werden mittels:

a2enmod

In einer .htaccess Datei oder in der Site-Konfiguration kann man nun sehr gezielt für Verzeichnisse oder URLs die Authentifizierung einschalten. Hier ein Beispiel:

<location /admin>
                AuthName "LDAP-Authentifizierter Bereich"
                AuthType Basic
                AuthBasicProvider ldap
                AuthLDAPBindDN ldapreader@aden.local
                AuthLDAPBindPassword secretpassword
                AuthLDAPUrl ldap://adc1.aden.local/ou=Accounts,dc=aden,dc=local?sAMAccountName?sub
                AuthzLDAPAuthoritative on
                require ldap-group CN=Angestellte,OU=Berechtigungsgruppen,OU=Gruppen,DC=domain,DC=local
</location>
ldapreader@aden.local:
Ist ein Benutzer mit Leserechten aus der Domäne domain.local
secretpassword:
Ist das Passwort dieses Benutzers.
require:
Gibt an, wer Zugriff hat. ldap-group authentifiziert ganze Gruppen. Es gibt aber auch noch andere Direktiven.

Das Ganze funktioniert natürlich auch für SVN und Websvn Zugriffe über das Web!

Zertifikat erstellen und http-Anfragen auf https umleiten

Um zu einem SSL- Zertifikat zu kommen, kann unter Debian folgendes Kommando verwendet werden:

apache2-ssl-certificate

Dieses könnte man nun signieren lassen oder wenn man nur die Verschlüsselungseigenschaften braucht einfach so belassen. Wenn Apache das Modul mod_ssl geladen hat, kann man nun noch die Datei ans richtige Ort bewegen (Siehe SSLCertificateFile Parameter weiter unten).

Port 443 ist der Port auf dem der Apache auf https Verbindungen hört. Dass er dort ein Ohr platziert muss /vserver/webv2/etc/apache2/ports.conf angepasst werden;

Listen 80
Listen 443

Man hat ein schönes Zertifikat mit ganz vielen Bitlein und nun sollen die Benutzer dies auch gefälligst nutzen. Auf gut Deutsch: man zwingt alle http-Anfragen auf https (http://sicher.oncode.info soll zu https://sicher.oncode.info werden). mod_rewrite für Apache kann das gut, sehr gut sogar und erst noch automatisch. Dafür muss Apache folgendermassen konfiguriert werden:

Datei /vserver/webv2/etc/apache2/sites-available/default

NameVirtualHost *:443
NameVirtualHost *:80

<virtualhost *:80>
        RewriteEngine On
        RewriteCond %{HTTPS} !=on
        RewriteRule ^/(.*) https://%{SERVER_NAME}%{REQUEST_URI} [R]
</virtualhost>

<virtualhost *:443>
        ServerName sicher.oncode.info
        ServerAdmin apache.admin@onc0de.info
        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/apache.pem
[...]
</virtualhost>

Ein nettes Tutorial gibt es auch auf Tim Bormans Blog.

Unicodehölle die 2.

Wir binden bei uns SVN-Verzeichnisse direkt ins LMS (Learning Management System) Moodle ein. Einige Verzeichnisse haben mit Umlauten funktioniert, andere wiederum nicht. Ich bin tief eingetaucht in die Materie und habe 2, 3 kleine Erleuchtungen gehabt. Vielleicht bringt der folgende Bericht irgendjemandem was: Encodings im LMS der Berufsfachschule BBB

Schei? Encoding