2016-11-06 2 views
0

У меня есть малина Pi, которую я использую в качестве сервера Git. Доступ к ним осуществляется несколькими физическими пользователями, и в настоящее время каждый из этих пользователей имеет свой собственный логин на сервере. Другими словами, пользователи John и Doe могут заходить на сервер с SSH, запустив ssh [email protected] или [email protected].Git: один пользователь git для управления репозиториями нескольких физических пользователей

Физические пользователи имеют частные репозитории Git, к которым никто другого пользователя не имеет доступа. Например. Репозитории John's находятся в /home/john/repos, а репозитории Doe находятся в /home/doe/repos на сервере.

Я хочу только одного пользователя, который называется git, который контролирует все репозитории пользователей. Например, вместо Джона, имеющего удаленный [email protected]:repos/project.git, он будет использовать [email protected]:john/project.git. Точно так же Доу подтолкнул бы к [email protected]:doe/some_other_project.git

Как это можно достичь, убедившись, что люди не могут получить доступ к репозиториям друг друга? Доступ к серверу осуществляется через SSH.

+0

В вашем текущем сценарии используются встроенные средства Unix для изоляции пользователей, которые вы не хотите использовать. Это означает, что вам нужно найти аналогичные функции, чтобы изолировать пользователей и добавить этот код к тому, что у вас есть сейчас. Это может быть сложнее, чем вы ожидаете. В чем причина, по которой вы не хотите использовать учетные записи пользователей unix? –

+0

Основная причина для этой установки заключается в том, что я хочу посмотреть, как это сделать, чтобы узнать больше о Git и UNIX. Например. Github и Bitbucket используют этот подход, поэтому я просто хотел понять, как это работает, и если это кажется приятным, я думал, что смогу его использовать. – lklun

ответ

0

Самое легкое решение - создать такой способ, как gitlab, который предоставляет веб-интерфейс, различные виды контроля доступа и всевозможные другие колокола и свистки.

Если вы действительно хотите, чтобы свернуть свой собственный:

Начать с directions in the Git book для настройки сервера, чтобы обеспечить доступ к общему пользователю через SSH.

Эти инструкции предоставят вам общую учетную запись git, доступ к которой у каждого будет доступ, и позволит любому пользователю нажать или вытащить из любого репозитория. Мы можем реализовать простой уровень авторизации, который будет ограничивать пользователей репозиториями в определенных каталогах.

Начните с небольшим скриптом обертки:

#!/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 

Это будет предварять префикс путь, при условии, как аргумент командной строки, чтобы все пути к хранилищам. Теперь нам нужно устроить эту оболочку для перехвата git-операций.

Для этого вам необходимо изменить открытые ключи, которые вы добавляете в файл git пользователя authorized_keys. Если вы следовали инструкциям в книге Git, файл authorized_keys будет иметь один или несколько открытых ключей в нем, как это:

ssh-rsa AAAA...== some comment 

Для каждого открытого ключа, вам нужно будет добавить опцию конфигурации, которая будет вызывать сценарий оболочки, который будет вызываться вместо исходной команды. На странице sshd людей:

Каждая строка файла содержит один ключ (пустые строки и строки, начинающиеся с «#», игнорируются как комментарии). Открытые ключи протокола 1 состоят из следующих пространственно разделенных полей: параметры, биты, показатель, модуль, комментарий. Открытый ключ протокола 2 состоит из: options, keytype, key64-кодированный ключ, комментарий. Поле опций является необязательным ...

И немного дальше:

Следующие спецификации опции поддерживаются (обратите внимание, что вариант ключевые слова нечувствительны к регистру): [...]

Команда "команда" =

Указывает, что команда выполняется всякий раз, когда этот ключ используется для проверки подлинности . Команда, предоставленная пользователем (если таковая имеется) игнорируется ... Команда, первоначально предоставленная клиентом, доступна в переменной среды SSH_ORIGINAL_COMMAND.

Имея это в виду, мы изменим наш authorized_keys файл выглядит примерно так:

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

Это означает, что, когда кто-то соединяется с соответствующим закрытым ключом, sshd будет работать git-wrapper.sh username, в результате чего наш git-wrapper.sh сценарий для добавления путей репозитория к строке username, гарантируя, что git будет видеть только репозитории в данном каталоге.Более конкретно, при запуске:

git push origin master 

И если предположить, что origin указывает на project.git на сервере мерзавца, то git будет пытаться запустить на удаленном сервере команду:

git-receive-pack project.git 

Наш обертку скрипт перехватывать, что и превратить его в:

git-receive-pack $1/project.git 

Так, например, если наш мерзавца git пользователя дома д irectory не имеет репозиториев:

git$ ls 

И наш файл authorized_keys выглядит следующим образом:

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] 

Тогда, если alice делает это:

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

Она будет видеть:

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

Если мы создаем целевой репозиторий:

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

Затем она может нажать:

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

Но если боб были попытаться клонировать этот репозиторий:

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

Он потерпит неудачу:

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

Ev ан, если он пытался что-то подлое:

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

И что, в несколько многословных словах, как вы можете получить доступ к авторизации для сервера репозитория Git. Обратите внимание, что все это было сделано только для демонстрационных целей; вам понадобится существенно более надежный скрипт в рабочей среде.

Смежные вопросы