您可以在.ssh / authorized_keys中指定git-shell来限制通过ssh仅访问git命令吗?


37

我希望能够使用ssh密钥进行身份验证,但仍然限制可以通过ssh隧道执行的命令。

使用Subversion,我可以通过使用.ssh / authorized_keys文件来实现此目的,例如:

command="/usr/local/bin/svnserve -t --tunnel-user matt -r /path/to/repository",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIetc...

我已经在命令中使用“ / usr / bin / git-shell”尝试了此操作,但是我只是收到了时髦的旧fatal: What do you think I am? A shell?错误消息。

Answers:


30

以下对我有用。

~/.ssh/authorized_keys

command="./gitserve",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB…

~/gitserve脚本中:

#!/bin/sh
exec git-shell -c "$SSH_ORIGINAL_COMMAND"

请注意,如果您放置gitserve的目录不是主目录,则必须在中调整command="./gitserve"参数authorized_keys


答对了!这就像我希望实现的那样!谢谢。
马特·康诺利

在上所以这个相关的职位stackoverflow.com/questions/5871652/...他们指出,这里另一种解决方案:joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys
蒂姆·

1
@Tim本质上是相同的解决方案,但是使用perl将〜/ gitserve脚本的内容压缩为授权密钥。就个人而言,我更喜欢将其保存在单独的脚本中。
尼尔·梅休

1
我了解,我只是将其添加为参考。
蒂姆(Tim)

在此配置中,您将用户设置为什么外壳?/bin/bash
M-Pixel

33

我可以直接在authorizedKeys文件中成功使用git-shell,而无需使用附加脚本。

关键是\"在env变量周围添加。

在rhel6 openssh-server-5.3p1-70.el6.x86_64中进行了测试:

no-port-forwarding,no-agent-forwarding,command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"" ssh-dss AAAA...


2
就个人而言,我会提供的完整路径git-shell,但这可能只是妄想症。
Ulrich Schwarz

有没有人找到一种方法来限制它可以访问的目录?我发现我可以在执行git-shell之前先进入cd目录,但是git-shell允许使用“ ..”和绝对路径。
yokto

5

通过更换生产线,可以轻松修改Grawity的解决方案以使其正常工作

        exec $SSH_ORIGINAL_COMMAND

与线

        git-shell -c "$SSH_ORIGINAL_COMMAND"

引号解决了上面报告的问题,用git-shell替换exec似乎更安全。


4

git-shell设计用作登录外壳程序,以便它将-c "originalcommand"作为参数接收。OpenSSH中的“强制命令”不会发生这种情况。而是将强制命令传递到已配置的Shell。

您可以做的是编写一个脚本来检查$SSH_ORIGINAL_COMMAND并执行它。bash中的示例:

#!/bin/bash

SSH_ORIGINAL_COMMAND=${SSH_ORIGINAL_COMMAND/#git /git-}

case $SSH_ORIGINAL_COMMAND in
    "git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
        eval exec $SSH_ORIGINAL_COMMAND
        ;;
    *)
        echo "Go away." >&2
        exit 1
        ;;
esac

@Matt:git-shell(1)说命令是git <cmd>,不是git-<cmd>吗?
grawity 2011年

嗯...我根据运行时看到的内容进行了更改。通过bash脚本和ruby脚本,我看到了“ git-receive-pack”作为命令。我的话man git-shell(git 1.7.3.4):目前,只允许调用四个命令,git-receive-pack git-upload-pack和git-upload-archive(带有单个必需参数),或cvs服务器(调用git -cvsserver)。
马特·康诺利

格式在注释中不起作用:(
Matt Connolly

1
这对我不起作用,因为我的git客户端(1.7.5.4)用单引号发送了回购名称,大概是因为它希望由shell解释整个命令行。执行程序$ SSH_ORIGINAL_COMMAND然后将单引号传递给git-receive-pack等,因此找不到存储库。
尼尔·梅休

感谢您的解决方案,grawity,但它不为我工作,因为这是报告的尼尔·梅休同样的原因......我的git的1.7.x版本也将回购名称用单引号,最终导致的$SSH_ORIGINAL_COMMAND是无效,并导致git-shell
震荡


1

为了完整起见,并且由于原始问题未指定非git事物必须使用同一帐户,因此显而易见的答案是使用git-shell其设计用途:将其设置为登录外壳程序(即,使用usermod,在/etc/passwd)中为该ssh用户。

如果您只有一个用户帐户,则要使用两种方式:

  • 使用密钥验证进行连接时,仅用于git
  • 使用密码身份验证或使用其他私钥进行连接时,请提供完整的外壳

...然后该线程中的其他答案适用。但是,如果您有能力为git分配一个单独的用户,那么将其shell设置git-shell为限制它是最简单的方法,并且由于不需要任何其他shell脚本而更加安全。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.