Installation et configuration de son serveur Git avec Gitosis sous Debian 5

Ce billet va vous expliquer de manière simple et concrète, comment installer et configurer son serveur Git avec Gitosis.

De nos jours, les développeurs que nous sommes, sont le plus souvent amenés à travailler de manière collaborative. Oui, il est fini le temps ou seul un développeur s'occupait du développement applicatif. Maintenant, chaque développeur apporte sa pièce à l'édifice. Mais comment travailler à plusieurs sur un même projet ? Tout simplement en installant un système de versioning tel que Git.

Au sommaire de ce billet

Plusieurs choix s'offrent à nous

Suivant nos besoins, il se pourrait que ce billet ne vous concerne pas.

Je suis le seul développeur, et je développe dans mon coin

Dans ce cas, initialise un repository Git tout simple et éclate-toi ;-)

Je suis le seul développeur, et je veux que mon développement soit "publique"

Il existe de nombreux sites qui proposent gratuitement, d'héberger vos développements peut importe le langage. Un grand nom dans ce domaine est Github. Il vous suffira de créer un compte, et vous pourrez créer autant de repository publique que vous voulez.

Je suis le seul développeur, je veux accéder à mon repository partout dans le monde, mais de manière privée

2 formules sont possibles.

  • La formule, je paie un 3 ou 4 dollars à Github, et j'ai accès a quelques repositories privés.
  • La formule, non, j'ai du temps, et j'ai envie de trouver une solution "gratuite". Dans ce cas, ce billet te concerne :D

On est plusieurs développeurs et on veut héberger nos propres repositories

Ce billet est fait pour vous ;-)

Revenir au sommaire

Gitosis, c'est quoi concrètement ?

Gitosis est un gestionnaire de repository Git. Il permet très simplement d'appliquer des droits d'utilisations sur les repositories via un fichier de configuration. De manière générale, toutes les modifications faites par les développeurs, seront appliquées par un seul utilisateur. La couche d'accès aux repositories étant gérée par Gitosis.

Pour le développeur en bout de chaine, tout est transparent, sa seule "contribution" à l'élaboration du serveur Gitosis sera l'envoi de sa clé publique SSH à l'administrateur système. (Ne vous inquiétez pas, le développeur s'en donnera à cœur joie, pour une fois qu'on l'appelle au bureau et qu'on ne le critique pas sur ses développements. Voir le billet de capitaine e-commerce à ce sujet)

Revenir au sommaire

Schématisons ensemble le fonctionnement

Sur notre serveur Debian, nous avons un utilisateur (appelons-le "git") qui héberge tous les repositories. Gitosis sera installé pour cet utilisateur et seulement celui-ci. Gitosis traitera la partie "authentification" et "stockage" des repositories.

Via le fichier de configuration de Gitosis, nous indiquerons que tel utilisateur a les droits d'écritures sur tel repository.

Revenir au sommaire

Installation de Gitosis sur notre Debian 5

Ce tutoriel a été fait pour Debian 5, mais il peut tout aussi bien fonctionner pour Ubuntu (Ou du moins, je le suppose, vu qu'Ubuntu est basé sur Debian, enfin, après, c'est une question de gout et de culture :D)

Après, tout ce "blabla" conventionnel, lançons-nous dans l'installation de Gitosis.

Installation du paquet Gitosis

Les aficionados de Debian comme vous êtes, ne devrait pas avoir de difficultés à tapoter ceci dans une console.

sudo apt-get install gitosis

Installation du paquet git-core

En effet, tout au long de ce tutoriel vous risquez d'en avoir besoin :D

sudo apt-get install git-core

Création de l'utilisateur Git

L'utilisateur Git sur notre serveur va nous permettre de centraliser toutes les demandes via un seul utilisateur. Évitant ainsi les "permission denied" ;-)

sudo adduser --system --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /home/git git

Cet utilisateur est un utilisateur dit "système" sur notre Debian, comme en témoigne le retour de cette commande.

Ajout de l'utilisateur système « git » (identifiant : 106)...
Ajout du nouveau groupe « git » (identifiant : 108)...
Ajout du nouvel utilisateur « git » (identifiant : 106) avec le groupe « git »...

