Gitlab无法删除ssh密钥不在用户界面中,但仍然可以使用

问题描述

版本Gitlab CE 13.3.5

我们遇到的问题是用户拥有旧的SSH密钥,而他们不再使用该密钥。用户想要删除SSH密钥。但是,它在用户帐户的UI中不可用。

当我们使用以下API查找用户ssh密钥时,它并不存在: https://gitlab.server/api/v4/users/someuser/keys

但是,如果我要查找通过Gitlab注册的所有SSH密钥的循环,我可以找到它: https://gitlab.server/api/v4/users/keys/$KeyIdNumber

如何删除SSH密钥,使其无法使用。这是一个潜在的安全风险,因为私钥将被泄露,那么在没有删除用户的情况下将无法阻止访问。作为测试,在阻止用户时,SSH密钥仍然有效。

似乎无法通过API删除密钥。

解决方法

由于key API仅具有“ GET”操作,所以我要求(您的GitLab本地服务器的)GitLab管理员执行以下操作:

  • 打开关联的数据库,然后
  • 手动删除该条目。

检查database settings

我想我只需要澄清一下。这是导致我找到最终解决方案的答案,主要是因为我太害怕从实时数据库中删除条目:

以下查询帮助我找到了条目:

select * from keys where id = 27;

如果这实际上是SSH密钥的问题,则可以使用以下查询更新expiration_at列以使密钥失效:

UPDATE keys SET expires_at = '2020-09-17 08:42:00+02' WHERE id = 27 RETURNING *;

输出实际上告诉我,密钥“ type”是“ DeployKey”,它与SSH密钥本质上相同,但是它与存储库绑定并且不遵循相同的到期规则(尽管部署令牌可以这样做)

这在用户界面中很难找到,我的方式是查询每个项目的“ deploy_keys”:

...api/v4/projects/<ID>/deploy_keys

警告该密钥可以在多个存储库中使用。如果您从其中一个“禁用”它,它将在另一个存储库中仍然可用,但是您将不知道哪个项目。幸运的是,只要您先不要禁用该密钥,就可以打开使用相同密钥的其他存储库(这是我所做的,浪费了更多时间查找存在该密钥的另一个项目)。