Я пытаюсь настроить безопасный сервер репозитория 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, они будут включены в этот набор.