Création d'une clé SSH

Cette partie du tutoriel vous sera utile uniquement si vous ne disposez pas déjà d'une clé SSH. Si c'est le cas, passez à la partie suivante Initialisation de Gitosis, sinon, continuez la lecture ;-)

  • Édition du 10 mars à 14h30 : Une discussion a été faite autour de la sécurité des clés DSA et RSA. J'ai donc modifié mon billet en conséquence. (Le Commentaire sur le billet traitant de cette discussion est disponible ici)

Pour générer une clé SSH, il existe plusieurs chiffrement dont 2 particulièrement RSA et DSA. Après nombreux commentaires à ce sujet, et en allant un peu plus loin, difficile de choisir quel est la meilleure "sécurité", DSA tire la couverture vers elle à en croire cette page (Merci à @rhaamo pour m'avoir averti des autres possibilités)

Créons une clé DSA.

ssh-keygen -t dsa

Il vous sera demandé si vous voulez appliquer une "passphrase" sur votre clé SSH. Si vous choisissez de ne pas renseigner cette "passphrase", alors, si jamais vous perdez votre clé, n'importe qui pourra se connecter sur vos différents serveurs. Il est très dangereux de laisser une clé sans "passphrase"

La génération faite, vous allez avoir 2 fichiers dans votre /home/user_local/.ssh/

  • id_dsa : Elle est la clé privée, ne jamais la divulguer.
  • id_dsa.pub : C'est la partie publique de votre clé SSH, c'est celle-ci qui nous intéresse.

Afin d'éviter de ne devoir retaper sa passphrase, il existe "ssh-keygen", voir la partie "SSH-AGENT" de la page Configurer et utiliser SSH

Initialisation de Gitosis

Pour ce faire, nous avons besoin d'une clé SSH publique (et dont vous possédez la clé privée cela va de soit) afin d'initialiser Gitosis.

Au préalable, nous avons copié la clé publique sur notre serveur Debian dans le répertoire /tmp/ma_cle.pub

Identifions nous en tant qu'utilisateur "Git", puis, lançons l'initialisation de Gitosis

sudo -s
su - git
gitosis-init < /tmp/ma_cle.pub

Ceci va créer le repository "gitosis-admin" dans le répertoire personnel de Git, comme en témoigne la sortie ci-dessous.

Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/

Maintenant, dans le répertoire personnel de Git, nous retrouvons 2 répertoires.

git@debian1:~$ ls
total 20
drwxr-xr-x 5 git  git  4096 mar  6 05:09 .
drwxr-xr-x 4 root root 4096 mar  6 04:33 ..
drwxr-xr-x 2 git  git  4096 mar  6 05:09 gitosis
lrwxrwxrwx 1 git  git    53 mar  6 05:09 .gitosis.conf -> /home/git/repositories/gitosis-admin.git/gitosis.conf
drwxr-xr-x 3 git  git  4096 mar  6 05:09 repositories
drwx------ 2 git  git  4096 mar  6 05:09 .ssh

Revenir au sommaire

Configuration de Gitosis

L'installation terminée, il faut maintenant penser à le configurer ;-)

Pour se faire, il faut récupérer le repository "gitosis-admin" que nous venons d'initialiser. En effet, la configuration de Gitosis est à base d'un repository :D

Récupération du repository gitosis-admin

Nous lançons donc un "git clone" sur notre session utilisateur d'ou provient notre clé publique.

IP_DEBIAN étant soit le nom de domaine de votre serveur Debian, ou simplement son adresse IP.

git clone git@IP_DEBIAN:gitosis-admin.git

Et voilà, en retour, nous récupérons le fichier de configuration, ainsi que le dossier "keydir" contenant les clés SSH publiques.

Initialized empty Git repository in /home/utilisateur/gitosis-admin/.git/
The authenticity of host 'IP_DEBIAN (127.0.0.1)' can't be established.
RSA key fingerprint is 41:d2:d9:31:76:7d:bd:0d:5e:3f:19:db:5d:34:4d:9d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'IP_DEBIAN' (RSA) to the list of known hosts.
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
Receiving objects: 100% (5/5), 735 bytes, done.
remote: Total 5 (delta 0), reused 5 (delta 0)

utilisateur@debian1:~/gitosis-admin$ ls
gitosis.conf  keydir

La configuration de Gitosis ne se fera uniquement que par le biais de ce repository. Vous n'avez pas besoin de vous connecter sur le serveur pour le faire.

Fonctionnement de Gitosis

En ouvrant le fichier de configuration gitosis.conf du repository, on retrouve ceci.

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = mickael@debian1

Ceci indique que le repository "gitosis-admin" contient le membre "mickael@debian1"

En regardant dans le dossier keydir du repository "gitosis-admin" on identifie bien la clé publique associé à "mickael@debian1".

mickael@debian1:~/gitosis-admin$ ls -al keydir/
total 12
drwxr-xr-x 2 mickael mickael 4096 mar  6 05:23 .
drwxr-xr-x 4 mickael mickael 4096 mar  6 05:32 ..
-rw-r--r-- 1 mickael mickael  397 mar  6 05:23 mickael@debian1.pub

Revenir au sommaire

Création de notre premier repository avec Gitosis

Il faut bien une première fois à tout. Maintenant que nous disposons d'un système Gitosis pour centraliser nos repositories, lançons-nous ;-)

Ajout du repository "test" dans gitosis.conf

Petit cas pratique, nous voulons créer un repository nommé "test" mais pour l'instant seul notre utilisateur "mickael@debian1" aura accès à ce repository.

Éditons notre fichier gitosis.conf que nous venons de récupérer tout à l'heure. Et ajoutons-y les lignes suivantes.

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = mickael@debian1

[group test]
writable = test
members = mickael@debian1

Le fichier gitosis.conf étant maintenant modifié, envoyons maintenant les modifications à Gitosis.

git add gitosis.conf
git commit -m 'Ajout du repository test'
git push origin master

Ceci aura pour effet de prendre en compte l'ajout du repository "test", comme en témoigne le retour suivant.

mickael@debian1:~/gitosis-admin$ git push origin master
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 360 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@IP_DEBIAN:gitosis-admin.git
   4935644..394dcae  master -> master

Initialisation du repository "test"

Pour l'initialiser, nous allons créer un répertoire, et le transformer en repository Git. Ensuite, nous allons indiquer à Git que notre origin est git@IP_DEBIAN:test.git

mickael@debian1:~$ mkdir mon_repo
mickael@debian1:~$ cd mon_repo/

mickael@debian1:~/mon_repo$ git init
Initialized empty Git repository in /home/mickael/mon_repo/.git/
mickael@debian1:~/mon_repo$ git remote add origin git@IP_DEBIAN:test.git

mickael@debian1:~/mon_repo$ touch README
mickael@debian1:~/mon_repo$ git add README
mickael@debian1:~/mon_repo$ git commit -m 'Initialisation de mon repository'
Created initial commit 521af2b: Initialisation de mon repository
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README

mickael@debian1:~/mon_repo$ git push origin master:refs/heads/master
Counting objects: 3, done.
Writing objects: 100% (3/3), 220 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@IP_DEBIAN:test.git
 * [new branch]      master -> master

Voilà, notre repository est pleinement fonctionnel.

Voyons voir si nous "clonons" le repository dans un autre répertoire.

mickael@debian1:~$ mkdir mon_repo_fonctionne
mickael@debian1:~$ cd mon_repo_fonctionne/
mickael@debian1:~/mon_repo_fonctionne$ git clone git@IP_DEBIAN:test.git
Initialized empty Git repository in /home/mickael/mon_repo_fonctionne/test/.git/
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), 219 bytes, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
mickael@debian1:~/mon_repo_fonctionne$ cd test/
mickael@debian1:~/mon_repo_fonctionne/test$ ls -al
total 12
drwxr-xr-x 3 mickael mickael 4096 mar  6 06:03 .
drwxr-xr-x 3 mickael mickael 4096 mar  6 06:03 ..
drwxr-xr-x 8 mickael mickael 4096 mar  6 06:03 .git
-rw-r--r-- 1 mickael mickael    0 mar  6 06:03 README
mickael@debian1:~/mon_repo_fonctionne/test$ 

