2016-11-06 2 views
0

Ich habe ein Raspberry Pi, die ich als Git-Server verwenden. Es gibt mehrere physische Benutzer, die darauf zugreifen, und derzeit hat jeder dieser Benutzer seine eigene Anmeldung auf dem Server. Mit anderen Worten, die Benutzer John und Doe können sich mit SSH auf dem Server anmelden, indem sie ssh [email protected] oder [email protected] ausführen.Git: ein git Benutzer, um die Repos mehrerer physischer Benutzer zu steuern

Die physischen Benutzer haben private Git-Repositories, auf die kein anderer Benutzer zugreifen kann. Z.B. Johns Repos befinden sich in /home/john/repos und Does Repos befinden sich in /home/doe/repos auf dem Server.

Was ich will, ist nur ein Benutzer namens git, die alle Benutzer Repos steuert. Beispielsweise würde John anstelle der Fernbedienung [email protected]:repos/project.git[email protected]:john/project.git verwenden. In ähnlicher Weise würde Doe zu [email protected]:doe/some_other_project.git

schieben Wie kann dies erreicht werden, während sichergestellt wird, dass die Menschen nicht gegenseitig auf Repos zugreifen können? Der Zugriff auf den Server erfolgt über SSH.

+0

Ihr aktuelles Szenario verwendet integrierte Unix-Funktionen, um Benutzer zu isolieren, die Sie nicht verwenden möchten. Dies bedeutet, dass Sie ähnliche Funktionen zum Isolieren von Benutzern und Hinzufügen des Codes zu dem, was Sie jetzt haben, benötigen. Dies könnte komplexer als erwartet sein. Was ist der Grund, warum Sie keine Unix-Benutzer Logins wollen? –

+0

Der Hauptgrund für dieses Setup ist, dass ich sehen möchte, wie es geht, um mehr über Git und UNIX zu erfahren. Z.B. Github und Bitbucket verwenden diesen Ansatz, also wollte ich nur verstehen, wie das eigentlich funktioniert und wenn es nett scheint, dachte ich, ich könnte es benutzen. – lklun

Antwort

0

Die einfachste Lösung ist, etwas wie gitlab einzurichten, die eine Webschnittstelle, verschiedene Arten von Zugriffskontrolle und alle Arten von anderen Schnickschnack bietet.

Wenn Sie wirklich Ihren eigenen Rolle wollen: mit directions in the Git book

Start für die Einrichtung Ihres Servers Zugriff auf einen gemeinsamen Benutzer über ssh zu ermöglichen.

Diese Anweisungen erhalten Sie ein gemeinsames git-Konto, auf das jeder Zugriff hat, und würde jemand aus jedem Repository Push/Pull. Wir können eine einfache Autorisierungsschicht implementieren, die Benutzer auf Repositories in bestimmten Verzeichnissen beschränkt.

Beginnen Sie mit einem kleinen Wrapper-Skript:

#!/bin/sh 

repo_prefix=$1 

eval set -- $SSH_ORIGINAL_COMMAND 
case "$1" in 
    (git-receive-pack|git-upload-pack|git-upload-archive) 

     # prevent attempts at using dir/../path to escape 
     # repository directory 
     case "$2" in 
      (*..*) echo "Invalid repository name." >&2 
        exit 1 
        ;; 
     esac 

     repo_path="$repo_prefix/$2" 
     eval exec $1 $repo_path 
     ;; 

    (*) echo "Unsupported command" >&2 
     exit 1 
     ;; 
esac 

Dies wird ein Präfix Pfad, sofern als Befehlszeilenargument, um alle Repository-Pfaden voranstellen. Jetzt müssen wir dafür sorgen, dass dieser Wrapper Git-Operationen abfängt.

Um dies zu verwenden, müssen Sie die öffentlichen Schlüssel ändern, die Sie der git Benutzer authorized_keys Datei hinzufügen. Wenn Sie die Anweisungen in dem Git Buch gefolgt, die authorized_keys Datei eine oder mehrere öffentliche Schlüssel darin haben, wie folgt aus:

