CentOS 服务器 GitLab 的 Git SSH 远程登录失败问题解决过程 发布 2020-02-23 / 更新 2020-02-24 / 3,674 次 / 快抢沙发 /

真正的理解与收获,是在一次次的问题解决过程中实现的。

问题:本地以 Git SSH 形式远程登录访问代码仓库报错,提示权限拒绝。
Server Environment
CentOS 7.6 x86_64
GitLab 12.2.5-ee
Local Environment
macOS 10.15.3
Git 2.21.1 (Apple Git-122.3)


前因:
最近云服务器上检测到有一个异常登录:以用户名 git 远程登录服务器的异常,而且提醒有密码被破解的可能性。我在想,我的服务器目前只有一个 root 账号,好像没有主动创建过用户 git 的账号,我去管理后台,通过相关命令行查看当前用户列表:cat /etc/passwd

1git:x:994:991::/var/opt/gitlab:/bin/sh


从以上显示结果来看,还真的有一个 git 用户:上面结果的第一个 : 之前的就是登录用户名,看到后面 GitLab 字眼,我就明白了,原来是我安装了 GitLab,然后 GitLab 自动创建了 git 用户。那么为了解决 git 远程登录服务器的异常,是不是禁止 git 用户登录就可以了呢,那么我们直接通过修改或者追加以下位置文件:/ect/ssh/sshd_config,禁止 git 用户远程登录。备注:想要使得这个修改配置生效,可以通过命令行重启 SSH 服务:service sshd restart。

1DenyUsers git


从这以后就没有服务器后台提醒的以用户名 git 远程登录服务器的异常了,以为没有什么问题了,结果过了两天,有人通过 ssh 形式访问 GitLab,代码提交不上去,这个时候问题就来了。

1git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags origin refs/heads/ifeegoo:refs/heads/ifeegoo
2Pushing to git@***.git
3Permission denied, please try again.
4Permission denied, please try again.
5git@***: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
6fatal: Could not read from remote repository.
7 
8Please make sure you have the correct access rights
9and the repository exists.
10Pushing to git@***.git
11Permission denied, please try again.
12Permission denied, please try again.
13git@***.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
14fatal: Could not read from remote repository.
15 
16Please make sure you have the correct access rights
17and the repository exists.
18Pushing to git@***.git
19Permission denied, please try again.
20Permission denied, please try again.
21git@***: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
22fatal: Could not read from remote repository.
23 
24Please make sure you have the correct access rights
25and the repository exists.
26Pushing to git@***.git
27Permission denied, please try again.
28Permission denied, please try again.
29git@***: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
30fatal: Could not read from remote repository.
31 
32Please make sure you have the correct access rights
33and the repository exists.
34Completed with errors, see above


我核查了一下 GitLab 运行情况,没有发现异样,而且上报的同学自己本地配置了多个 SSH public key 和 private key,同时有一些因素干扰了我的判断,让我觉得应该是他那边的问题,试了好久也没有试出来,然后提醒说可能是服务器要做出调整,我也回想起来,我对服务器的操作,就是禁止了 git 用户远程登录了,难道和这个有关?而且同学们通过用户名和密码形式访问 GitLab 仓库是没有问题,另外我记起来 Git SSH 形式访问的地址是 git@ 打头,这个应该就是可以理解为:以 git 用户身份通过 SSH 形式远程登录到服务器!于是我通过测试,取消禁止 git 通过远程登录,这个问题就解决了。但是,如果取消这个禁止,那么服务器又会安全警告,于是通过 Google 可以发现以下问题:

可以让服务器禁止 git 用户执行 /bin/sh,但是我们同时可以保留 Git Shell 的使用权限。降低操作风险。
说明:以上我的情况就是不要在 sshd_config 文件中设置 DenyUsers git,在 /etc/passwd 文件中配置即可。
备注:经过核查服务器的异常登录提醒基本上都是通过 Git SSH 远程登录不在常用地点导致的,并没有执行其他相关异常操作。


通过 Google 找到的答案都是通过修改:/etc/passwd 这个文件,将里面下面这段最后一个冒号后面的内容修改成 Git Shell 的目录:

1//初始
2git:x:994:991::/var/opt/gitlab:/bin/sh
3//修改成
4git:x:994:991::/var/opt/gitlab:/usr/bin/git-shell

修改了之后发现还是有问题,无法解决通过 Git SSH 形式访问远程代码仓库,我在想是不是这个路径下的 Git Shell 不存在,通过查找,我们的服务器里面根本就不存在 /usr/bin/git-shell,通过命令行查找其他地方的 git-shell,也不存在,网上说通过手动安装的 Git 在 CentOS 服务器中,就是那几个默认的路径了。我想到:我就没有单独手动安装过 Git,Git 应该是在安装 GitLab 的时候附带安装的。 这种安装一般都是内嵌的形式:embedded 形式,我们去找到 GitLab 相关的文件夹:

