Git
Chapters ▾ 2nd Edition

4.6 Git auf dem Server - Smart HTTP

Smart HTTP

Wir haben jetzt authentifizierten Zugriff über SSH und nicht authentifizierten Zugriff über git://, aber es gibt auch ein Protokoll, das beides gleichzeitig kann. Die Einrichtung von Smart HTTP ist im Grunde genommen nur die Aktivierung eines CGI-Skripts, das mit Git namens git-http-backend auf dem Server bereitgestellt wird. Dieses CGI liest den Pfad und die Header, die von einem git fetch oder git push an eine HTTP-URL gesendet werden, und bestimmt, ob der Client über HTTP kommunizieren kann (was für jeden Client seit Version 1.6.6 gilt). Wenn das CGI sieht, dass der Client intelligent ist, kommuniziert es intelligent mit ihm; andernfalls fällt es auf das dumme Verhalten zurück (also ist es rückwärtskompatibel für Lesezugriffe mit älteren Clients).

Lassen Sie uns durch ein sehr einfaches Setup gehen. Wir werden das mit Apache als CGI-Server einrichten. Wenn Sie kein Apache-Setup haben, können Sie dies auf einer Linux-Box mit so etwas 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 benötigt werden, damit das Ganze ordnungsgemäß funktioniert.

Sie sollten auch die Unix-Benutzergruppe im Verzeichnis /srv/git auf www-data setzen, damit Ihr Webserver auf die Repositories lesend und schreibend zugreifen kann, da die Apache-Instanz, auf der das CGI-Skript läuft, (standardmäßig) als dieser Benutzer ausgeführt wird:

$ chgrp -R www-data /srv/git

Als nächstes müssen wir der Apache-Konfiguration einige Dinge hinzufügen, um das git-http-backend als Handler für alles, was in den /git-Pfad Ihres Webservers kommt, auszuführen.

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, wird Git nur nicht authentifizierten Clients die Repositorys mit der Datei git-daemon-export-ok zur Verfügung stellen, genau wie der Git-Daemon.

Abschließend möchten Sie dem Apache sagen, dass er Anfragen an das git-http-backend zulassen soll, damit Schreibvorgänge irgendwie authentifiziert werden, 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>

Dazu müssen Sie eine .htpasswd-Datei erstellen, die die Passwörter aller gültigen Benutzer enthält. Hier ist ein Beispiel für das Hinzufügen eines „schacon“ Benutzers zur Datei:

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

Es gibt unzählige Möglichkeiten, Benutzer mit Apache zu authentifizieren. Sie müssen eine von ihnen auswählen und implementieren. Das ist nur das einfachste Beispiel, das wir uns vorstellen können. Sie werden dies auch mit ziemlicher Sicherheit über SSL konfigurieren wollen, damit alle Daten verschlüsselt werden.

Wir wollen nicht zu weit in das Konzept der Apache-Konfigurationsspezifikationen eindringen, da Sie möglicherweise einen anderen Server verwenden oder unterschiedliche Authentifizierungsanforderungen haben. Die Idee ist, dass Git mit einem CGI mit dem Namen git-http-backend daherkommt, das beim Aufruf alle Vorbereitungen zum Senden und Empfangen von Daten über HTTP trifft. Es implementiert selbst keine Authentifizierung, aber diese kann leicht auf der Ebene des Webservers gesteuert werden, der sie aufruft. Sie können das mit fast jedem CGI-fähigen Webserver tun, also wählen Sie denjenigen, den Sie am besten kennen.

Note

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