ssh-rsa AAAA...== some comment 

Für jeden öffentlichen Schlüssel, müssen Sie eine Konfigurationsoption hinzufügen, dass die verursachen Wrapper-Skript, das anstelle des ursprünglichen Befehls aufgerufen wird. Von der sshd Manpage:

Jede Zeile der Datei enthält einen Schlüssel (Leerzeilen und Zeilen mit einem ‚#‘ beginnen, werden als Kommentare ignoriert). Öffentliche Schlüssel für Protokoll 1 bestehen aus der folgenden durch Leerzeichen getrennten Felder: Optionen, Bits, Exponent, Modul, Kommentar. Der öffentliche Schlüssel des Protokolls 2 besteht aus: Optionen, Schlüsseltyp, base64-codierter Schlüssel, Kommentar. Das Optionsfeld ist optional ...

Und etwas weiter unten:

Die folgende Option Spezifikationen unterstützt werden (beachten Sie, dass Option Schlüsselwörter Groß- und Kleinschreibung): [...]

command = "command"

Gibt an, dass der Befehl ausgeführt wird, wenn dieser Schlüssel für die Authentifizierung verwendet wird. Der vom Benutzer angegebene Befehl (falls vorhanden) wird ignoriert ... Der ursprünglich vom Client bereitgestellte Befehl ist in der Umgebungsvariablen SSH_ORIGINAL_COMMAND verfügbar.

Vor diesem Hintergrund haben wir unsere authorized_keys Datei ändern etwas wie folgt aussehen:

command="/usr/bin/git-wrapper.sh username" ssh-rsa AAAA...=== 

Das bedeutet, dass, wenn jemand mit dem entsprechenden privaten Schlüssel verbindet, sshdgit-wrapper.sh username laufen wird, unser git-wrapper.sh Skript verursacht Repository-Pfaden mit der Zeichenfolge username voranzustellen, um sicherzustellen, dass git nur Repositorys im angegebenen Verzeichnis anzeigt.Genauer gesagt, wenn Sie laufen:

git push origin master 

Und unter der Annahme, dass origin Punkte project.git auf dem git-Server, dann git den Befehl auf dem Remote-Server ausgeführt wird versuchen:

git-receive-pack project.git 

Unser Wrapper-Skript wird abfangen, dass und verwandeln es in:

git-receive-pack $1/project.git 

So zum Beispiel, wenn unsere git git Benutzer zu Hause d irectory hat keine Repositories:

git$ ls 

Und unsere authorized_keys Datei wie folgt aussieht:

git$ cat .ssh/authorized_keys 
command="/usr/bin/git-wrapper.sh alice" ssh-rsa ... [email protected] 
command="/usr/bin/git-wrapper.sh bob" ssh-rsa ... [email protected] 

Dann, wenn alice dies tut:

alice$ git remote add origin [email protected]:project.git 
git push origin master 

Sie sehen:

fatal: 'alice/project.git' does not appear to be a git repository 
fatal: Could not read from remote repository. 

Wenn wir die Ziel-Repository zu erstellen:

git$ mkdir alice 
git$ git init --bare alice/project.git 

Dann kann sie drücken:

alice$ git push origin master 
[...] 
To [email protected]:project.git 
* [new branch]  master -> master 

Aber wenn Bob versuchen ist, dass Repository zu klonen:

bob$ git clone [email protected]:project.git 

Es wäre fehl:

fatal: 'bob/project.git' does not appear to be a git repository 
fatal: Could not read from remote repository. 

Ev en, wenn er etwas versucht, hinterhältig:

bob$ git clone [email protected]:../alice/project.git 
Invalid repository name 
fatal: Could not read from remote repository. 

Und das in einem etwas ausführlichen Kurz gesagt, ist, wie Sie die Berechtigung für Ihre Git Repository-Server zugreifen können. Beachten Sie, dass dies alles nur zu Demonstrationszwecken getan wurde; Sie möchten ein wesentlich robusteres Skript in einer Produktionsumgebung.

Verwandte Themen