1/opt/gitlab holds application code for GitLab and its dependencies.
2 
3/var/opt/gitlab holds application data and configuration files that gitlab-ctl reconfigure writes to.
4 
5/etc/gitlab holds configuration files for omnibus-gitlab. These are the only files that you should ever have to edit manually.
6 
7/var/log/gitlab contains all log data generated by components of omnibus-gitlab.


通过 GitLab 的安装目录底下找到这个:/opt/gitlab/embedded/bin/git-shell,那看目录结构应该就是这个,于是修改 /etc/passwd 这个文件,将里面下面这段最后一个冒号后面的内容修改成 Git Shell 的目录。备注:这个文件的修改不需要通过命令行来生效,修改完了之后保存文件直接生效。

1//初始
2git:x:994:991::/var/opt/gitlab:/bin/sh
3//修改成
4git:x:994:991::/var/opt/gitlab:/opt/gitlab/embedded/bin/git-shell


然后果然还是不行!应该说没有错啊,到底是哪里的问题?越是这个时候,越要注意细节,不要慌乱,因为成功的钥匙马上就要拿到了,不要放弃。我们再去看 Git 执行的错误日志提醒,我们发现了一个非常重要的信息:fatal: unrecognized command ‘/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-42’。原来他是执行了 gitlab-shell,应该是 GitLab 内部针对 Git Shell 有一层封装,走的是 GitLab Shell。

1git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags origin refs/heads/ifeegoo:refs/heads/ifeegoo
2Pushing to git@***.git
3fatal: unrecognized command '/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-42'
4fatal: Could not read from remote repository.
5 
6Please make sure you have the correct access rights
7and the repository exists.
8Completed with errors, see above


我们再去修改 /etc/passwd 这个文件:

1//初始
2git:x:994:991::/var/opt/gitlab:/opt/gitlab/embedded/bin/git-shell
3//修改成
4git:x:994:991::/var/opt/gitlab:/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell

然后这次真的成功啦!经过以上整个过程的思考探索,我们终于解决了:由于禁用了 Git 用户远程 SSH 登录导致的 GitLab 的 Git 无法通过 SSH 形式远程访问代码仓库,同时解决 git 用户远程登录执行操作的风险。我觉得这个过程总结如下:
1.真正的理解与收获,是在一次次的问题解决过程中实现的。
说明:以前对于 Git 的 SSH 远程代码仓库地址的理解比较肤浅,以为以 git@ 这种打头格式,只是为了区分 http 方式,而没有理解为其实是以 git 用户名来通过 SSH 远程登录服务器的这种背后技术逻辑,虽然以前通过命令行的形式有 username@server 形式登录过服务器,但是没有想到 git@ 也是同样的道理。
2.类比比较思考很重要。
我在解决这个问题的时候,发现网上基本上清一色的都是手动安装的 Git,并没有提到通过安装 GitLab 的方式自带安装的 Git,同时 GitLab Shell 在某种程度上封装执行了 Git Shell 这些,如果我没有进一步的类比和比较,那么我最后也不会知道差一点,可能直接停留在修改 /usr/bin/git-shell 那一步,就推进不了了。
3.遇到问题和解决问题过程中,一定要不断尝试,不断对比,得到最关键的正确合理的步骤和知识体系。
说明:很多时候,我们解决了一个问题,但是不知道这个问题为什么被解决了,只是一知半解,甚至是稀里糊涂的解决的,不知道为什么,那么这种解决问题的过程和花费在这个问题上的精力,是一种很大的损失和浪费。例如我在网上找到的博客里面,很多仅仅是直接记录一个修改成 /usr/bin/git-shell,为什么要修改这个,为什么要指向 Git Shell,这个目录如何通过命令行或者手动方式来确认这个 Git Shell 路径是否存在,是否被调用。并没有进一步的去阐释和说明。
4.所有的问题解决,最终是形成我们的解决问题的思考逻辑,方式方法,性格塑造。
说明:无论是生活,工作,还是学习,有一个非常重要的共同点,那就是:解决问题的能力。如果我们不能够在解决同样的问题中,获得类似问题的解决能力,方式方法,那么我们最终还是会停留在最基础的层次,下次遇到了此类问题,不知道如何解决,或者还是稀里糊涂的解决,不利于我们融会贯通和能力的提升。

打赏
本博客所有文章如无特别注明均为原创。复制或转载请以超链接形式注明转自ifeegoo,原文地址《CentOS 服务器 GitLab 的 Git SSH 远程登录失败问题解决过程
上一篇: « 下一篇: »
Copyright © ifeegoo Time is limited, less is more! / 粤ICP备15109713号 / Theme by Hang & Ben / WordPress / 知识共享许可协议