Droits sur un repository Git avec Gitolite

Git (http://git-scm.com/) est un gestionnaire de sources réparti permettant à chaque utilisateur d'avoir son propre dépôt local dans lequel il peut faire toutes les actions inhérentes à un gestionnaire de sources sans avoir a être connecté à un dépôt distant et central en permanence.

Cependant, dans une architecture utilisant Git, on a souvent un dépôt de référence sur lequel tous les développeurs viennent poser (push) et fusionner (merge) les évolutions de leur dépôt local sur ce dépôt de référence.

Un autre mode de fonctionnement est que l'administrateur du repository de référence vienne tirer toutes les modifications des dépôts des developpeurs et fasse lui même le merge. C'est comme celà que fonctionne notamment la gestion des sources pour le noyau Linux.

Git étant basé sur la confiance entre développeurs, il n'est pas prévu avec le système de base une gestion de droits et / ou de listes de contrôle d'accès (ACL) pour autoriser ou interdire l'accès à certains dépôts (tout ou partie).

Le but de cet article est donc de présenter le projet Gitolite (http://github.com/sitaramc/gitolite) permettant de mettre en place une gestion d'ACL pour des dépôts Git.

Présentation de Gitolite

Gitolite est un projet open source permettant de gérer les droits sur les dépôts Git en utilisant un système d'ACL. Comme pour certains systèmes de gestion de versions tels que Subversion, il est possible de gérer les droits à différents niveaux de granularité tels que le dépôt complet ou bien certaines branches du dépôt.

Cependant, une des choses très intéressantes dans Gitolite est de pouvoir déléguer les droits d'administration à d'autres utilisateurs. L'administrateur principal de la base des dépôts pourra donc en déléguer certains à des utilisateurs enregistrés.

Le principe de fonctionnement de Gitolite est assez simple : Toute la gestion des ACL se fait dans un dépôt Git spécifique. Ce dépôt contient toute la configuration des ACLs ainsi que la gestion des utilisateurs.

Ainsi afin de pouvoir mettre à jour les droits, on utilisera des commandes telles que git add, git commit, git push, etc.

En ce qui concerne la localisation, un dépôt gitolite de référence sera déployé sur le serveur contenant tous les dépôts de références pour lesquels on souhaite mettre en place une gestion d'ACL.

Le principe de configuration des ACLs se fera donc de la manière suivante :

  1. récupérer le dépôt git de référence (clone / pull / fetch) ;
  2. modifier les fichiers de configuration contenus dans le dépôt Git ;
  3. enregistrer les modifications dans le dépôt Git local ;
  4. synchroniser le dépôt local avec le dépôt distant.

Vous l'aurez donc compris, Gitolite est un outil fait par des utilisateurs de Git pour des utilisateurs Git. Pour pouvoir bien l'utiliser il est nécessaire de bien maitriser les concepts de Git.

Site du Projet Gitolite : http://github.com/sitaramc/gitolite

Gitolite est censé pouvoir fonctionner sur n'importe quel système pouvant faire tourner Git, Perl et un serveur SSH. Pour cet article, gitolite a été testé et validé sur Redhat Enterprise et Debian Lenny.

Behind the scenes

La gestion des droits se fait donc par l'intermédiaire d'un repository Git. Comment se fait donc la mise en place des droits lorsqu'un administrateur ou un utilisateur disposant de droits lorsque celui-ci commit et push sur le repository gitolite ?

Sur le système contenant tous les repositories de référence est déployé tout un ensemble de hooks sous formes de hooks déployés dans chaque repository y compris le repository gitolite. Ces scripts seront exécutés a chaque fois qu'un événement git est appliqué sur le repository.


git@scarlett:~/repositories/gitolite-admin.git/hooks$ ls -l
total 48
-rw------- 1 git git 441 Dec 18 15:31 applypatch-msg
-rw------- 1 git git 887 Dec 18 15:31 commit-msg
-rw------- 1 git git 152 Dec 18 15:31 post-commit
-rw------- 1 git git 510 Dec 18 15:31 post-receive
-rwxr-xr-x 1 git git 1253 Dec 18 15:31 post-update
-rw------- 1 git git 387 Dec 18 15:31 pre-applypatch
-rw------- 1 git git 1706 Dec 18 15:31 pre-commit
-rw------- 1 git git 4262 Dec 18 15:31 pre-rebase
-rw------- 1 git git 1196 Dec 18 15:31 prepare-commit-msg
-rwxr-xr-x 1 git git 4963 Dec 18 15:31 update

On remarquera que seuls les hooks update et post-update sont actifs (Droits d'exécution présents).

Côté authentification et application des ACLs, tout se fait en utilisant uniquement SSH. En effet la partie authentification est assurée par gitolite par un couple clé privée / clé publique spécifique à chaque utilisateur gitolite.

Sur le serveur contenant tous les repositories de référence, tout se fait avec un seul utilisateur POSIX. Tous les utilisateurs gitolite seront des utilisateurs virtuels identifiés par leur clés publique SSH sur ce compte POSIX.

Ainsi, la vérification des ACLs pour un utilsateur donné se fera par l'exécution d'une commande gitolite dès que la clé de celui-ci sera reconnue par le serveur SSH par l'intermédiaire du fichier authorized _keys du compte POSIX utilisé pour le management des repositories de référence.


# gitolite start
command="/home/git/.gitolite/src/gl-auth-command ptitoliv",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArvCWSA9oQM+GrQbb8sdqQkgyraATjBjpTR6UrsUo1anQ2nFNf5glepKb1vyskY1FWzYTnEdQeZXD/4h2J9J/lMFdzISgZ7jpX5Y7Vzrm7tz4eKUTIKiX/E5+aANjHyj8xpatDK4BonSAJySTBc/X/9S3K58+qoRvax6Aq2FdKwgRCwb3pPa9G3et0wLDgWVaHTLlfDm+8mf3EcYK9i4wa2b1q/sSUxWwN8t/zwSVpy4/+HwUMME9wcpMerX3LLK1Rhxim7n6mr71oJY9/00lynyyqZufN1seNQxUdnDBZ194bXyqI1e2B+cgewwgXx9txBGdqadTO0YMHGZHCePbfw== ptitoliv@debian-vm
# gitolite end

La capture précédente liste toutes les clés publiques enregistrées pour le compte POSIX présenté précédemment. On remarquera, la déclaration du paramètre command exécutant la commande gitolite gl-auth-command permettant d'authentifier l'utilisateur virtuel et de vérifier ces droits.

Cette commande prend comme paramètre le nom de l'utilisateur virtuel à utiliser pour la validation des ACLs. C'est donc ici que se fait la correspondance clé <=> nom d'utilisateur gitolite. Nous verrons plus loin que la mise à jour du fichier authorized_keys se fait toute automatiquement par l'intermédiaire des hooks gitolite.

Installation de Gitolite

Pré requis

Pour installer gitolite, il faut disposer d'un serveur qui stockera tous les repositories GIT y compris le repository gitolite. C'est sur ce serveur que seront configurées et appliquées les ACLs sur les repositories.Ce serveur sera désigne dans la suite de cette article comme le serveur de référence.

Ce serveur doit être installé avec les composants suivants :

L'installation ne se faisant pas directement sur le serveur de référence, il faut également disposer d'une machine cliente disposant également de git, perl et d'un client SSH pour communiquer avec le serveur de référence.

Préparation du serveur de référence

Ajout d'un utilisateur POSIX

Comme dit précédemment, toute l'application gitolite est gérée sous un seul utilisateur POSIX. La première opération est donc de créer cet utilisateur que nous appellerons git.

serveur-git:~# adduser git

Une fois créé tous les repositories seront stockées dans le home directory de ce compte.

Mise en place de clés SSH (optionnel)

Toute l'installation de gitolite se fait par une succession de commandes SSH entre le client et le serveur. Il est donc préférable de mettre en place une authentification par clé.

La première étape est donc de créer un couple de clé sur la machine cliente qui va nous servir à nous connecter au compte git du serveur de référence sans mot de passe.


ptitoliv@workstation:~$ ssh-keygen -t rsa -b 1024
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ptitoliv/.ssh/id_rsa):
Created directory '/home/ptitoliv/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ptitoliv/.ssh/id_rsa.
Your public key has been saved in /home/ptitoliv/.ssh/id_rsa.pub.
The key fingerprint is:
0e:1c:9a:d1:22:a4:e5:e3:d1:04:69:92:3d:d8:b3:ae ptitoliv@debian-vm
The key's randomart image is:
+--[ RSA 1024]----+
| =+o. |
|+=Bo . |
|.o=++ o |
| ..+ * . |
| .. o o S |
| . o |
| . . |
|E |
| |
+-----------------+

Une fois la clé publique générée, il faut la déployer sur le compte git du serveur de référence. Pour cela, on peut utiliser l'outil ssh-copy-id.

ptitoliv@workstation:~$ ssh-copy-id -i /home/ptitoliv/.ssh/id_rsa git@serveur-git
git@serveur-git's password:
Now try logging into the machine, with "ssh 'git@serveur-git'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

Si ssh-copy-id n'est pas disponible, l'opération consiste juste à importé la clé publique générée dans le fichier ./ssh/authorized_keys du compte git. (Ne pas oublier de mettre les droits a 0644 sur le fichier).

Téléchargement de gitolite

Tout est prêt à présent pour installer gitolite. Afin de récupérer le logiciel, 2 méthodes sont possibles :

Téléchargement d'un des différents snapshots disponibles à l'adresse http://github.com/sitaramc/gitolite/downloads

ou bien récupération de la dernière version de développement en clonant le repository de référence sur GitHub :

ptitoliv@workstation:~$ git clone git://github.com/sitaramc/gitolite.git

ATTENTION : Le déploiement doit se faire sur la machine cliente et non le serveur de référence.

Le clone a créé un répertoire gitolite qui contient toutes les fichiers et notamment un script d'installation qui va permettre de configurer gitolite localement et de déployer cette configuration sur le serveur de référence.

Remarque : Il existe également des snapshots stables des différentes version de gitolite disponibles sur

Installation de gitolite

Le script d'installation est gl-easy-install dans le répertoire src.Il doit être lancé avec les paramètres suivants :

Lancement de l'installation Sur la workstation:

ptitoliv@workstation:~/gitolite$ src/gl-easy-install git debian-vm gitoliteadm

Une fois l'installer lancé, celui-ci va exécuter les étapes suivantes :

Si tout s'est bien passé gitolite est à présent installé et utilisable.

Résultat de l'installation

Si toute la phase d'installation s'est bien déroulée, différents composants ont été installés sur le serveur de référence et sur la machine cliente.

Sur le client

L'installation à cloné le repository gitolite-admin déployé sur le serveur de référence contenant toute la configuration (ACLs + utilisateurs)
ptitoliv@workstation:~/gitolite-admin$ ls -l
total 8
drwxr-xr-x 2 ptitoliv ptitoliv 4096 Dec 19 22:14 conf
drwxr-xr-x 2 ptitoliv ptitoliv 4096 Dec 19 22:14 keydir

Le répertoire conf contient le fichier gitolite.conf dans lequel sont décrites les ACLs par repository. Voici le fichier de configuration par défaut :

#gitolite conf
# please see conf/example.conf for details on syntax and features
repo gitolite-admin
RW+ = gitoliteadm
repo testing
RW+ = @all

La configuration fonctionne de la manière suivante : On déclare un bloc de configuration avec le mot clé repo suivi du nom du chemin complet du repository git sur le serveur de référence. Le chemin est établi par rapport à la racine de l'arborescence git distante.

Pour chaque repository,on peut avoir plusieurs ACLs. Les droits possibles sont les suivants :

Pour chaque droit on peut affecter des utilisateurs,des groupes d'utilisateurs ou bien tout le monde avec le mot clé @all.

Actuellement, il y a donc l'utilisateur gitoliteadm (Créé pendant l'installation) qui a tous les droits sur le repository gitolite-admin. C'est donc l'administrateur. Il y a également un repository testing sur lequel tout le monde à les droits.

Le répertoire keydir quant à lui contient la base des utilisateurs mais sous une forme particulière :

ptitoliv@workstation:~/gitolite-admin/keydir$ ls -l
total 4
-rw-r--r-- 1 ptitoliv ptitoliv 400 Dec 19 22:14 gitoliteadm.pub

La base des utilisateurs est en fait une liste de clés SSH publiques. Le nom de la clé doit être du format "username".pub pour que gitolite puisse l'utiliser par l'intermédiaire des hooks.

Sur le serveur de référence

L'installer à déployé dans le home directory de l'utilisateur git les éléments suivants :

git@serveur-git:~$ ls -al
drwxr-xr-x 6 git git 4096 Dec 19 22:27 .
drwxr-xr-x 6 root root 4096 Dec 19 21:41 ..
-rw------- 1 git git 366 Dec 19 22:27 .bash_history
-rw-r--r-- 1 git git 220 Dec 19 21:41 .bash_logout
-rw-r--r-- 1 git git 3116 Dec 19 21:41 .bashrc
drwxr-xr-x 7 git git 4096 Dec 19 21:49 .gitolite
-rw-r--r-- 1 git git 3291 Dec 19 21:49 .gitolite.rc
-rw-r--r-- 1 git git 675 Dec 19 21:41 .profile
drwx------ 2 git git 4096 Dec 19 22:19 .ssh
drwxr-xr-x 5 git git 4096 Dec 19 21:48 gitolite-install
-rw-r----- 1 git git 0 Dec 19 21:49 projects.list
drwxr-xr-x 4 git git 4096 Dec 19 21:49 repositories

Les éléments importants sont :

Tous ces éléments sont synchronisés entre le serveur de référence et les machines clients depuis lesquelle se fait l'administration de gitolite, le tout synchronisé par l'intermédiaire du repository gitolite-admin. Le seul élément sur lequel l'administrateur agit est ce repository, tout le reste étant géré par les hooks.

Configuration de Gitolite

Nous pouvons à présent commencer à utiliser gitolite pour administrer les repositories du serveur de référence. Comme pour l'installation, tout va se faire à partir d'une machine cliente par l'intermédiaire d'actions "GIT" sur le repository gitolite-admin.

L'administrateur va donc faire des clones, des add, des push, des pull et des commit sur ce repository et c'est lors de la synchronisation avec le repository distant que les droits seront mis en oeuvre.

L'administrateur va donc utiliser ce repository pour toutes les taches d'administration courantes tels que la gestion des utilisateurs, des repositoires et des droits sur ceux-ci.

Note : Gitolite ne prends en compte que les objets de la branche master. Avant de faire toute modification dans le repository gitolite-admin, il est important de vérifier que l'on se trouve sur cette branche.

On verra plus tard l'utilisation des branches dans le répertoire gitolite-admin qui servent pour la délégation de droits.

Avant d'entreprendre toute action d'administration, la première chose à faire est de récupérer le repository gitolite-admin sur une machine cliente. Pour celà il faut avoir les droits d'accès à ce repository.

Ici, nous allons utiliser le compte gitoliteadm créé pendant l'installation qui est administrateur de gitolite. Il faut donc disposer de sa clé privée pour s'authentifier sur gitolite.

Normalement, l'installer a déposé cette clé dans le repertoire .ssh de l'utilisateur POSIX depuis lequel l'installation a été faite.

ptitoliv@workstation:~$ ls -al .ssh/gitolite*
-rw------- 1 ptitoliv ptitoliv 1675 déc 19 21:21 .ssh/gitoliteadm
-rw-r--r-- 1 ptitoliv ptitoliv 400 déc 19 21:21 .ssh/gitoliteadm.pub

Nous allons donc utiliser cette clé pour synchroniser le repository gitolite-admin.

2 cas sont possibles :

Le repository gitolite-admin n'existe pas en local

Il faut donc le cloner :
ptitoliv@workstation:~$ git clone ssh://git@serveur-git/home/git/repositories/gitolite-admin.git

Note : Il faut le chemin complet vers le repositories. De plus étant donné que tous les repositories sont de type "bare", le nom du répertoire est toujours suffixé par ".git".

Le repository gitolite-admin existe en local

Il faut le synchroniser depuis le serveur distant :

ptitoliv@serveur-git:~/gitolite-admin$ git pull origin master

Nous disposons donc localement du repository gitolite-admin "up-to-date" dans lequel on va pouvoir travailler.

Avec la commande git-clone, il n'est pas possible de spécifier la clé à utiliser. Pour contourner ce problème, il faut utiliser le fichier .ssh/config du home directory depuis lequel on travaille.

host gitolite
user git
hostname serveur-git
port 22
identityfile ~/.ssh/gitoliteadm

Remarque : Ce fichier est automatiquement configuré pour l'administrateur gitolite lors de l'installation.

Si tout s'est bien passé, le repository gitolite-admin est disponible en local :

ptitoliv@workstation:~$ ls -al gitolite-admin/
total 20
drwxr-xr-x 5 ptitoliv ptitoliv 4096 Dec 20 02:39 .
drwxr-xr-x 9 ptitoliv ptitoliv 4096 Dec 20 02:46 ..
drwxr-xr-x 8 ptitoliv ptitoliv 4096 Dec 20 02:41 .git
drwxr-xr-x 2 ptitoliv ptitoliv 4096 Dec 20 02:39 conf
drwxr-xr-x 2 ptitoliv ptitoliv 4096 Dec 20 02:39 keydir

Ajout d'un utilisateur

Avec gitolite, tout fonctionne avec SSH et les clés. Ainsi la base de données des utilisateurs est présentée sous la forme d'une liste de clés SSH dans un répertoire versionnés dans le repositories gitolite-admin.

Nous allons donc ajouter un utilisateur gituser dans la base des utilisateurs gitolite.

Génération des clés SSH

La première étape est donc de générer l'utilisateur gituser en créant les clefs.

ptitoliv@workstations:~$ ssh-keygen -t rsa -b 1024
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ptitoliv/.ssh/id_rsa): gituser
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in gituser.
Your public key has been saved in gituser.pub.
The key fingerprint is:
03:4a:a9:c0:b0:ff:46:f5:b0:1d:a0:96:be:75:cd:89 ptitoliv@workstation
The key's randomart image is:
+--[ RSA 1024]----+
|. . |
|o. + . |
|o. * + . |
| o = o * = . |
| o + o E + |
| o o . . |
| + |
| . |
| |
+-----------------+
ptitoliv@debian-vm:~$

