我正在尝试使用 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 文件添加任何限制功能,它们将包含在此集合中。