mpuppe.de-blog-posts/posts/2014-05-23-git-repositories-ohne-root-rechte-hosten-mit-gitolite.markdown

184 lines
6.9 KiB
Markdown

---
layout: post
title: "Git-Repositories ohne Root-Rechte hosten mit Gitolite"
date: 2014-05-23 13:04:45 +0200
comments: true
categories: Linux
keywords: gitolite, git
---
Über die Vorzüge von [Git](http://git-scm.com/) brauche ich an dieser
Stelle nicht viele Worte verlieren. Das verteilte Versionkontrollsystem
ist bei der Software-Entwicklung ein äußerst nützliches Werkzeug. Ein
Server ist dabei nicht unbedingt notwendig, um es zu verwenden. Aber ein
zentrales Repository, das immer erreichbar ist, hat durchaus einige
Vorteile. In diesem Artikel möchte ich zeigen, wie einfach es ist, für
einzelne Benutzer oder für Gruppen Repositories auf einem Server zu
hosten. Und das Beste dabei ist: mehr als einen SSH-Zugang mit einfachen
Benutzerrechten braucht man dazu nicht!
Im Folgenden gehen wir davon aus, dass ein SSH-Zugang mit dem
Benutzernamen "benutzer" auf dem Server "server" vorhanden ist.
## Einzelne Benutzer
Möchte man ganz allein an einem Repository arbeiten, so ist die
Einrichtung besonders simpel. Es reicht aus, auf dem Server mit `git
init --bare repo.git`[^endung] ein "nacktes" Repository zu erzeugen,
also ein Repository das keine Arbeitsverzeichnis enthält. Unter der
Annahme, dass der vorhergehende Befehl im Verzeichnis $HOME/git des
Servers ausgeführt wurde, kann auf der lokalen Maschine jetzt mittels
`git clone benutzer@server:git/repo.git` ein Klon des Repositories
erstellt werden. Mit `git push` und `git pull` Änderungen zwischen
lokalem und entferntem Repository übermittelt werden.
## Gruppen
Nehmen wir nun an, dass wir auch anderen Personen lesenden oder
schreibenden Zugriff auf ein oder mehrere Repositories gewähren wollen.
Außerdem nehmen wir an, dass wir diesen Personen nur den Zugriff auf die
Repositories nicht aber auf unser komplettes Benutzerkonto gestatten
wollen. Ohne die notwendigen Rechte, um eigens dafür eine Unix-Gruppe zu
erstellen, scheint das Problem nur schwierig zu lösen zu sein. Doch dank
[gitolite](http://gitolite.com/gitolite/index.html) kann man einen
anderen Weg gehen. Neben Git muss der Server dazu nur zwei
Voraussetzungen erfüllen:
1. der Server muss SSH-Authentifizierung mittels Schlüsselpaar erlauben,
und
2. es muss ein Perl-Interpreter vorhanden sein.
Beides sollte unter den meisten Unix-Systemen gegeben sein.
Kurz zur Funktionsweise von Gitolite. SSH erlaubt die Authentifizierung
mittels
[Schlüsselpaar](https://de.wikipedia.org/wiki/Asymmetrisches_Kryptosystem).
Gitolite nutzt diesen Mechanismus, um am Schlüssel zu erkennen, welcher
Gitolite-Benutzer sich einloggt. Gitolite erlaubt dabei aber den
Benutzern nur den Zugriff auf die Git-Repositories nicht auf den
vollständigen Benutzer-Account.
### Gitolite einrichten
Als erstes erstellen wir auf dem lokalen Rechner ein SSH-Schlüsselpaar.
Dazu wird das Kommando `ssh-keygen` verwendet. Die Voreinstellung für
den Dateinamen kann man mit Return bestätigen. Es ist ratsam eine gute
Passphrase zu verwenden[^pass]. Den öffentlichen Teil des soeben
erzeugten Schlüsselpaares kopiert man nun auf den Server. Der Name der
Datei auf dem Server kann dabei frei gewählt werden, und entspricht dem
Namen unter dem Gitolite den Benutzer später kennen wird (hier:
"alice").
``` bash
scp $HOME/.ssh/id_rsa.pub benutzer@server:alice.pub
```
Nun loggen wir uns auf dem Server ein und stellen mittels `echo $PATH`
sicher, dass der Ordner `bin` im Homeverzeichnis existiert und Teil des
Suchpfads für ausführbare Dateien ist. Falls nicht:
``` bash
mkdir $HOME/bin
export PATH=$HOME/bin:$PATH
```
Damit die Änderung von `$PATH` auch nach dem Schließen des Terminals
oder dem Ausloggen erhalten bleibt, trägt man die zweite Zeile außerdem
in die Datei `$HOME/.profile` oder `$HOME/.bashrc` ein.
Nun wird Gitolite installiert und initialisiert. Hier im Beispiel wird
Gitolite in das Verzeichnis `$HOME/src/gitolite` installiert.
``` bash
mkdir $HOME/src
cd $HOME/src
git clone git://github.com/sitaramc/gitolite
gitolite/install -ln
cd $HOME
gitolite setup -pk alice.pub
```
Falls vorher schon der selbe SSH-Schlüssel zur Anmeldung verwendet
wurden, wird nach der Eingabe des letzten Befehls eventuell eine Warnung
angezeigt. Der Grund ist, dass der Schlüssel nun doppelt in der Datei
`$HOME/.ssh/authorized_keys` vorhanden ist. Falls dies der Fall ist,
sollte der entsprechende alte Eintrag entfernt werden. **ACHTUNG**: Mit
dem Schlüssel ist dann aber keine Anmeldung mehr mit vollem
Shell-Zugriff möglich, es sei denn der folgende Schritt wird ausgeführt.
### Einem Gitolite-Nutzer Shell-Zugriff erlauben
Dem Gitolite-Nutzer (hier "alice") dem der eigentliche SSH-Zugang
gehört, sollte man vollen Zugriff auf den (Unix-)Nutzeraccount gewähren.
Dazu wird zunächst der Befehl `echo alice
> $HOME/.gitolite.shell-users` ausgeführt. Dann wird an zwei Stellen die
Datei `$HOME/.gitoliterc` bearbeitet. Die erste Stelle ist die folgende
Zeile:
``` perl
# SHELL_USERS_LIST => "$ENV{HOME}/.gitolite.shell-users",
```
Hier wird das Zeichen # entfernt. Die zweite Stelle sieht so aus:
``` perl
# give some users direct shell access
# 'Shell',
```
Auch hier wird in der zweiten Zeile das # entfernt. Anschließend muss
noch der Befehl `gitolite compile; gitolite trigger POST_COMPILE`
ausgeführt werden.
### Administration von Gitolite
Damit ist die Einrichtung von Gitolite abgeschlossen. Nun stellt sich
die Frage, wie man weitere Benuter und Repositories hinzufügt. In
Gitolite wird die gesamte Administration über ein dafür bei der
Initialisierung erzeugtes Repository abgewickelt. Auf dem lokalen
Rechner wird dieses daher erst mal geklont:
``` bash
git clone benutzer@server:gitolite-admin.git
```
In diesem Repository befinden sich zwei Unterverzeichnisse, `conf` und
`keydir`. Benutzer kann man nun einfach hinzufügen, indem man deren
öffentliche Schlüssel nach `keydir` kopiert und sie nach dem Schema
`name.pub` benennt.
Um Repositories hinzuzufügen muss die Datei `conf/gitolite.conf`
bearbeitet werden. Ein Beispieleintrag sähe folgendermaßen aus:
``` text gitolite-admin/conf/gitolite.conf
repo foo
RW+ = alice
R = bob
RW = eve
```
In diesem Beispiel hat Alice darf lesen, schreiben und Rewinds
durchführen; Bob darf nur lesen; Eve darf lesen und schreiben, aber
keine Rewinds durchführen.
Nachdem Änderungen durchgeführt wurden, müssen diese committet werden und
auf den Server gepusht werden. Erst dann werden sie wirksam und hier im
Beispiel wird das Repository foo erstellt. Anschließend kann etwa Eve
mit
``` bash
git clone benutzer@server:foo.git
```
das Repository klonen. Wobei der Unix-Benuter "benutzer" für alle
Gitolite-Benutzer der selbe ist.
[^endung]:
Die Endung ".git" ist dabei nicht notwendig, aber per Konvention
werden so nackte Repositories kenntlich gemacht, um sie von normalen
Repositories zu unterscheiden.
[^pass]:
Eine gute Methode, um sichere Passphrasen zu erzeugen, die dennoch
leicht zu merken sind, ist
[Diceware](http://world.std.com/~reinhold/diceware.html).