Назад | Перейти на главную страницу

GIT, SSH и GIT-SHELL

Я пытаюсь настроить безопасный сервер репозитория git с помощью ssh-ключей и git-shell. Поскольку наша база данных пользователей хранится в центральном каталоге LDAP, я не могу изменить пользовательскую оболочку по умолчанию на git-shell, поэтому я попытался добавить команду git-shell к открытому ключу в файле authorized_users следующим образом:

command="git-shell -c $SSH_ORIGINAL_COMMAND" ssh-dss AAAAB3NzaC1kc3...

Однако git-shell не позволяет мне даже клонировать репозиторий:

    dhcp202:git-ws frank$ git clone ssh://gitserver/var/repos/git/myrepo/
    Cloning into myrepo...
    fatal: What do you think I am? A shell?
    fatal: The remote end hung up unexpectedly

Любые идеи приветствуются ...

Я сделал решение, используя LDAP, OpenSSH (> 4.9) и git-shell.

ForceCommand OpenSSH идеально подходит для этой работы. Рассмотрим следующую конфигурацию (все, кроме администраторов, должны использовать git-shell):

Match group *,!admin    
    ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

Контроль доступа определяется с помощью ACL-списков и групп доступа для повторного имени.

setfacl -bR -m default:group:$REPONAME:rwX -m group:$REPONAME:rwX $GITROOT/$REPONAME
setfacl -R -m default:group:$REPONAME-ro:r-X -m group:$REPONAME-ro:r-X $GITROOT/$REPONAME

Не забывайте запускать "nscd -i group" после каждого изменения.

Андор

Вы найдете аналогичный механизм с гитолит, на основе ssh и принудительная команда.
(включая ldap запросы).
Однако он не позволяет интерактивную оболочку, что может быть вашей проблемой там.

ОП Фрэнк Бреннер добавляет:

А, разобрался - команда должна быть в одинарных кавычках. я полагаю $SSH_ORIGINAL_COMMAND расширялся до запуска git-shell.

Это подтверждается в сценарии принудительной команды gitolite, который является Perl-сценарием, заканчивающимся:

# ----------------------------------------------------------------------------
#       over to git now
# ----------------------------------------------------------------------------

if ($ENV{REQUEST_URI}) {
    log_it($ENV{REQUEST_URI});
    exec $ENV{GIT_HTTP_BACKEND};
    # the GIT_HTTP_BACKEND env var should be set either by the rc file, or as
    # a SetEnv in the apache config somewhere
}

log_it();

$repo = "'$REPO_BASE/$repo.git'";
exec("git", "shell", "-c", "$verb $repo") unless $verb eq 'git-init';

Обратите внимание $repo = "'$REPO_BASE/$repo.git'" строка: содержит одинарные кавычки.

Этот authorized_keys работает для меня и правильно цитируется в оболочке:

restrict,command="/usr/bin/git-shell -c \"$SSH_ORIGINAL_COMMAND\"" ssh-rsa AAAAB3NzaC1yc2EAA...

man sshd описывает формат файла authorized_keys:

Цитата может быть включена в команду, заключив ее в кавычки с обратной косой чертой.

На той же странице руководства описывается restrict:

Включите все ограничения, то есть отключите перенаправление порта, агента и X11, а также отключите выделение PTY и выполнение ~ / .ssh / rc. Если какие-либо возможности ограничения будут добавлены в файлы authorized_keys, они будут включены в этот набор.