Git
Chapters ▾ 2nd Edition

4.6 Git sur le serveur - HTTP intelligent

HTTP intelligent

Nous avons à présent un accès authentifié par SSH et un accès non authentifié par git://, mais il existe aussi un protocole qui peut faire les deux à la fois. La configuration d’un HTTP intelligent revient simplement à activer sur le serveur un script CGI livré avec Git qui s’appelle git-http-backend. Ce CGI va lire le chemin et les entêtes envoyés par un git fetch ou un git push à une URL donnée et déterminer si le client peut communiquer sur HTTP (ce qui est vrai pour tout client depuis la version 1.6.6). Si le CGI détecte que le client est intelligent, il va commencer à communiquer par protocole intelligent, sinon il repassera au comportement du protocole idiot (ce qui le rend de ce fait compatible avec les vieux clients).

Détaillons une installation de base. Nous la réaliserons sur un serveur web Apache comme serveur CGI. Si Apache n’est pas installé sur votre PC, vous pouvez y remédier avec une commande :

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

Cela a aussi pour effet d’activer les modules mod_cgi, mod_alias, et mod_env qui sont nécessaires au fonctionnement du serveur.

Ensuite, nous devons ajouter quelques lignes à la configuration d’Apache pour qu’il lance git-http-backend comme gestionnaire de tous les chemins du serveur web sous /git.

SetEnv GIT_PROJECT_ROOT /opt/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/

Si vous ne définissez pas la variable d’environnement GIT_HTTP_EXPORT_ALL, Git ne servira aux utilisateurs non authentifiés que les dépôts comprenant le fichier git-daemon-export-ok, de la même manière que le daemon Git.

Puis, nous allons indiquer à Apache qu’il doit accepter les requêtes sur ce chemin avec quelque chose comme :

<Directory "/usr/lib/git-core*">
   Options ExecCGI Indexes
   Order allow,deny
   Allow from all
   Require all granted
</Directory>

Enfin, il faut forcer l’authentification pour l’écriture, probablement avec un bloc Auth comme celui-ci :

<LocationMatch "^/git/.*/git-receive-pack$">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /opt/git/.htpasswd
    Require valid-user
</LocationMatch>

Il faudra donc créer un fichier .htaccess contenant les mots de passe de tous les utilisateurs valides. Voici un exemple d’ajout d’un utilisateur schacon au fichier :

$ htdigest -c /opt/git/.htpasswd "Git Access" schacon

Il existe des milliers de façons d’authentifier des utilisateurs avec Apache, il suffira d’en choisir une et de la mettre en place. L’exemple ci-dessus n’est que le plus simple. Vous désirerez sûrement gérer tout ceci sous SSL pour que vos données soient chiffrées.

Nous ne souhaitons pas nous appesantir spécifiquement sur la configuration d’Apache, car on peut utiliser un serveur différent ou avoir besoin d’une authentification différente. L’idée générale reste que Git est livré avec un CGI appelé git-http-backend qui, après authentification, va gérer toute la négociation pour envoyer et recevoir les données sur HTTP. Il ne gère pas l’authentification par lui-même, mais peut être facilement contrôlé à la couche serveur web qui l’invoque. Cela peut être réalisé avec n’importe quel serveur web gérant le CGI, donc celui que vous connaissez le mieux.

Note

Pour plus d’informations sur la configuration de l’authentification dans Apache, référez-vous à la documentation d’Apache : http://httpd.apache.org/docs/current/howto/auth.html