Insertion dans le repository gitolite-admin

Pour ajouter, l'utilisateur il suffit de copier la clé publique dans le répertoire keydir du repository local gitolite-admin. Ne pas oublier que le nom de la clé doit être au format "username".pub.

ptitoliv@workstation:~/gitolite-admin/keydir$ cp /home/ptitoliv/gituser.pub .
ptitoliv@workstation:~/gitolite-admin/keydir$ ls -l
total 8
-rw-r--r-- 1 ptitoliv ptitoliv 400 déc 20 02:39 gitoliteadm.pub
-rw-r--r-- 1 ptitoliv ptitoliv 228 déc 20 14:57 gituser.pub
ptitoliv@workstation:~/gitolite-admin/keydir$

On ajoute ensuite la clé dans le repository gitolite-admin :

ptitoliv@debian-vm:~/gitolite-admin/keydir$ git add gituser.pub
ptitoliv@debian-vm:~/gitolite-admin/keydir$ git commit -m "Ajout de l'utilisateur gituser"
Created commit e07bd81: Ajout de l'utilisateur gituser
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 keydir/gituser.pub

L'utilisateur est à présent "commité" dans le repository local gitolite-admin. Cependant il n'est pas encore présent sur le repository sur le serveur de référence. Il faur donc pusher la branche master du repository gitolite-admin sur le serveur de référence.

