Subversion-Repository mit Apache einrichten

Subversion ist ein Versionsverwaltungsprogramm und wird als "Nachfolger" von CVS bezeichnet. Im Unterschied zu CVS legt man aber nicht lokal ein Repository an und greift dann per SSH darauf zu. Es gibt statt dessen mehrere Methoden, wie man remote auf ein Repository zugreifen kann, inbesondere geht das über ein spezielles Apache-Modul, dass WebDAV modifiziert (mod_dav_svn).

Ziel

Einrichtung eines Subversion Repositories auf einem Server, so dass man sicher mit Eclipse darauf zugreifen kann. Gleichzeitig soll es unterschiedliche User mit unterschiedlichen Rechten geben, die auch eigene Repositories besitzen.

Schritte

  • Zunächst muss natürlich Subversion selbst installiert sein (Paketname bei Fedora/RHEL: subversion). Für die hier vorgestellte Einrichtungsmethode braucht man auch noch das Apache-Modul (Paketname bei Fedora/RHEL: mod_dav_svn). Durch das Installieren des Apache-Moduls ist dann auch schon standardmäßig das Subversion-Modul in der Konfiguration eingetragen (/etc/httpd/conf.d/subversion.conf).
  • Da es später mehrere Repositories unterschiedlicher User geben und Apache nicht bei jeder Einrichtung eines SVN-Repositories neugestartet werden soll, werden alle Repositories unterhalb eines Verzeichnisses angelegt. Das hat natürlich den Nachteil, dass ein Benutzer nicht mehr selbst Backups von seinen Daten anfertigen kann. Dazu müssen die entsprechenden Verzeichnisse angelegt werden (ich benutze als Beispiel /var/version-management/subversion).
  • Anlegen eines ersten Repositories unterhalb von /var/version-management/subversion: Als Repository-Name wird bei mir der Benutzername verwendet. Den Typ "fsfs" sollte man meiner Erfahrung nach gegenüber der Berkely-DB unbedingt bevorzugen, da man sich sonst leicht sein Repository zerschießt (insbesondere bei Verwendung von Trac). svnadmin create --fs-type fsfs /var/version-management/subversion/felix
  • Jetzt wird der Apache-Zugriff eingerichtet, indem man die /etc/httpd/conf.d/subversion.conf anpasst. Damit ist es möglich, sowohl anonymen als auch authentifizierten Zugriff zuzulassen.
<Location /svn/repos>
	DAV svn
	SVNParentPath /var/version-management/subversion
	# our access control policy
	AuthzSVNAccessFile /var/version-management/subversion/access_control
	# try anonymous access first, resort to real
	# authentication if necessary.
	Satisfy Any
	Require valid-user
	# how to authenticate a user
	AuthType Basic
	AuthName "Subversion repository"
	AuthUserFile /var/version-management/subversion/.htpasswd
</Location>

  • Angenommen, der Benutzer Felix soll jetzt auf das Repository felix unbeschränkt Zugriff haben. Dann muss das access control file (/var/version-management/subversion/access_control) wie folgt aussehen:
    [felix:/]
    felix = rw
    

Alle anderen Benutzer haben keinerlei Rechte .

  • Damit man sich noch richtig anmelden kann, muss sich "felix" natürlich noch anmelden können, daher muss noch die /var/version-management/subversion/.htpasswd nach dem allgemeinen Schema für diese Dateien angepasst werden (benutzername:<verschlüsseltes Passwort> oder das Tool htpasswd verwenden).
  • Absichern der Konfiguration: Zunächst einmal Apache alle Besitzerrechte auf den Verzeichnisbaum /var/version-management/subversion geben, um eine Grundlage zu schaffen. Die Dateien access_control und .htpasswd muss Apache aber nur lesen können, daher werden sie wieder root übertragen. Geeignete Rechte sind z.B. 0640. Die einzelnen Repositories können als Gruppe dem jeweiligen User übertragen werden und zur Absicherung haben nur diese beiden Benutzer Zugriffsrechte. Wenn man dem Benutzer etwas mehr zutraut und ihm die Möglichkeit geben will, direkt über die Kommandozeile zuzugreifen, kann man ihm außer Leserechten auch noch Schreibrechte geben.
  • Jetzt muss der Apache noch neugestartet werden, damit alles funktioniert.

SElinux

Wenn SElinux auf dem System aktiviert ist, wird Apache nicht auf die Repositories zugreifen können. Dies äußert sich in Fehlermeldungen in error.log und in /var/log/messages bzw. in fehlgeschlagenen Anmeldungen trotz richtigen Passworts. Zunächst muss nämlich der SElinux-Kontext des Repositories korrekt gesetzt werden. Den Kontext kann man mit "ls -lZ <datei>" ansehen. Mit folgendem Befehl wird der Kontext der Dateien auf httpd_sys_content_t gesetzt, so dass Apache auch auf sie zugreifen kann.

chcon --verbose --recursive -t httpd_sys_content_t /var/version-management/subversion/

SSL-Verschlüsselung

Damit man nicht Passwörter und möglicherweise geheime Quelltexte unverschlüsselt durch die Gegend schickt, ist Verschlüsselung mit SSL unverzichtbar. In meiner Konfiguration soll jeder unverschlüsselte Zugriff abgelehnt werden. Das geschieht mittels der Option "SSLRequireSSL", so dass die subversion.conf anschließend so aussieht:

<Location /svn/repos>
	DAV svn
	SVNParentPath /var/version-management/subversion
	SSLRequireSSL
	SSLOptions +StrictRequire
	# our access control policy
	AuthzSVNAccessFile /var/version-management/subversion/access_control
	(...)