GIT、SSH 和 GIT-SHELL

GIT、SSH 和 GIT-SHELL

我正在尝试使用 ssh-keys 和 git-shell 设置一个安全的 git 存储库服务器。由于我们的用户数据库存储在中央 LDAP 目录中,我无法将用户的默认 shell 更改为 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

任何想法都值得赞赏...

答案1

你会发现类似的机制吉托莱特,基于 ssh 和强制命令
(包括ldap 查询)。
但是它不允许交互式 shell,这可能是你的问题

OP弗兰克·布伦纳添加:

啊,我明白了 - 命令必须用单引号引起来。我猜是$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'"行:它确实包含单引号。

答案2

我已经使用 LDAP、OpenSSH(> 4.9)和 git-shell 找到了解决方案。

OpenSSH 的 ForceCommand 非常适合这项工作。请考虑以下配置(除管理员外,每个人都必须使用 git-shell):

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

访问控制是使用 ACL-s 和 reponame 访问组定义的。

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”。

安道尔

答案3

这个authorized_keys对我有用,并且可以正确地被shell引用:

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

man sshd描述authorized_keys文件格式:

可以通过在命令中使用反斜杠来包含引号。

同一手册页描述restrict

启用所有限制,即禁用端口、代理和 X11 转发,以及禁用 PTY 分配和 ~/.ssh/rc 的执行。如果将来向 authorized_keys 文件添加任何限制功能,它们将包含在此集合中。

相关内容