我在我的服务器上托管了一个 git 存储库。任何人都可以从以下远程 URLpush
访问:pull
ssh://[email protected]/opt/git/my-project.git
具体来说,任何有权ssh
访问该[email protected]
用户的人都可以推送/拉取(即我将他们的公钥列为authorized_key
)
我想继续允许推送/拉取访问,但我想禁用 shell/登录访问
Github 使用这种方法 - 如果您尝试通过 ssh 进入他们的任何 git 服务器,您将获得:
$ ssh [email protected]
PTY allocation request failed on channel 0
Hi [USER]! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
具体来说,我想 -
- 禁用用户通过 ssh 和密码进行 shell
git
访问 - 仍然允许我自己(作为
root
)能够以git
交互方式假设用户 - 仍然允许开发人员
push
在pull
存储库上
git
我尝试按如下方式禁用用户的 shell :
root@example:~# usermod -s /usr/sbin/nologin git
ssh
这对于 #1(访问被阻止)和 #2(我仍然可以使用 访问 shell sudo -u git -s /bin/bash
)非常有效
但是,#3 是不可行的。切断 shell 访问显然也会禁用push
/pull
访问(因为它可能使用ssh
)。
这里还有其他解决方案吗? Github 本身是如何做到这一点的?
谢谢!
答案1
最简单的解决方案是使用 git-shell 作为用户的登录 shell。
关于如何设置的详细说明可以在这里找到:https://git-scm.com/docs/git-shell或者在 git shell 手册页上man git shell
答案2
在authorized_keys文件中,您可以添加使用特定密钥对进行身份验证时允许的选项/限制。
添加限制:no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
请参阅authorized_keys文件格式描述https://www.freebsd.org/cgi/man.cgi?sshd(8)因为它们的意义
cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB... comment
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDE... other comment
您可以通过在 sshd_config 文件中的“匹配用户”块中设置来向 git 帐户添加类似的限制:
### add this to the bottom of the sshd_config
Match User git
X11Forwarding no
AllowTcpForwarding no
PermitTunnel no