Pas de problème, nous voyons bien le fichier "README" qui a été "pushé" tout à l'heure.

Revenir au sommaire

Ajout d'un utilisateur sur un repository

Toute la puissance de Gitosis se base sur l'aisance qu'a l'administrateur système à ajouter un utilisateur sur un repository.

Imaginons, "kévin" est un utilisateur qui souhaite avoir accès à notre repository "test".

Kévin possède une clé SSH (au cas ou il n'en avait pas, nous lui aurions donné la partie Création d'une clé SSH à lire :D)

Édition du fichier gitosis.conf pour ajouter l'utilisateur "kevin" à notre repository "test"

Reprenons donc notre repository que nous avons récupéré tout à l'heure afin d'éditer le fichier gitosis.conf. Nous y ajoutons "kevin@monpc" comme ci-dessous.

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = mickael@debian1

[group test]
writable = test
members = mickael@debian1 kevin@monpc

Copie de la clé SSH publique de Kévin dans Gitosis

Nous avons au préalable copié la clé SSH publique de Kévin dans /tmp/kevin@monpc

Nous la copions dans le dossier "keydir" de notre repository Gitosis.

mickael@debian1:~/gitosis-admin$ cp /tmp/kevin@monpc.pub keydir/
mickael@debian1:~/gitosis-admin$ ls -al keydir/
total 16
drwxr-xr-x 2 mickael mickael 4096 mar  6 06:21 .
drwxr-xr-x 4 mickael mickael 4096 mar  6 06:19 ..
-rw-r--r-- 1 mickael mickael  395 mar  6 06:21 kevin@monpc.pub
-rw-r--r-- 1 mickael mickael  397 mar  6 05:23 mickael@debian1.pub

