用了好几年的 gitlab,前前后后搭建了好几次系统,解决了不少问题,还是非常熟悉了。昨天又遇到 gitlab 搭建中的一个新的问题。

现象

gitlab 搭建好之后,建账号,加 ssh key,建项目,本地 push,然后就遇到 gitlab 问我要密码。

git@some.domain.name password:

项目是我创建的,ssh key 也有添加,还找我要密码,明显不科学。

尝试解决

首先,检查了服务器的 sshd 设定,确认启用了 ssh 登录。

cat /etc/ssh/sshd_config | grep PubkeyAuthentication

PubkeyAuthentication yes

以为是缓存,分别重启了 redis 和 gitlab。(PS:我的 redis 用 supervisor 管理起来的)

supervisorctl restart redis
service gitlab restart

然后等了五分钟再试(其实没有必要),还是不行。

上网查,stackoverflow 上有一个非推荐答案说,重启服务器之后就好了。于是,又重启了服务器。

shutdown -r now

还是不行……

ssh -T 命令测试一下,看看结果。

ssh -vvvT git@some.domain.name

…… 一串无关的日志我就省略了,只说重点。

…… debug3: send_pubkey_test debug2: we sent a publickey packet, wait for reply debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug2: we did not send a packet, disable method debug3: authmethod_lookup password debug3: remaining preferred: ,password debug3: authmethod_is_enabled password debug1: Next authentication method: password git@some.domain.name’s password:

请注意省略号下面第四行,以 debug2 打头的那行。一次正确的、以 ssh publickey 方式登录的行为,应该是下面这样的:

…… debug3: send_pubkey_test debug2: we sent a publickey packet, wait for reply debug1: Server accepts key: pkalg ssh-rsa blen 279 debug2: input_userauth_pk_ok: fp 14:8a:99:ec:b4:XX:XX:XX:XX:XX:67:1d:31:bb:fe debug3: sign_and_send_pubkey: RSA 14:8a:99:ec:b4:XX:XX:XX:XX:XX:67:1d:31:bb:fe debug1: key_parse_private2: missing begin marker debug1: read PEM private key done: type RSA debug1: Authentication succeeded (publickey). Authenticated to some.domain.name ([XXX.XX.XX.69]:XXXX).

很明显,还是 ssh publickey 方式过程中出了问题。

那就上服务器看看吧,到底能有什么问题。

找到问题

登录服务器,tail /var/log/secure 查看 ssh 的登录情况,果然发现一些情况。

Dec 5 15:41:54 dev sshd[9417]: Authentication refused: bad ownership or modes for directory /home/git

/home/git 目录是按照 manually installation 里面 step by step 安装生成的,所有里面的内容都是原装,不可能出现意外啊。/home/git 也很委屈——『怪我咯』。

ls -la /home/git

total 84 drwxrwx— 13 git git 4096 Dec 5 16:03 . drwxr-xr-x. 3 root root 4096 Nov 28 23:38 .. -rw——- 1 git git 2239 Dec 5 15:57 .bash_history -rw-r–r– 1 git git 18 Mar 6 2015 .bash_logout -rw-r–r– 1 git git 193 Mar 6 2015 .bash_profile -rw-r–r– 1 git git 537 Nov 29 13:03 .bashrc drwxrwxr-x 2 git git 4096 Nov 29 09:35 bin drwxrwxr-x 2 git git 4096 Nov 29 01:01 .bundle drwxrwxr-x 3 git git 4096 Nov 28 23:38 .cache drwxrwxr-x 3 git git 4096 Nov 28 23:38 .config -rw-r–r– 1 git git 25 Nov 29 00:34 .gitconfig drwxrwxr-x 20 git git 4096 Nov 29 09:44 gitlab drwxrwxr-x 8 git git 4096 Dec 5 16:34 gitlab-shell drwxrwxr-x 5 git git 4096 Nov 29 09:48 gitlab-workhorse -rw——- 1 git git 13 Nov 29 09:53 .mysql_history drwxr-xr-x 8 git git 4096 Nov 29 09:39 n drwxrw—- 3 git git 4096 Nov 28 23:38 .pki drwxrwx— 12 git git 4096 Nov 30 19:49 repositories drwx—— 2 git git 4096 Dec 5 16:13 .ssh -rw——- 1 git git 4938 Dec 5 16:03 .viminfo

/home/git 目录是 0770,不是应该是 0700 吗?

解决办法

想一想,gitlab 和它附属的组件都是以 git 用户的身份启动的吧,git 用户组除了 git 用户之外,没有别的用户了。于是,动手将 /home/git 的权限修改为 0700

chmod g-rwx /home/git

结果还是悲剧了,ssh -T 通过,但是 git push 的时候报错了。

git push -u origin master

GitLab: API is not accessible fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists.

看来 /home/git 的权限还是修改不得,虽然是非安全的权限,但是非它不可。gitlab 这点太 low 了,竟然依赖于非安全的权限配置。

最后还是万能的 stackoverflow 提点,帮忙解决了 sshd 安全限制的问题。

vim /etc/ssh/sshd_config

查找 StrictModes,修改。

StrictModes no

保存,退出,重启 sshd,service sshd restart。再试,Ok。

后记

为了能用 gitlab,将 sshd 的权限修改为不推荐的安全配置,实在是不情愿。考虑到服务器目前只有我一个人操作,因此暂时接受了这种方案。但在生产环境,这点应该是不能允许的吧。

因为时间问题没有仔细去跟修改 home 目录权限后报错的原因,不知道是哪个 gitlab 的组件需要这个目录下的权限。跟踪之后也许可以不依赖 gitlab 完成修正。有兴趣的同学可以试一下。

PS:补充各部分的版本号

  • CentOS=7.2
  • Gitlab=8.2.1
  • Redis=2.8.19