ptitoliv@workstation:~/gitolite-admin/keydir$ git push origin master
Counting objects: 6, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 569 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
To gitolite:gitolite-admin
d885d48..ced7b36 master -> master
Already on "master"
WARNING: pubkey gituser.pub exists but user gituser not in config

Les modifications ont donc été pushé sur le repository de référence. Côté serveur, les hooks ont été exécutés afin de prendre en compte ce nouvel utilisateur. On le voit très bien grâce au message de warning retourné par le hook.

Ce message est normal étant donné que nous n'avons déclaré aucune ACL pour cet utilisateur. Ceci est la prochaine étape.

Création d'un repository

Maintenant que l'utilisateur est créé, nous allons lui créer un repository pour lequel il aura tous les droits.

Pour cela, il suffit de déclarer un nouveau repository dans le fichier gitolite.conf.

On se place donc sur la machine cliente en tant qu'administrateur gitolite et on procède à l'édition de ce fichier.

ATTENTION : Ne pas oublier de resynchroniser le repository gitolite-admin à partir du serveur de référence et de vérifier de bien être sur la branche master

On rajoute donc un repository monprojet-kitu et on donne tous les droits à l'utilisateur gituser.

repo monprojet-kitu
RW+ = gituser

On commit les modifications localement :

ptitoliv@workstation:~/gitolite-admin/conf$ git add gitolite.conf
ptitoliv@workstation:~/gitolite-admin/conf$ git commit
Created commit bd103bc: Ajout du repository monprojet-kitu et configuration des droits pour l'utilisateur gituser
1 files changed, 2 insertions(+), 0 deletions(-)

