SVN mit SSH

Ein Einsatzzweck, wenn nicht sogar der erste, war es, den Raspberry Pi als SVN-Server einzusetzen. Das erfordert nicht viele Ressourcen und ist eine perfekte Aufgabe für den Mini-Computer.
In diesem kleinen Tutorial erkläre ich nun die Installation von SVN und wie man sich mit Hilfe von SSH auf dem SVN-Server anmeldet.

Vorbereitung: SSH-Key erzeugen

Damit wir uns später einfach und sicher mit dem Raspberry Pi verbinden können, ist es erforderlich, dass wir einen SSH-Key-Paar erzeugen. Unter Mac OS X und Linux ist es sehr einfach mit dem Befehl

ssh-keygen -b 2048

möglich. Das erzeugt ein 2048 Bit Schlüsselpaar. Standardmäßig werden die Dateien im Verzeichnis ~/.ssh abgelegt. Unter Windows kommt an dieser Stelle der PuTTYgen zum Einsatz.

Was weiter mit dem Schlüssel passiert, steht dann weiter unten.

Installation

Für den Betrieb eines SVN-Server muss nur das Paket subversion installiert werden.

sudo apt-get install subversion

Einrichtung des Benutzers

Damit wir den Betrieb des SVN-Servers von dem restlichen System etwas abgrenzen können, richten wir einen neuen Benutzer ein.

pi@raspberrypi ~ $ sudo adduser svnuser
Lege Benutzer »svnuser« an ...
Lege neue Gruppe »svnuser« (1014) an ...
Lege neuen Benutzer »svnuser« (1011) mit Gruppe »svnuser« an ...
Erstelle Home-Verzeichnis »/home/svnuser« ...
Kopiere Dateien aus »/etc/skel« ...
Geben Sie ein neues UNIX-Passwort ein:
Geben Sie das neue UNIX-Passwort erneut ein:
passwd: Passwort erfolgreich geändert
Benutzerinformationen für svnuser werden geändert.
Geben Sie einen neuen Wert an oder drücken Sie ENTER für den Standardwert
	Vollständiger Name []:
	Zimmernummer []:
	Telefon geschäftlich []:
	Telefon privat []:
	Sonstiges []:
Sind die Informationen korrekt? [J/n] j

Dieser sollte ein Passwort bekommen (wie immer ist zu beachten, dass keine Ausgabe erfolgt). Alle weiteren Angaben sind dann optional.
Wie wir sehen, wurde automatisch bereits auch die Gruppe svnuser mit angelegt.

Nun können wir uns mit logout ausloggen und den neuen Login ausprobieren (raspberrypi ist in diesem Beispiel der Name des Raspberry Pis).

ssh svnuser@raspberrypi

Sind wir eingeloggt, legen wir im Home-Verzeichnis das Verzeichnis .ssh an und wechseln hinein.

svnuser@raspberrypi ~ $ mkdir .ssh && cd .ssh
svnuser@raspberrypi ~/.ssh $

Nun legen wir hier eine Datei authorized_keys an.

nano authorized_keys

Diese wird alle öffentlichen Schlüssel (Public keys) von unseren Benutzern beinhalten, die sich auf unserem SVN-Server anmelden wollen.

Für jeden Benutzer fügen wir nun so eine Zeile ein:

command="svnserve -t -r /var/repos --tunnel-user=user",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa [...]

Was bedeutet das? Das, was hinter command kommt, ist ein Befehl, der ausgeführt wird, wenn sich ein Benutzer per SSH mit unserem SVN-Server verbindet. In diesem Fall wird also das Programm svnserve ausgeführt. Diesem folgen einige Parameter, die auf der man page für svnserve auch nachgelesen werden können.

-t zeigt an, dass das Programm im Tunnelmodus betrieben wird.

-r setzt das Wurzelverzeichnis, in das beim Verbinden gewechselt wird. Hier ist es /var/repos, das wir noch anlegen müssen.

--tunnel-user überschreibt den Benutzernamen, mit dem wir uns verbunden haben. Dies ist sinnvoll, wenn wir mehrere Benutzer haben, die sich mit unserem Server verbinden wollen und später in den Logs nicht immer nur svnuser auftauchen soll, sondern eine unterschiedliche Kennung für jeden Benutzer. Die Alternative wäre, dass wir für jeden Benutzer einen eigenen Linux-Account anlegen.

Die weiteren Schalter no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty zeigen unter anderem an, dass der Benutzer keinen Zugriff auf die Konsole oder den Desktop bekommen soll.

Anstelle der drei Punkte [...] müssen wir nun den Public Key einfügen, den wir weiter oben erzeugt haben. Wichtig dabei ist, dass alles (von command bis zum Ende des Schlüssels) auf einer Zeile steht! Für weitere Benutzer können neue Zeilen eingefügt werden.

Nun müssen wir noch die Berechtigungen für das Verzeichnis und die Datei setzen:

chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys

Danach können wir uns wieder abmelden und mit unserem Standard-Account (in meinem Fall pi) anmelden.

Damit sich der Benutzer svnuser nicht direkt an der Konsole anmelden kann, sollten wir ihn sperren.

sudo passwd -l svnuser

Dies betrifft aber nur die Anmeldung an der Konsole mit Benutzername und Passwort.

Anlegen des Verzeichnisses

Wie bereits weiter oben beschrieben, sollen die einzelnen Repositories in einem extra Verzeichnis liegen. Dazu erzeugen wir das erwähnte Verzeichnis

sudo mkdir /var/repos

Dieses Verzeichnis ist nun natürlich unter dem root-Account angelegt und damit hat auch nur dieser Zugriff darauf. Also müssen wir noch die Zugriffsrechte ändern:

sudo chown svnuser:svnuser /var/repos

Anlegen eines Repositories

Ein einzelnes Repository legen wir mit

sudo svnadmin create /var/repos/reponame

an, wobei reponame durch einen entsprechenden Namen ersetzt werden kann. Auch hier müssen noch die Zugriffrechte geändert werden.

sudo chown -R svnuser:svnuser /var/repos/reponame
sudo chmod -R 770 /var/repos/reponame

Das war's auch schon. Nun können wir mit dem neuen Repository arbeiten. Testen können wir es an unserem Computer mittels

svn co svn+ssh://svnuser@raspberrypi/reponame ~/temp/