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
- Gitosis, c'est quoi concrètement ?
- Schématisons ensemble le fonctionnement
- Installation de Gitosis sur notre Debian 5
- Configuration de Gitosis
- Création de notre premier repository avec Gitosis
- Ajout d'un utilisateur sur un repository
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 ;-)
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)
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.
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
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
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.
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
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.