This is an in-progress translation.
To help translate the book, please fork the book at GitHub and push your contributions.

Gitosis

De publieke sleutels van alle gebruikers in een authorized_keys bestand bewaren voor toegang werkt slechts tijdelijk goed. Als je honderden gebruikers hebt, dan is het moeizaam om dat proces te beheersen. Je moet iedere keer in de server inloggen, en er is geen toegangscontrole — iedereen in het bestand heeft lees- en schrijftoegang op ieder project.

Op dit punt wil je je misschien wenden tot een veelgebruikt software project genaamd Gitosis. Gitosis is in feite een set scripts die je helpen het authorized_keys bestand te beheren en eenvoudige toegangscontrole te implementeren. Het meest interessante gedeelte is dat de gebruikers interface voor deze applicatie om mensen toe te voegen en toegang te bepalen, geen web interface is maar een speciale Git repository. Je stelt de informatie in in dat project; en als je het pushed, dan herconfigureert Gitosis de server op basis van dat project, wat stoer is.

Gitosis installeren is niet de makkelijkste taak ooit, maar het is ook niet te moeilijk. Het is het makkelijkst om er een Linux server voor te gebruiken — deze voorbeelden gebruiken een standaard Ubuntu 8.10 server.

Gitosis vereist wat Python applicaties, dus moet je eerst het Python setuptools pakket installeren, wat Ubuntu meelevert als python-setuptools:

$ apt-get install python-setuptools

Vervolgens clone en installeer je Gitosis van de hoofdpagina van het project:

$ git clone git://eagain.net/gitosis.git
$ cd gitosis
$ sudo python setup.py install

Daarmee worden een aantal uitvoerbare bestanden geïnstalleerd, die Gitosis zal gebruiken. Daarna wil Gitosis zijn repositories onder /home/git stoppen, wat prima is. Maar je hebt je repositories al in /opt/git geconfigureerd, dus in plaats van alles te herconfigureren maken we een symbolische link aan:

$ ln -s /opt/git /home/git/repositories

Gitosis zal je sleutels voor je beheren, dus je moet het huidige bestand verwijderen, de sleutels later opnieuw toevoegen en Gitosis het authorized_keys bestand automatisch laten beheren. Voor nu verplaatsen we het authorized_keys bestand:

$ mv /home/git/.ssh/authorized_keys /home/git/.ssh/ak.bak

Nu moet je je shell terugzetten voor de ‘git’ gebruiker, als je het veranderd hebt naar het git-shell commando. Mensen zullen nog steeds niet in staat zijn in te loggen, maar Gitosis zal dat voor je beheren. Dus, laten we deze regel veranderen in je /etc/passwd bestand

git:x:1000:1000::/home/git:/usr/bin/git-shell

terug naar dit:

git:x:1000:1000::/home/git:/bin/sh

Nu wordt het tijd om Gitosis te initialiseren. Je doet dit door het gitosis-init commando met je eigen publieke sleutel uit te voeren. Als je publieke sleutel niet op de server staat zul je het daar naartoe moeten kopiëren:

$ sudo -H -u git gitosis-init < /tmp/id_dsa.pub
Initialized empty Git repository in /opt/git/gitosis-admin.git/
Reinitialized existing Git repository in /opt/git/gitosis-admin.git/

Dit staat de gebruiker met die sleutel toe de hoofd Git repository, die de Gitosis installatie beheert, aan te passen. Daarna zul je met de hand het execute bit op het post-update script moeten instellen voor je nieuwe beheer repository.

$ sudo chmod 755 /opt/git/gitosis-admin.git/hooks/post-update

Je bent nu klaar om te gaan. Als je alles juist hebt ingesteld, kun je nu met SSH in je server loggen als de gebruiker waarvoor je de publieke sleutel hebt toegevoegd om Gitosis te initialiseren. Je zou dan zoiets als dit moeten zien:

$ ssh git@gitserver
PTY allocation request failed on channel 0
fatal: unrecognized command 'gitosis-serve schacon@quaternion'
  Connection to gitserver closed.

Dat betekent dat Gitosis je herkend heeft, maar je buitensluit omdat je geen Git commando’s aan het doen bent. Dus, laten we een echt Git commando doen — je gaat de Gitosis beheer repository clonen:

# op je locale computer
$ git clone git@gitserver:gitosis-admin.git

Nu heb je een map genaamd gitosis-admin, die twee hoofd gedeeltes heeft:

$ cd gitosis-admin
$ find .
./gitosis.conf
./keydir
./keydir/scott.pub

Het gitosis.conf bestand is het beheer bestand, dat je zult gebruiken om gebruikers, repositories en permissies te specificeren. De keydir map is de plaats waar je de publieke sleutels opslaat van alle gebruikers die een vorm van toegang tot je repositories hebben — één bestand per gebruiker. De naam van het bestand in keydir (in het vorige voorbeeld, scott.pub) zal anders voor jou zijn — Gitosis haalt de naam uit de beschrijving aan het einde van de publieke sleutel die was geïmporteerd met het gitosis-init script.

