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 zusammen 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 ab 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).

Lass uns durch ein sehr einfaches Setup gehen. Wir werden Apache als CGI-Server verwenden. Wenn du kein Apache-Setup hast, kannst du dies auf einem Linux-System, wie nachfolgend beschrieben einrichten:

$ 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.

Du solltest auch die Unix-Benutzergruppe im Verzeichnis /srv/git auf www-data setzen, damit dein Webserver auf die Repositorys lesend und schreibend zugreifen kann. Die Apache-Instanz, auf der das CGI-Skript läuft, wird standardmäßig unter dieser Benutzer laufen:

$ 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 im`/git` Pfad dein Webservers liegt, auszuführen.

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

Wenn du die Umgebungsvariable GIT_HTTP_EXPORT_ALL nicht setzt, wird Git unauthentifizierten Clients nur die Repositorys, die die Datei git-daemon-export-ok enthalten, zur Verfügung stellen. Das Verhalten ist dann wie beim Git-Daemon.

Abschließend konfigurierst du Apache so, dass er Anfragen an das git-http-backend zulassen soll, um Schreibvorgänge zu authentifiziert. Dazu kannst du folgenden Code nutzen:

<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 musst du eine .htpasswd Datei erstellen, die die Passwörter aller gültigen Benutzer enthält. Hier ein Beispiel für das Hinzufügen eines Benutzers „schacon“:

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

Es gibt unzählige Möglichkeiten, Benutzer mit Apache zu authentifizieren. Du musst eine von ihnen auswählen und implementieren. Dies ist ein einfaches Beispiel. Du wirst dies wahrscheinlich über SSL konfigurieren wollen, damit auch alle Daten verschlüsselt werden.

Wir wollen nicht zu weit in das Konzept der Apache-Konfigurationsspezifikationen eindringen, da du möglicherweise einen anderen Server verwendst oder andere Authentifizierungsanforderungen hast. Die Idee ist, dass Git mit einem CGI mit dem Namen git-http-backend daherkommt, das beim Senden und Empfangen von Daten die Kommunikation über HTTP aushandelt. Es implementiert selbst keine Authentifizierung, aber diese kann über den Webservers gesteuert werden. Du kannst das mit fast jedem CGI-fähigen Webserver tun. Am besten wählst du denjenigen, den du am besten kennst.

Anmerkung

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

scroll-to-top