Puis on pushe les modifications sur le serveur distant :
ptitoliv@workstation:~/gitolite-admin/conf$ git push origin master
Counting objects: 7, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 441 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To gitolite:gitolite-admin
ced7b36..bd103bc master -> master
Already on "master"
Initialized empty Git repository in /home/git/repositories/monprojet-kitu.git/

Une fois encore, les hooks ont fait leur travail lors du push et on procédé à la création du repository sur le serveur de référence. La liste des ACLs a également été mise à jour pour autoriser gituser à accéder à monprojet-kitu.git.

Si l'on considère les ACLs rentrées dans le fichier gitolite.conf, seul l'utilisateur gituser peut accéder au repository monprojet-kitu.git.

Pour tester ceci, nous allons tester d'agir sur ce repository depuis la station d'un développeur quelconque propriétaire de la clé privée identifiant l'utilisateur gitolite gituser.

Préparation de l'environnement utilisateur

Avant que l'utilisateur puisse utiliser gitolite, il faut intégrer la clé privée à son environnement.

Pour que la clé soit prise par défaut lorsqu'on se connecte au serveur gitolite, on rajoute le bloc de configuration suivant :

host gitolite
user git
hostname serveurgit
port 22
identityfile ~/.ssh/gituser

Test de la connexion :

