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

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

我希望能够使用 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?错误消息。

答案1

以下对我有用。

~/.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

答案2

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

关键是添加\"环境变量。

在 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...

答案3

重力的解决方案可以很容易地修改,只需更换行

        exec $SSH_ORIGINAL_COMMAND

与线

        git-shell -c "$SSH_ORIGINAL_COMMAND"

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

答案4

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

如果您确实有一个用户帐户,并且想要以两种方式使用:

  • 使用密钥认证连接时,仅用于 git
  • 当使用密码验证连接或使用不同的私钥时,提供完整的 shell

...那么本主题中的其他答案也适用。但是,如果您有能力为 git 分配单独的用户,那么将其 shell 设置为git-shell是限制它的最简单方法,并且由于它不需要额外的 shell 脚本,因此更安全。

相关内容