恢复GitLab备份后,新的SSH公钥将随机取代其他用户的现有密钥

这发生在GitLab 8.6.4的新安装(未升级)上。

我安装了GitLab,我的团队对它进行了评估。 当然我和其他人进入了我们的SSH公钥。

作为我们评估的一部分,我做了一个GitLab备份并将其恢复。

在我恢复了备份之后,新用户Shung Wanginput了他的SSH公钥。

现在,每当我尝试通过SSH访问git仓库时,服务器都认为我是“王”。 例如,当我testing我的Ubuntu 14.04笔记本电脑的SSH连接时,我得到了这个:

ssh -T git@gitserver Welcome to GitLab, Shung Wang!

作为第二个testing,我试图克隆一个Shung无法访问的私有存储库:

git clone git@gitserver:sw/devops.git Cloning into 'devops'... GitLab: The project you were looking for could not be found. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

然后我让Shung成为devops项目的成员,并且git clone成功了。 我真的正在访问GitLab库作为王Sh。

显然这是一个最令人不满的安全情况。 我如何才能像GwangLa一样访问GitLab仓库?

说明

GitLab维护文件~git/.ssh/authorized_keys ,在这个文件中给出每个SSH公钥名称key-1key-2等等。

备份还原时,名称将重置为key-1 ,以便后续键具有重复的名称。 这里是我的~git/.ssh/authorized_keys文件,显示我的密钥和Shung Wang的密钥都被命名为key-1

 # Managed by gitlab-shell command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-1",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAA...2SkSQ== [email protected] ################################################################################################################################################################################### ##################################################################################################################################################################################### command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-1",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAA...nKQ== [email protected] ... 

显然最后一次出现的key-1都是用于我和Shung的。

我在GitLab问题1263中报告了这个GitLab错误。

解决方法

在错误修复之前,用户可以尝试这些解决方法。

解决方法1

使用sudo gitlab-rake gitlab:shell:setup来重buildauthorized_keys文件

解决方法2

我build议先尝试解决方法1。

以下是我发现解决方法之前我自己做的事情1。

  1. 恢复备份后,以现有用户身份login并注册一个新的SSH公钥
  2. search文件~git/.ssh/authorized_keys作为key-1 。 如果你发现两个,你有上面描述的问题。
  3. ######...这些行不是装饰。 它们是被用户删除的密钥。 当一个键被删除,GitLab用#replace它中的每个字符,大概是这样,剩下的键不会在文件中移动。 将备份恢复之前创build的所有SSH密钥中的所有字符replace为#字符,方式类似于上面显示的~git/.ssh/authorized_keys显示的方式。
  4. 告诉所有的用户他们必须重新input他们的SSH公钥。 如果他们抱怨,提醒他们感激备份的其余部分工作。

我怀疑你可以简单地将~git/.ssh/authorized_keys移到一边,用一个空文件replace,然后告诉每个人重新input他们的SSH公钥。 但是我没有自己尝试。 如果这对你有用,请在评论中告诉我们。