La configuration est terminée, envoyons nos modifications à Gitosis.

mickael@debian1:~/gitosis-admin$ git add .
mickael@debian1:~/gitosis-admin$ git commit -m "Ajout de l'utilisateur Kévin au repository 'test'"
Created commit 63d6c17: Ajout de l'utilisateur Kévin au repository 'test'
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 keydir/kevin@monpc.pub
mickael@debian1:~/gitosis-admin$ git push origin master
Counting objects: 6, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 738 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@IP_DEBIAN:gitosis-admin.git
   394dcae..63d6c17  master -> master

Test d'un git clone du repository "test" avec l'utilisateur "kevin"

Testons maintenant si l'utilisateur Kévin a accès au repository "test".

kevin@monpc:~$ git clone git@IP_DEBIAN:test.git
Initialized empty Git repository in /home/kevin/test/.git/
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), 219 bytes, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
kevin@debian1:~$ cd test/
kevin@debian1:~/test$ ls -al
total 12
drwxr-xr-x 3 kevin kevin 4096 mar  6 06:26 .
drwxr-xr-x 4 kevin kevin 4096 mar  6 06:26 ..
drwxr-xr-x 8 kevin kevin 4096 mar  6 06:26 .git
-rw-r--r-- 1 kevin kevin    0 mar  6 06:26 README

Testons également si l'utilisateur a un droit d'écriture sur le repository "test".

kevin@debian1:~/test$ touch README_KEVIN
kevin@debian1:~/test$ git add .
kevin@debian1:~/test$ git commit -m 'Ajout fichier Kévin'
Created commit afe246f: Ajout fichier Kévin
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README_KEVIN
kevin@debian1:~/test$ git push origin master
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 246 bytes, done.
Total 2 (delta 0), reused 0 (delta 0)
To git@IP_DEBIAN:test.git
   521af2b..afe246f  master -> master

Revenir au sommaire

Voilà, en espérant que ce billet vous ouvrira les portes de Git ;-)

Je remercie le billet Hosting Git repositories, The Easy (and Secure) Way de scie.nti.st qui m'a permis de comprendre un peu plus en profondeur le système Gitosis.

Comme d'habitude, si vous avez des remarques ou des suggestions, n'hésitez pas à m'en faire part sur allain.mickael@gmail.com

En vous souhaitant à tous une bonne journée.

Mickaël ALLAIN.

Vus : 5823
Publié par Mickaël : 9