Kapitel ▾ 2. Auflage

4.6 Git on the Server - Smart HTTP

Smart HTTP

Wir haben jetzt authentifizierten Zugriff über SSH und unauthentifizierten Zugriff über git://, aber es gibt auch ein Protokoll, das beides gleichzeitig kann. Das Einrichten von Smart HTTP besteht im Grunde nur darin, ein CGI-Skript zu aktivieren, das mit Git geliefert wird und git-http-backend auf dem Server heißt. Dieses CGI liest den Pfad und die Header, die von einem git fetch oder git push an eine HTTP-URL gesendet werden, und ermittelt, ob der Client über HTTP kommunizieren kann (was für jeden Client seit Version 1.6.6 der Fall ist). Wenn das CGI feststellt, dass der Client "smart" ist, wird es intelligent mit ihm kommunizieren; andernfalls fällt es auf das "dumme" Verhalten zurück (so dass es für Lesevorgänge abwärtskompatibel mit älteren Clients ist).

Gehen wir eine sehr einfache Einrichtung durch. Wir richten dies mit Apache als CGI-Server ein. Wenn Sie Apache nicht eingerichtet haben, können Sie dies auf einer Linux-Box mit etwas Ähnlichem tun:

$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env

Dadurch werden auch die Module mod_cgi, mod_alias und mod_env aktiviert, die alle für eine ordnungsgemäße Funktion benötigt werden.

Sie müssen auch die Unix-Benutzergruppe der Verzeichnisse /srv/git auf www-data setzen, damit Ihr Webserver Lese- und Schreibzugriff auf die Repositories hat, da die Apache-Instanz, die das CGI-Skript ausführt, (standardmäßig) unter diesem Benutzer läuft.

$ chgrp -R www-data /srv/git

Als Nächstes müssen wir einige Dinge zur Apache-Konfiguration hinzufügen, um git-http-backend als Handler für alles zu verwenden, was in den /git-Pfad Ihres Webservers gelangt.

SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

Wenn Sie die Umgebungsvariable GIT_HTTP_EXPORT_ALL weglassen, bedient Git nur unauthentifizierte Clients mit den Repositories, die die Datei git-daemon-export-ok enthalten, genau wie der Git-Daemon.

Schließlich möchten Sie Apache anweisen, Anfragen an git-http-backend zuzulassen und Schreibvorgänge irgendwie zu authentifizieren, möglicherweise mit einem Auth-Block wie diesem:

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /srv/git/.htpasswd
    Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
    Require valid-user
</Files>

Dies erfordert, dass Sie eine .htpasswd-Datei erstellen, die die Passwörter aller gültigen Benutzer enthält. Hier ist ein Beispiel zum Hinzufügen eines Benutzers "schacon" zur Datei:

$ htpasswd -c /srv/git/.htpasswd schacon

Es gibt unzählige Möglichkeiten, Apache zur Benutzerauthentifizierung zu verwenden. Sie müssen eine auswählen und implementieren. Dies ist nur das einfachste Beispiel, das wir uns ausdenken konnten. Sie werden dies fast sicher auch über SSL einrichten wollen, damit all diese Daten verschlüsselt werden.

Wir möchten nicht zu tief in die Apache-Konfigurationsdetails eintauchen, da Sie möglicherweise einen anderen Server verwenden oder andere Authentifizierungsanforderungen haben. Die Idee ist, dass Git eine CGI namens git-http-backend mitbringt, die bei Aufruf die gesamte Aushandlung durchführt, um Daten über HTTP zu senden und zu empfangen. Sie implementiert keine Authentifizierung selbst, aber das kann leicht auf der Ebene des Webservers gesteuert werden, der sie aufruft. Sie können dies mit fast jedem CGI-fähigen Webserver tun, also wählen Sie den, den Sie am besten kennen.

Hinweis

Weitere Informationen zur Konfiguration der Authentifizierung in Apache finden Sie in der Apache-Dokumentation hier: https://httpd.apache.org/docs/current/howto/auth.html.