Git
Chapters ▾ 2nd Edition

4.6 Git en el Servidor - HTTP Inteligente

HTTP Inteligente

Ahora ya tenemos acceso autentificado mediante SSH y anónimo mediante git://, pero hay también otro protocolo que permite tener ambos accesos a la vez. Configurar HTTP inteligente consiste, básicamente, en activar en el servidor web un script CGI que viene con Git, llamado git-http-backend. Este CGI leerá la ruta y las cabeceras enviadas por los comandos git fetch o git push a una URL de HTTP y determinará si el cliente puede comunicar con HTTP (lo que será cierto para cualquier cliente a partir de la versión 1.6.6). Si el CGI comprueba que el cliente es inteligente, comunicará inteligentemente con él; en otro caso pasará a usar el comportamiento tonto (es decir, es compatible con versiones más antiguas del cliente).

Revisemos una configuración básica. Pondremos Apache como servidor de CGI. Si no tienes Apache configurado, lo puedes instalar en un Linux con un comando similar a este:

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

Esto además activa los módulos mod_cgi, mod_alias, y mod_env, que van a hacer falta para que todo esto funcione.

A continuación tenemos que añadir algunas cosas a la configuración de Apache para que se utilice git-http-backend para cualquier cosa que haya bajo la carpeta virtual /git.

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

Si dejas sin definir la variable de entorno GIT_HTTP_EXPORT_ALL, Git solo servirá a los clientes anónimos aquellos repositorios que contengan el archivo daemon-export-ok, igual que hace el demonio Git.

Ahora tienes que decirle a Apache que acepte peticiones en esta ruta con algo similar a esto:

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

Finalmente, si quieres que los clientes autentificados tengan acceso de escritura, tendrás que crear un bloque Auth similar a este:

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

Esto requiere que hagas un archivo .htaccess que contenga las contraseñas cifradas de todos los usuarios válidos. Por ejemplo, para añadir el usuario “schacon” a este archivo:

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

Hay un montón de maneras de dar acceso autentificado a los usuarios con Apache, y tienes que elegir una. Esta es la forma más simple de hacerlo. Probablemente también te interese hacerlo todo con SSL para que todos los datos vayan cifrados.

No queremos profundizar en los detalles de la configuración de apache, ya que puedes tener diferentes necesidades de autentificación o querer utilizar un servidor diferente. La idea es que Git trae un CGI llamado git-http-backend que cuando es llamado, hace toda la negociación y envío o recepción de datos a través de HTTP. Por sí mismo no implementa autentificación de ningún tipo, pero puede controlarse desde el servidor web que lo utiliza. Puedes configurar esto en casi cualquier servidor web que pueda trabajar con CGI, el que más te guste.

Note

Para más información sobre cómo configurar Apache, mira la documentación: http://httpd.apache.org/docs/current/howto/auth.html