使用command=""
in authorized_keys
,我可以限制特定键可以运行的命令。
为了让 git 远程正常运行,我需要允许哪些命令?
从Pro Git 书我可以推断出这一点git-upload-pack
并且git-receive-pack
是必需的,但是还有其他吗?
注意我仍然希望能够正常登录用户,只是不使用此密钥。
答案1
Git 包括一个git-shell
适合用作仅 Git 登录 shell 的命令。它完全接受以下命令:
git receive-pack
git upload-pack
git upload-archive
git-receive-pack
git-upload-pack
git-upload-archive
cvs 服务器(用于模拟 CVS 服务器,Git 协议不需要)
所以这些是您需要允许的唯一命令。我有权访问的每个 Git 版本仅使用连字符版本。
git-shell
它本身可能也足以满足您想做的事情。
您可以通过设置GIT_SSH
回显参数的填充程序来验证 Git 正在为任何特定命令运行什么。制作一个脚本ssh.sh
:
#!/bin/bash
echo "$@" >&2
然后运行:
GIT_SSH="./ssh.sh" git push
您将看到它尝试运行的远程命令。
答案2
如果您不想将该用户帐户用于其他任何用途,您只需chsh
为该用户运行并选择/usr/bin/git-shell
(或它所在的位置)作为该用户的登录 shell。
但是,由于您只想仅在使用特定密钥时限制用户,因此我们需要创建一个帮助程序脚本来执行相同的操作。
例如,在(目标主机的)主目录中创建一个名为 的文件git-ssh-remote-command
,其中包含:
#!/bin/sh
exec git-shell -c "$SSH_ORIGINAL_COMMAND"
运行chmod a+rx /path/to/git-ssh-remote-command
使其可执行,然后在您的.ssh/authorized_keys
文件中使用它作为您想要限制为仅限 git 访问的密钥,例如:
restrict,command="/path/to/git-ssh-remote-command" ssh-dss 1478912c844...
在脚本的帮助下,这将限制密钥仅执行 git-shell 允许的命令。
笔记:默认情况下,git-shell 不允许 git-lfs 等所需的附加命令;如果需要,请参阅man git-shell
说明如何执行此操作。