En este artículo voy a explicar los pasos necesarios para montar un servidor git donde alojar un repositorio remoto con acceso SSH, en Debian.
Para comenzar, instalar git:
# apt-get install git
En Debian 7, la versión disponible desde paquete pertenece a la rama 1.7:
root@debian7# git --version git version 1.7.10.4
Si se desea una versión más actualizada será necesario compilarla desde los fuentes, o instalarla desde los backports.
Luego crear un directorio donde alojar los repositorios git:
# mkdir /var/repo
La idea es implementar un servidor para hospedar múltiples repositorios, cada uno propiedad de un usuario (a nivel sistema operativo) diferente, para mantenerlos aislados entre sí. Entonces, a continuación, crear un subdirectorio donde alojar el primer repositorio, por ejemplo para mantener el control de versiones del desarrollo de un sitio Web:
# cd /var/repo/ # mkdir linuxito.com
Inicializar el nuevo repositorio git bare:
# cd linuxito.com/ && git init --bare
Ejemplo:
root@debian7# git init --bare Initialized empty Git repository in /var/repo/linuxito.com/
El siguiente paso consiste en crear un usuario para acceder al repositorio git de forma remota a través de SSH:
root@debian7# useradd -c "Usuario git linuxito.com" -M -d /var/repo/linuxito.com -s /usr/bin/git-shell git_linuxito
Notar que la shell para éste usuario es git-shell
. Queremos que los desarrolladores sean capaces de conectarse a través de SSH al servidor, para mantener el repositorio git, pero no deseamos que tengan acceso a una shell (que no puedan ejecutar comandos en el servidor).
Configurar el acceso SSH para el usuario "git_linuxito":
# nano /etc/ssh/sshd_config
Agregar las siguientes líneas en el archivo de configuración del servidor SSH:
Match User git_linuxito PasswordAuthentication no PubkeyAuthentication yes AuthorizedKeysFile /var/repo/.ssh/authorized_keys-git_linuxito AllowTcpForwarding no MaxSessions 10
El mecanismo de autenticación para este usuario será sólo a través de clave pública y el archivo authorized_keys-git_linuxito
se crea más adelante.
Recargar el servicio SSH para que tome los cambios en la configuración:
# service ssh reload
Ahora sí, crear el archivo authorized_keys-git_linuxito
para implementar el acceso SSH con clave pública:
# mkdir /var/repo/.ssh # cd /var/repo/.ssh/ # nano authorized_keys
(Pegar las claves públicas DSA o RSA de los desarrolladores que tendrán acceso a este repositorio).
Cambiar los permisos sobre el archivo para que ningún desarrollador pueda modificarlo (evitar que pueda agregar nuevas claves públicas para que otros desarrolladores se autentiquen como git_linuxito a través de SSH):
# chown root:git_linuxito authorized_keys # chmod 440 authorized_keys
La idea de esta configuración consiste en utilizar un archivo authorized_keys
para cada usuario (como es costumbre), pero que todos estén alojados en el mismo directorio /var/repo/.ssh/
, con acceso de escritura para nadie. De esta forma, sólo root puede otorgarse permisos de escritura (740
) para agregar una nueva clave, y luego volver a 440
.
root@debian7# cd .. root@debian7# ll -d .ssh drwxr-xr-x 2 root root 4.0K Sep 16 12:51 .ssh root@debian7# ll .ssh total 4.0K -r--r----- 1 root git_linuxito 602 Sep 16 12:51 authorized_keys
En este momento es posible verificar que la autenticación SSH con clave pública funcione:
emi@hal9000:~ % ssh -p 2222 git_linuxito@linuxito.com Linux debian7 3.2.0-4-amd64 #1 SMP Debian 3.2.57-3+deb7u2 x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Fri Sep 16 13:12:07 2016 from 6.6.6.6 fatal: Interactive git shell is not enabled. hint: ~/git-shell-commands should exist and have read and execute access. Connection to linuxito.com closed.
Lógicamente no es posible abrir una shell remota porque se está utilizando git-shell
. Sin embargo la autenticación con clave pública funciona correctamente.
Resta configurar los permisos adecuados para el repositorio:
# cd linuxito.com/ # chown -R git_linuxito:git_linuxito linuxito.com
Y finalmente verificar el acceso con el comando git
:
root@linuxito:~# git clone ssh://git_linuxito@linuxito.com:2222/var/repo/linuxito.com Cloning into 'linuxito.com'... warning: You appear to have cloned an empty repository.
Referencias
Git on the Server - Setting Up the Server