发现 Gitlab 的一个权限问题

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

现象

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

git@some.domain.name password:

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

尝试解决

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

1
cat /etc/ssh/sshd_config | grep PubkeyAuthentication

PubkeyAuthentication yes

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

1
2
supervisorctl restart redis
service gitlab restart

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

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

1
shutdown -r now

还是不行……

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

1
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 也很委屈——『怪我咯』。

1
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

1
chmod g-rwx /home/git

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

1
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 安全限制的问题。

1
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