请问github这类远程库是如何限制git用户ssh方式登录服务器同时又通过ssh方式提供git服务的?

马默
  • 6

目前找到的方法都是直接把git用户的终端从bash,sh换到git-shell,具体的原理搜不到

回复
阅读 441
1 个回答
✓ 已被采纳

github非开源,不知道它怎么实现的,但是gitlab开源,支持私有化部署,猜测他们实现的方案是一样的。

gitlab会在git这个用户的家目录下创建~/.ssh/authorized_keys 文件,这个文件控制的是用户级别的ssh key认证,是ssh自己的方案。具体可以看我以前总结的文章,提到过这个文件: https://blog.dteam.top/posts/...

我们先看看gitlab服务器的/etc/passwd的配置:

...
git:x:998:998::/var/opt/gitlab:/bin/sh
...

这样看git用户是允许登录ssh的,但是由于这个用户没有密码,所以只能通过密钥认证,对于密钥认证权限,我们需要检查git用户的~/.ssh/authorized_keys,对于本例来说就是/var/opt/gitlab/.ssh/authorized_keys,我们打开文件看看:

...
command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-59",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <用户的 ~/.ssh/id_rsa.pub文件的公钥内容>
...

这里就很明显了,通过command设置登录后强制运行的命令,其他参数都好理解,关闭了ssh某些功能,那我们具体看看这个命令执行结果呢?

$ /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-59
Welcome to GitLab, @fengyu!

由于开启了no-pty选项,因此你直接ssh git@my_gitlab_server会报错,无法分配一个pty无法登录,只能通过ssh -T git@my_gitlab_server打开一个无pty的非交互式连接,于是执行了command的结果输出

Welcome to GitLab, @fengyu!:

$ ssh -T git@my_gitlab_server
Welcome to GitLab, @fengyu!

于是至此真相大白。

你知道吗?

宣传栏