dev@devstation:~/.ssh$ ssh gitolite
PTY allocation request failed on channel 0
hello gituser, the gitolite version here is (unknown)
you have the following permissions:
R W monprojet-kitu
@ @ testing
Connection to serveurgit closed.

On voit bien que c'est la commande rajoutée dans le fichier authorized_keys côté serveur qui est exécutée. Ainsi, on peut savoir a quel repository l'utilisateur à accès.

Création du repository et synchronisation

On commence à présent à remplir le repository depuis le profil du développeur.

Création et initialisation du repository local


dev@devstation:~$ mkdir monprojet
dev@devstation:~$ cd monprojet/
dev@devstation:~/monprojet$ git init
Initialized empty Git repository in /home/dev/monprojet/.git/

Déclaration du serveur de référence

A ce niveau la, le repository local est créé mais est complètement indépendant du serveur de référence. Pour faire le lien entre les 2, il faut donc déclarer la référence origin. Pour faire une référence correcte, il faut tenir compte de 3 points :

  • Le hostname : Doit correspondre au hostname déclaré dans le fichier .ssh/config
  • Le path sur le serveur de référence : Le chemin doit être décrit par rapport à la racine déclarée dans le fichier .gitolite.rc
  • Le nom du repository : Etant donné que tous les repositories distant sont de type "bare", ne pas oublier l'extension .git à la fin
  • Voici donc ce que ca donne pour notre repository :
    dev@serveurgit:~/monprojet$ git remote add origin ssh://gitolite/monprojet-kitu.git

    Remplissage du repository et synchronisation

    Tout est prêt à présent pour utiliser notre repository distant géré par gitolite.
    dev@devstation:~/monprojet$ touch main.c
    dev@devstation:~/monprojet$ git add main.c
    dev@devstation:~/monprojet$ git commit -m "Initial Release"
    [master (root-commit) cebade6] Initial Release
    0 files changed, 0 insertions(+), 0 deletions(-)
    create mode 100644 main.c
    dev@devstation:~/monprojet$ git push origin master
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 212 bytes, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To ssh://gitolite/monprojet-kitu.git
    * [new branch] master -> master

    Gitolite a autorisé l'utilisateur à pusher sur le serveur de référence. Tout s'est bien passé. Cependant, est que les ACLs ont vraiment été appliquées ? Testons celà avec un autre utilisateur gitolite.

    Rajoutons un deuxième utilisateur dans la base gitolite :
    ptitoliv@workstation:~/gitolite-admin/keydir$ git add badguy.pub
    ptitoliv@workstation:~/gitolite-admin/keydir$ git commit -m "Ajout de l'utilisateur badguy"
    ptitoliv@workstation:~/gitolite-admin/keydir$ git push origin master

    Cet utilisateur est dans la base mais n'a aucun droit sur le repository monprojet-kitu.git.

    Pour tester, remplaçons la clé de gituser par celle de badguy pour notre compte dev :
    dev@devstation:~$ cat .ssh/config
    host gitolite
    user git
    hostname debian-vm
    port 22
    identityfile ~/.ssh/badguy

    Testons avec ssh :
    dev@devstation:~$ ssh gitolite
    PTY allocation request failed on channel 0
    hello badguy, the gitolite version here is (unknown)
    you have the following permissions:
    @ @ testing
    Connection to serveurgit closed.

    On constate que c'est maintenant l'utilisateur badguy qui est utilisé et que les droits ont changé.

    Essayons à présent d'accéder au repository :
    dev@devstation:~/monprojet$ git pull
    R access for monprojet-kitu DENIED to badguy
    fatal: The remote end hung up unexpectedly
    dev@devstation:~/monprojet$ git push origin master
    W access for monprojet-kitu DENIED to badguy
    fatal: The remote end hung up unexpectedly/

    Les ACLs sont bien appliquées et les repositories sont bien protégés.

    Modification des droits

    Si l'on souhaite changer les droits ou créer d'autres repositories, rien de plus simple. Il suffit d'exécuter les opérations suivantes :

    • Récupérer la dernière version du repository gitolite-admin sur le serveur de référence
    • Procéder à la modification du fichier gitolite.conf
    • Commiter les changements localement
    • Pusher la version locale sur le repository de référence

