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

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

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

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

作为评估的一部分,我制作了 GitLab 备份并恢复了它。

在我恢复备份后,新用户 Shung Wang 输入了他的 SSH 公钥。

现在,每当我尝试通过 SSH 访问 git 存储库时,服务器都会认为我是 Shung Wang。例如,当我从 Ubuntu 14.04 笔记本电脑测试我的 SSH 连接时,我得到了以下信息:

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

作为第二次测试,我尝试克隆 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成功了。我确实以 Shung Wang 的身份访问 GitLab 存储库。

显然,这是最令人不满意的安全状况。我如何才能以 Shung Wang 以外的人的身份访问 GitLab 存储库?

答案1

解释

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 错误GitLab 问题 1263

解决方法

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

解决方法 1

使用sudo gitlab-rake gitlab:shell:setup重建authorized_keys文件

解决方法 2

我建议首先尝试解决方法1。

以下是我在发现解决方法 1 之前实际做的事情。

  1. 恢复备份后,以现有用户身份登录并注册新的 SSH 公钥
  2. 搜索文件~git/.ssh/authorized_keyskey-1如果找到两个,则表明存在上述问题。
  3. 这些行######...不是装饰。它们是用户删除的密钥。删除密钥时,GitLab 会将其中的每个字符替换为#,大概是为了让剩余的密钥不会在文件中移动。将备份还原之前创建的所有 SSH 密钥中的所有字符替换为 字符#,方式类似于您在上图中看到的方式~git/.ssh/authorized_keys
  4. 告诉所有用户他们必须重新输入 SSH 公钥。如果他们抱怨,请提醒他们庆幸其余备份有效。

我认为,与其在步骤 3 中进行繁琐的编辑,不如简单地将文件移到~git/.ssh/authorized_keys一边,用一个空文件替换它,然后告诉每个人重新输入他们的 SSH 公钥。不过,我自己没有尝试过。如果这对您有用,请在评论中告诉我们。

相关内容