【问题标题】:Why can't I use one ssh key on more than one github repo?为什么我不能在多个 github 存储库上使用一个 ssh 密钥?
【发布时间】:2017-03-23 18:30:10
【问题描述】:

我有一个服务器,需要使用我在 github 上托管的两个 git repos 的内容进行设置。我现在想将服务器的 ssh 密钥作为部署密钥添加到 github 上的两个项目中。

不幸的是,我收到一条错误消息 Key is already in use,根据 this github page,这是因为我无法将部署密钥添加到多个存储库。

我真的很想知道;为什么这是个问题?为什么一台服务器不能访问多个 repo?他们在这里试图减轻的风险是什么?

【问题讨论】:

    标签: git github ssh repository ssh-keys


    【解决方案1】:

    对于您链接的 GitHub 页面上的内容,这并不完全正确。事实上,您可以为许多不同的 GitHub 存储库使用相同的 ssh 密钥。你不能做的是对许多存储库使用一个 ssh 密钥 作为他们所谓的“部署密钥”,也不能像某些 一样使用 same ssh 密钥其他用户。

    这里发生的事情是 GitHub 的 ssh 服务器将传入的密钥分类为两种类型之一:

    • 帐户密钥,它将传入连接验证为。然后,您对一些广泛(或狭窄)的存储库具有权限,由每个存储库的“具有访问权限的帐户”设置控制。也就是说,关键本身是他们如何知道您是 kramer65(或您的实际帐户名)。
    • 一个部署密钥,它将传入连接验证为有权访问一个特定的存储库。也就是说,不涉及“帐户”:它只是一个密钥,附加到一个特定的存储库。

    也有“机器用户”,但那是一种账户形式;我不确定 GitHub 是否甚至在内部将它们与常规帐户密钥区分开来。因为这些是类似帐户而不是类似部署密钥的,所以您可以让他们访问许多不同的存储库。 (这可能是你想要的。)

    我真的很想知道;为什么这是个问题?为什么一台服务器不能访问多个 repo?他们在这里试图减轻的风险是什么?

    他们并没有真正保护这里的任何东西。他们只是让您在 GitHub 上保存这个额外的密钥,并且为了(您的)方便,无需费心创建帐户即可。为了(他们的)方便,他们然后将这个额外的密钥附加到一个存储库,这使得他们的 ssh 服务器——或者实际上,在密钥验证后它后面的东西,即“登录 shell”——查找一个允许的存储库无需先通过“帐户”表间接。当传入的密钥是帐户(或机器用户)密钥时,他们的 ssh 服务器或它后面的东西必须在这个辅助表中查找,以找到允许的存储库集。

    详情请见https://developer.github.com/guides/managing-deploy-keys/#deploy-keys

    (理论上没有理由他们不允许部署密钥自动创建一个其他匿名的“机器用户”,然后自动添加到每个存储库,或者从其中删除,因为你会喜欢。但是,这对他们没有任何好处,因为机器用户已经存在,并且执行相同的功能。他们可以尝试将其作为安全功能旋转,因为它让您知道“嘿,那个密钥已经对我来说意味着什么”……但如果你有那把钥匙,但不应该拥有那把钥匙,你现在可以找出那把钥匙实际上解锁了什么,如果有的话,这有点反-安全性。另一方面,如果您应该拥有该密钥,而只是忘记了它解锁了哪些存储库,那么系统对您来说非常困难。这是任何安全系统的典型特征但是:你做得越安全,实际使用起来就越不方便。)

    【讨论】:

    • 让我提供一个 tl;dr 的答案:这是因为一些普通用户不必关心的技术限制。
    • 在项目之间共享部署密钥(通常用于构建/CI 系统)从安全角度来看是个坏主意,因为受损的构建作业可能会访问所有这些存储库
    • 在使用自动化系统和 git 子模块时,这个工作流程会成为一个问题。您不能在多个 repo 中使用相同的部署密钥,因此解决方法是将密钥添加到他们的用户帐户(或专用计算机帐户)。以最小的阻力路径,大多数用户会将其添加到自己的帐户中,从而导致更大的安全风险。 GitHub 应该让用户在每个存储库的基础上选择并承担风险......
    • @tkeeler:可能是真的,但我无法控制 GitHub 或用户... :-)
    • @YarekT 这种情况实际上是相反的(部署者不会克隆它然后部署的其他应用程序存储库),应用程序存储库会拉动“部署助手”。这就是为什么它被称为“助手”而不是“部署者”的原因。我们实际上也已经有了前者(通过它管理部署密钥),但应用程序需要依赖与部署程序本身不同的集中设置。我想解决这个问题的方法是让部署者为部署助手使用一个部署密钥,将其拉入本地,然后将更新的代码推送到目标机器,而不是让它们直接拉取。
    【解决方案2】:

    更简短的回答:GitHub 希望您处理这种情况的方式是创建一个单独的 GitHub 帐户来代表服务器(GitHub 将其称为“机器用户”,更多信息 here),将 SSH 密钥添加到该帐户帐户,然后将该帐户作为协作者添加到您希望它访问的存储库中。在 GitHub 允许您将其添加到新机器用户之前,您需要删除 SSH 密钥作为部署密钥。

    【讨论】:

    • 但是,如果您想访问组织回购并且该组织正在为团队计划或企业计划付费,那么解决此问题的方法不是很好,因为您必须支付更多费用
    猜你喜欢
    • 2021-09-07
    • 2023-01-08
    • 1970-01-01
    • 2015-05-15
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多