Délégation de droits

Généralement, la gestion des droits sur les SCM est centralisée et sous la responsabilité de l'administrateur du repository. Cela peut être problématique en cas d'indisponibilité de cette personne en cas de demande de modifications des droits sur un repository.

Un des points forts de gitolite est justement donc de pouvoir déléguer les droits sur un repository existant à un autre utilisateur gitolite enregistré autre que l'administrateur gitolite.

Nous allons donc voir dans cette dernière partie avec un exemple concret de délégations de droits qui est la meilleure manière d'expliquer la délégations de droits sur gitolite.

Nous allons donc considérer un utilisateur alice enregistré dans la base des utilisateurs gitolite et nous allons lui déléguer les droits d'administration sur le repository monprojet-kitu.

Déclaration des groupes

La méthode la plus conseillée pour gérer les délégations de droits est de regrouper les repositories dans des groupes et d'activer la délégation des droits sur un groupe de repositories.

Nous allons donc créer un groupe alice_repos dans lequel nous allons mettre le repository monprojet-kitu.

Tout va se faire en tant qu'administrateur gitolite, seul utilisateur à avoir l'accès à la branche master qui gère les droits de tous les repositories.

Après avoir fait un update de la branche master si nécessaire, on édite le fichier conf/gitolite.conf.

