Gitolite: gestión de permisos en Git

26 febrero 2014 at 17:48 by Adrián Pérez

gitEs muy posible que queramos tener un control de usuarios y permisos en nuestro repositorio git centralizado, si por ejemplo, tenemos a varios equipos de varios desarrolladores trabajando cada uno con un repositorio diferente. Afortunadamente, existen varias soluciones a este problema pero yo me he quedado con gitolite, por su facilidad de gestión y sus posibilidades.

NOTA: En este post se irá cambiando del servidor (miServer) a mi PC local (miPC). Se irá comentando a lo largo del post a qué entorno se hace referencia, pero si te pierdes, fíjate en el inicio de cada comando ejecutado (ej: [root@miServer ~] vs [adri@miPC])

Instalación

Añadimos el repositorio EPEL para nuestro servidor con el repositorio central, un CentOS 6:

[root@miServer ~]# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@miServer ~]# rpm -Uvh epel-release-6-8.noarch.rpm

Instalamos git y a posteriori gitolite, que en mi caso, me ha instalado y/o actualizado bastantes paquetes, la mayoría relacionados con perl:

[root@miServer ~]# yum install git gitolite3.noarch

A continuación, crearemos un usuario de sistema, para gitolite, al que en el ejemplo hemos llamado "git", y que será el usuario de sistema con el que interactuarán los usuarios con el repo:

[root@miServer ~]# useradd --system --shell /bin/bash --home /home/git git

Configuración inicial

Para poder configurar gitolite, deberemos dar de alta a un primer usuario, que será el usuario administrador que tendrá permisos sobre el repositorio de configuración de gitolite. En mi caso, será el usuario de mi PC local, "adri". Para ello, deberemos copiar la clave pública del usuario "adri" de mi PC local, a la home del usuario "git" del server. Como el usuario de sistema "git" que hemos creado, no tiene password, no nos permite conectar por SSH, así que dejaremos el .pub en /tmp, como paso intermedio:

[adri@miPC] scp ~/.ssh/id_rsa.pub root@git_server_IP_address:/tmp/git-admin.pub

NOTA: Posteriormente podremos añadir/modificar usuarios con acceso a la administración de gitolite, no te preocupes.

En este punto, estando logueados como root en el servidor, cambiaremos al usuario "git" que hemos creado en el punto anterior, para poder así configurar gitolite:

[root@miServer ~]# su - git

Logueados como "git", pasaremos a inicializar gitolite usando la clave pública que le hemos pasado:

-bash-4.1$ gitolite setup -pk /tmp/git-admin.pub
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
Initialized empty Git repository in /home/git/repositories/testing.git/
WARNING: /home/git/.ssh missing; creating a new one
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one

NOTA: Según la versión de gitolite con la que estemos trabajando, se deberá ejecutar "gl-setup /tmp/git-admin.pub" en lugar de "gitolite setup -pk /tmp/git-admin.pub"

Administración de gitolite

Para poder administrar gitolite, como hemos visto en el punto anterior, usaremos la cuenta remota del usuario "adri". En mi PC local, pues, deberemos instalar git si no lo teníamos instalado anteriormente:

[root@miPC]# yum install git.x86_64

Posteriormente, clonaremos el repositorio de administración de gitolite, estando logueados con el usuario "adri", que es el único que tiene acceso al repo mediante certificados:

[Adri@miPC ~]$ mkdir gitoliterepo
[Adri@miPC ~]$ cd gitoliterepo/
[Adri@miPC gitoliterepo]$ git clone git@git_server_IP_address:gitolite-admin 
Cloning into 'gitolite-admin'... 
remote: Counting objects: 6, done. 
remote: Compressing objects: 100% (4/4), done. 
remote: Total 6 (delta 0), reused 0

Una vez hecho ésto, tendremos el repositorio de administración clonado en local. Lo primero que haremos ahora, será configurar el nombre y mail de mi usuario local para que se asocie con las operaciones administrativas de gitolite:

[Adri@miPC gitolite-admin]$ git config --global user.name "Adrian Perez"
[Adri@miPC gitolite-admin]$ git config --global user.email "adrian.perez@mimail.com"

Gestión de usuarios

En el repositorio gitolite-admin que acabamos de clonar, encontraremos dos carpetas: conf y keydir. Lo que deberemos hacer es dejar dentro del directorio keydir, las claves públicas de los usuarios que quieran trabajar con el repositorio git. Así pues, si el usuario joe nos pasa su clave pública joe.pub, la dejaremos dentro del directorio y posteriormente pushearemos al repositorio del servidor:

[Adri@miPC ~]$ cd ~/gitoliterepo/gitolite-admin
[Adri@miPC gitolite-admin]$ cp ~/joe.pub  keydir/
[Adri@miPC gitolite-admin]git add keydir/joe.pub
[Adri@miPC gitolite-admin]git commit -a -m "New user Joe added"
[Adri@miPC gitolite-admin]git push

Con ésto, habremos añadido el usuario con nombre "joe" (es el nombre del fichero .pub, que puedes renombrar como te convenga) al listado de usuarios de Git.

Gestión de permisos y repositorios

Para crear un nuevo repositorio en gitolite, también lo haremos desde el fichero de configuración del repo gitolite-admin.

[Adri@miPC gitolite-admin]$ vi conf/gitolite.conf

Ahí definiremos el nuevo repositorio y quién tiene acceso a él. En el ejemplo, definiremos un nuevo repo llamado "foo" al cual únicamente tiene acceso total (RW+) el usuario joe, creado anteriormente.

repo foo
      RW+ = joe

Tras añadirlo, deberemos pushear los cambios, y gitolite se encargará automáticamente de crear un repositorio "bare" vacío en el servidor, listo para ser clonado. NOTA: Se creará un repositorio con el parámetro "bare" cuando se trate de un repositorio compartido.

[Adri@miPC gitolite-admin]git add conf/gitolite.conf
[Adri@miPC gitolite-admin]git commit -a -m "New repo for Joe"
[Adri@miPC gitolite-admin]git push

Desde este momento, Joe ya podrá clonar el repositorio desde su PC local, estando logueado con el usuario "joe" que anteriormente nos dió su clave pública:

[joe@joePC ~]git clone git@git_server_IP_address:foo

Ten en cuenta que tras el clonado inicial, al tratarse de un repo vacío creado con "bare", el primer push deberá tener las branches origen y destino, del estilo:

[joe@joePC ~]git push origin master

Notas finales: resumen

Como hemos visto, para añadir un nuevo usuario bastará con añadir su clave pública (.pub) al directorio keydir y pushear. El nombre del usuario será el nombre del fichero sin el .pub

Para gestionar los permisos bastará con indicar el tipo de permiso (R, RW, RW+) y el usuario o grupo de usuarios, para cada repositorio, y posteriormente pushear los cambios.

Easy & fast.

Fuentes:

https://www.digitalocean.com/community/articles/how-to-use-gitolite-to-control-access-to-a-git-server-on-an-ubuntu-12-04-vps

http://gitolite.com/gitolite/setup.html

http://stackoverflow.com/questions/10888300/gitosis-vs-gitolite