Als je naar het gitosis.conf bestand kijkt, zou het alleen informatie over het zojuist geclonede gitosis-admin project mogen bevatten:

$ cat gitosis.conf
[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = scott

Het laat je zien dat de gebruiker ‘scott’ — de gebruiker met wiens publieke sleutel je Gitosis geïnitialiseerd hebt — de enige is die toegang heeft tot het gitosis-admin project.

Laten we een nieuw project voor je toevoegen. Je voegt een nieuwe sectie genaamd mobile toe, waar je de ontwikkelaars in je mobile team neerzet, en de projecten waar deze ontwikkelaars toegang tot moeten hebben. Omdat ‘scott’ op het moment de enige gebruiker in het systeem is, zul je hem als enig lid toevoegen en zul je een nieuw project genaamd iphone_project toevoegen om mee te beginnen:

[group mobile]
writable = iphone_project
members = scott

Wanneer je wijzigingen aan het gitosis-admin project maakt, moet je de veranderingen committen en terug pushen naar de server voordat ze effect hebben:

$ git commit -am 'add iphone_project and mobile group'
[master]: created 8962da8: "changed name"
 1 files changed, 4 insertions(+), 0 deletions(-)
$ git push
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 272 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@gitserver:/opt/git/gitosis-admin.git
   fb27aec..8962da8  master -> master

Je kunt je eerste push naar het nieuwe iphone_project doen door je server als een remote aan je locale versie van je project toe te voegen en te pushen. Je hoeft geen bare repositories handmatig meer te maken voor nieuwe projecten op de server — Gitosis maakt ze automatisch als het de eerste push ziet:

$ git remote add origin git@gitserver:iphone_project.git
$ git push origin master
Initialized empty Git repository in /opt/git/iphone_project.git/
Counting objects: 3, done.
Writing objects: 100% (3/3), 230 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitserver:iphone_project.git
 * [new branch]      master -> master

Merk op dat je geen pad hoeft te specificeren (sterker nog, het wel doen zal niet werken), alleen een dubbele punt en dan de naam van het project — Gitosis zal het voor je vinden.

Je wil samen met je vrienden aan dit project werken, dus je zult hun publieke sleutels weer toe moeten voegen. Maar in plaats van ze handmatig aan het ~/.ssh/authorized_keys bestand op je server toe te voegen, voeg je ze, één sleutel per bestand, aan de keydir map toe. Hoe je de sleutels noemt bepaalt hoe je aan de gebruikers refereert in het gitosis.conf bestand. Laten we de publieke sleutels voor John, Josie en Jessica toevoegen:

$ cp /tmp/id_rsa.john.pub keydir/john.pub
$ cp /tmp/id_rsa.josie.pub keydir/josie.pub
$ cp /tmp/id_rsa.jessica.pub keydir/jessica.pub

Nu kun je ze allemaal aan je ‘mobile’ team toevoegen zodat ze lees- en schrijftoegang hebben tot het iphone_project:

[group mobile]
writable = iphone_project
members = scott john josie jessica

Daarna commit en push je de wijziging, waarna vier gebruikers in staat zullen zijn te lezen en te schrijven van en naar dat project.

Gitosis heeft ook eenvoudige toegangscontrole. Als je wilt dat John alleen lees toegang tot dit project heeft, dan kun je in plaats daarvan dit doen:

[group mobile]
writable = iphone_project
members = scott josie jessica

[group mobile_ro]
readonly = iphone_project
members = john

Nu kan John het project clonen en updates krijgen, maar Gitosis zal hem niet toestaan om terug naar het project te pushen. Je kunt zoveel van deze groepen maken als je wilt, waarbij ze allen verschillende gebruikers en projecten mogen bevatten. Je kunt ook een andere groep als een van de leden specificeren (waarbij je @ als prefix gebruikt), om alle leden automatisch over te erven:

[group mobile_committers]
members = scott josie jessica

[group mobile]
writable  = iphone_project
members   = @mobile_committers

[group mobile_2]
writable  = another_iphone_project
members   = @mobile_committers john

Als je problemen hebt, kan het handig zijn om loglevel=DEBUG onder de [gitosis] sectie te zetten. Als je je push-toegang bent verloren door een kapotte configuratie te pushen, kun je het handmatig repareren in het bestand /home/git/.gitosis.conf op de server — het bestand waar Gitosis zijn informatie vandaan haalt. Een push naar het project neemt het gitosis.conf bestand dat je zojuist gepushed hebt en stopt het daar. Als je het bestand handmatig aanpast, zal het zo blijven totdat de volgende succesvolle push gedaan wordt naar het gitosis-admin project.