#Rajout du groupe
@alice_repos = monprojet-kitu

Ce code permet donc de créer le groupe alice_repos et de rajouter le repository dedans. Si l'on souhaite inclure un autre repository, il suffit de le rajouter à la suite.

Une fois le groupe déclaré, il faut procéder à la délégation des droits. Sous gitolite, il faut donc déléguer des droits en écriture sur une partie du repository gitolite. Il faut donc rajouter dans le bloc de déclaration du repository, l'instruction suivante :

repo gitolite-admin
RW alice_repos = alice

Fonctionnellement, cela signifie que l'on délègue à alice la possibilité de gérer les droits pour tous les repositories membre du groupe alice_repos. Cependant, si l'on se rapelle bien gitolite est avant tout un repository git avec des hooks particuliers. Si l'on se concentre donc sur ce qui est fait niveau git avec cette configuration, on se rend compte qu'en fait on vient de donner à alice des droits sur unr branche portant le nom du groupe.

Les droits des repositories du groupe seront gérées dans une branche portant le même nom que le groupe et dont les droits d'accès sont fixés par les ACLs gitolite

Une fois les modifications faites dans le fichier gitolite.conf, ne pas oublier de commiter et de pusher les modifications sur le serveur de référence.

Gestion des droits délégués

Nous sommes à présent connectés en tant qu'alice (A savoir dans un compte utilisateur ayant accès à la clé privée pour le compte alice gitolite).

