3

Сначала я объясню мои настройки. Я работаю в системе, не являющейся самоуправляемой, в которой у меня есть учетная запись без прав root/ повышенных прав. В этой системе я хочу поделиться несколькими репозиториями git для разных групп людей. Действия, предпринятые для реализации общего репозитория git, приведены ниже. Я разделил их по командам, выполняемым в терминале bash в системе REMOTE и LOCAL. ps: заменить любые переменные, окруженные разделителями <и>, соответствующими значениями.

----------- УДАЛЕНО (моя система): -----------

bash-4.2> mkdir -p <path>/<to>/project.git
bash-4.2> cd <path>/<to>/project.git
bash-4.2> git init --bare
bash-4.2> ssh-keygen -t rsa -f ~/.ssh/gitkey_rsa -N <password>
bash-4.2> echo "command=\"git-shell -c \\\"\$SSH_ORIGINAL_COMMAND\\\"\",
    no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty \
    $(cat ~/.ssh/gitkey_rsa.pub)" >> ~/.ssh/authorized_keys

Эти команды делают следующее:

  1. создать репозиторий git
  2. генерировать ключ ssh
  3. добавить ключ для авторизованных ключей с предварительно установленными ограничениями

----------- МЕСТНЫЙ (другие пользователи) -----------

bash-4.2> mv <path>/<to>/gitkey_rsa ~/.ssh
bash-4.2> echo -e "Host gitserver\n\
    \tHostName <remote server>\n\
    \tUser <remote user>\n\
    \tIdentityFile ~/.ssh/gitkey_rsa" >> ~/.ssh/config
bash-4.2> git clone gitserver:/home/<remote user>/<path>/<to>/project.git

Эти команды делают следующее:

  1. поместите ключ rsa в каталог ~/.ssh
  2. добавить правило в ~/.ssh/config, указав имя хоста 'gitserver' с ключом
  3. получить содержимое хранилища

Используемые команды основаны на ограничении доступа только к git. Используя ограниченный ключ, пользователю разрешено выполнять только команды git. Проблема в том, что пользователю также разрешен доступ к каждому git-репозиторию в удаленной системе. Я хотел бы ограничить доступ только к одному хранилищу для каждого ключа ssh. Другими словами, я бы хотел ограничить доступ к одной папке, содержащей репозиторий git, через ограничения по ключу ssh.

Решения, которые я нашел до сих пор: доступ только к определенным каталогам через ssh и ограничение доступа пользователя SSH к одной папке. Они либо хотят, чтобы вы установили (S)FTP-сервер, WebDAV, либо создали нового пользователя с ограниченными правами. Это не то, что я ищу, так как для этого требуются права суперпользователя. Из-за того, что команды могут быть ограничены с помощью ключей ssh, разве нет способа ограничить права доступа?

С уважением

1 ответ1

1

Возможное решение:

Когда я печатал вопрос, я нашел решение. Но мне кажется, должно быть более простое и безопасное решение этой проблемы. Что я сделал, так это изменил значение 'command' в файле authorized_keys на:

command="~/somescript.sh" 

И «somescript.sh» содержит:

#!/bin/bash
ALLOW=(
    '/home/<user>/repository1.git'
    '/home/<user>/repository2.git'
)

case $SSH_ORIGINAL_COMMAND in
    "git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
        GITPATH=$(echo $SSH_ORIGINAL_COMMAND | sed -r "s:.*'([^']*)'.*:\1:g")
        ALLOWED="false"
        for ((i=0; i < ${#ALLOW[@]}; i++)); do
            if [ "${ALLOW[$i]}" == "$GITPATH" ]; then
                ALLOWED="true"; break;
            fi
        done

        if [ "$ALLOWED" == "true" ]; then
            eval "git-shell -c \"$SSH_ORIGINAL_COMMAND\""
        else
            echo "[ERROR] ACCESS DENIED" >&2
            exit 1
        fi
        ;;
    *)
        echo "[ERROR] Only git commands are allowed!" >&2
        exit 1
        ;;
esac

В скрипте я использую тот факт, что команды git clone, git push и git pull производят на удаленной стороне:

git-upload-pack '<path>/<to>/<repository>', or
git-receive-pack '<path>/<to>/<repository>'

Я указываю репозитории в переменной ALLOW, доступ к которым разрешен через ключ ssh, использующий скрипт, и просто сравниваю их с путем, указанным в введенной команде git (переменная GITPATH). Однако существует угроза безопасности, когда в одной строке выдается несколько команд git. Если команда содержит хотя бы одно упоминание о разрешенном хранилище, она выполняет всю команду. Есть предложения по улучшению?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .