mirror of
https://codeberg.org/puppe/mpuppe.de-blog-posts.git
synced 2025-12-20 01:12:17 +01:00
184 lines
6.9 KiB
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).
|