La première étape est de récupérer le repository gitolite-admin en tant qu'alice. Etant donné qu' l'administrateur a attribué des droits à alice, il est possible de faire un clone. (Opération impossible sans aucun droit sur ce repository).

devalice@devstation:~$ git clone ssh://git@serveur-git/gitolite-admin
Initialized empty Git repository in /home/devalice/gitolite-admin/.git/
remote: Counting objects: 86, done.
remote: Compressing objects: 100% (66/66), done.
Receiving objects: 100% (86/86), 7.74 KiB, done.
Resolving deltas: 100% (13/13), done.
remote: Total 86 (delta 13), reused 0 (delta 0)

Création de la branche

L'étape suivante consiste à créer une branche dans le repository gitolite-admin correspondante au groupe pour lequel alice à les droits et se positionner dessus.

devalice@devstation:~/gitolite-admin$ git branch alice_repos
devalice@devstation:~/gitolite-admin$ git checkout alice_repos
Switched to branch 'alice_repos'

A présent il faut créer le fichier de configuration décrivant les droits établis par alice. Pour créer ce fichier, il faut respecter certaines contraintes pour que celui-ci soit validé par gitolite :

  • Le fichier doit être contenu dans le répertoire conf/fragments. S'il n'existe pas dans la branche, le créer
  • Le nom du fichier doit avoir le format suivant nom_du_groupe.conf

Pour notre exemple, cela donne donc les commandes suivantes :

devalice@devstation:~/gitolite-admin$ mkdir -p conf/fragments

Puis on créé un fichier nommé alice_repos.conf contenant les droits sur les repositories comme par exemple :
repo monprojet-kitu
RW+ = alice
R = @all

Avec cette on configuration, on donne tous les droits à alice et les droits en lecture pour tout le monde. Une fois le fichier sauvé, il faut le committer dans la branche. Si le fichier n'existait pas il faut l'ajouter avant à l'aborescence git.

devalice@devstation:~/gitolite-admin$ git add conf/fragments/alice_repos.conf
devalice@devstation:~/gitolite-admin$ git commit conf/fragments/alice_repos.conf -m "Add rights by alice"

La dernière étape consiste à pusher les modifications sur le serveur déférence afin de générer les ACLs. Attention par contre à pusher la branche de délégation et non la branche master.

devalice@devstation:~/gitolite-admin$ git push origin alice_repos

Lors du push les nouvelles ACLs sont générées en tentant compte de ces droits délégués.

Important : Il est possible de déclarer des droits à la fois dans la branche master mais aussi dans une branche de délégation. Dans ce cas la, les droits s'ajoutent.

Conclusion

Cet article vous à donc présenté l'outil gitolite et les bases de son fonctionnement et j'en ai présenté ici qu'une partie. Il existe en effet des fonctionnalités très intéressantes comme par exemple la gestion des droits avancées permettant de définir des ACLs par branche qui peut se révéler intéressante pour une gestion des droits très fine.

Pour conclure tiens à remercier JAG (il se reconnaitra) pour m'avoir présenté gitolie et participé à l'intégration de cet outil au sein du projet auquel je participe.

Bonne utilisation de gitolite.