为什么我不能在多个 github 存储库上使用一个 ssh 密钥?
Why can't I use one ssh key on more than one github repo?
我有一台服务器,需要使用我在 github 托管的两个 git 存储库的内容进行设置。我现在想将服务器的 ssh 密钥作为部署密钥添加到 github 上的两个项目。
不幸的是,我收到一条错误消息 Key is already in use
,根据 this github page,这是因为我无法将部署密钥添加到多个存储库。
虽然我真的很想知道;为什么这是个问题?为什么一台服务器不能访问多个存储库?他们在这里试图降低的风险是什么?
您链接的 GitHub 页面上的描述并不完全正确。事实上,您 可以 对许多不同的 GitHub 存储库使用相同的 ssh 密钥。你不能做的是对许多存储库使用一个 ssh 密钥 和 作为他们所谓的 "deploy key",也不能使用 same ssh 密钥作为一些 other 用户。
这里发生的事情是 GitHub 的 ssh 服务器将传入的密钥分为两种类型之一:
- 一个帐户密钥,它将传入连接验证为您。然后,您可以访问一些广泛(或狭窄)的存储库,由每个存储库的 "accounts that have access" 设置控制。也就是说,关键本身就是他们如何知道你是
kramer65
(或者你的帐户名实际上在那里)。
- 一个部署密钥,用于验证传入连接是否有权访问一个特定存储库。也就是说,不涉及 "account":它只是一个密钥,附加到一个特定的存储库。
还有"machine users",但那是一种账户形式;我不确定 GitHub 是否能将内部密钥与常规帐户密钥区分开来。因为它们类似于帐户而不是部署密钥,所以您可以授予它们访问许多不同存储库的权限。 (这可能就是你想要的。)
I really wonder though; why is this a problem? Why can't one server have access to several repo's? What's the risk they're trying mitigate here?
他们并没有真正保护这里的任何东西。他们只是让您在 GitHub 上保存这一个额外的密钥,并且为了(您的)方便,无需费心创建帐户即可。为了(他们的)方便,他们随后将这个额外的密钥附加到一个存储库,这让他们的 ssh 服务器——或者实际上,在密钥验证后它背后的东西,即 "login shell"——查找允许的那个存储库而不必先通过 "account" table 间接访问。当传入的密钥是帐户(或机器用户)密钥时,他们的 ssh 服务器,或者它后面的东西,必须在这个辅助 table 中查找,以找到一组允许的存储库。
详情见https://developer.github.com/guides/managing-deploy-keys/#deploy-keys。
(理论上没有理由不允许部署密钥 自动 创建一个匿名的 "machine user" 然后自动添加到每个存储库,或者从中删除,如您所愿。但是,这对 他们 没有任何好处,因为机器用户已经存在,并执行相同的功能。他们可以尝试将其作为安全功能旋转,因为它让你知道 "hey, that key already means something to me" ... 但是如果你有那把钥匙并且 不应该 有那把钥匙,你现在可以找出那把钥匙实际上解锁了什么,这如果有任何东西有点反安全。另一方面,如果您 是 应该有那个密钥,并且只是忘记了它解锁了您的哪个存储库,这会使系统很难你。不过,这是任何安全系统的典型特征:你做得越安全,实际使用起来就越不方便。)
一个简短的回答:GitHub 希望你处理这种情况的方法是创建一个单独的 GitHub 帐户来代表服务器(GitHub 称其为“机器用户” , 更多信息 here), 将 SSH 密钥添加到该帐户,并将该帐户作为协作者添加到您希望它访问的存储库中。在 GitHub 允许您将其添加到新计算机用户之前,您需要删除作为部署密钥的 SSH 密钥。
我有一台服务器,需要使用我在 github 托管的两个 git 存储库的内容进行设置。我现在想将服务器的 ssh 密钥作为部署密钥添加到 github 上的两个项目。
不幸的是,我收到一条错误消息 Key is already in use
,根据 this github page,这是因为我无法将部署密钥添加到多个存储库。
虽然我真的很想知道;为什么这是个问题?为什么一台服务器不能访问多个存储库?他们在这里试图降低的风险是什么?
您链接的 GitHub 页面上的描述并不完全正确。事实上,您 可以 对许多不同的 GitHub 存储库使用相同的 ssh 密钥。你不能做的是对许多存储库使用一个 ssh 密钥 和 作为他们所谓的 "deploy key",也不能使用 same ssh 密钥作为一些 other 用户。
这里发生的事情是 GitHub 的 ssh 服务器将传入的密钥分为两种类型之一:
- 一个帐户密钥,它将传入连接验证为您。然后,您可以访问一些广泛(或狭窄)的存储库,由每个存储库的 "accounts that have access" 设置控制。也就是说,关键本身就是他们如何知道你是
kramer65
(或者你的帐户名实际上在那里)。 - 一个部署密钥,用于验证传入连接是否有权访问一个特定存储库。也就是说,不涉及 "account":它只是一个密钥,附加到一个特定的存储库。
还有"machine users",但那是一种账户形式;我不确定 GitHub 是否能将内部密钥与常规帐户密钥区分开来。因为它们类似于帐户而不是部署密钥,所以您可以授予它们访问许多不同存储库的权限。 (这可能就是你想要的。)
I really wonder though; why is this a problem? Why can't one server have access to several repo's? What's the risk they're trying mitigate here?
他们并没有真正保护这里的任何东西。他们只是让您在 GitHub 上保存这一个额外的密钥,并且为了(您的)方便,无需费心创建帐户即可。为了(他们的)方便,他们随后将这个额外的密钥附加到一个存储库,这让他们的 ssh 服务器——或者实际上,在密钥验证后它背后的东西,即 "login shell"——查找允许的那个存储库而不必先通过 "account" table 间接访问。当传入的密钥是帐户(或机器用户)密钥时,他们的 ssh 服务器,或者它后面的东西,必须在这个辅助 table 中查找,以找到一组允许的存储库。
详情见https://developer.github.com/guides/managing-deploy-keys/#deploy-keys。
(理论上没有理由不允许部署密钥 自动 创建一个匿名的 "machine user" 然后自动添加到每个存储库,或者从中删除,如您所愿。但是,这对 他们 没有任何好处,因为机器用户已经存在,并执行相同的功能。他们可以尝试将其作为安全功能旋转,因为它让你知道 "hey, that key already means something to me" ... 但是如果你有那把钥匙并且 不应该 有那把钥匙,你现在可以找出那把钥匙实际上解锁了什么,这如果有任何东西有点反安全。另一方面,如果您 是 应该有那个密钥,并且只是忘记了它解锁了您的哪个存储库,这会使系统很难你。不过,这是任何安全系统的典型特征:你做得越安全,实际使用起来就越不方便。)
一个简短的回答:GitHub 希望你处理这种情况的方法是创建一个单独的 GitHub 帐户来代表服务器(GitHub 称其为“机器用户” , 更多信息 here), 将 SSH 密钥添加到该帐户,并将该帐户作为协作者添加到您希望它访问的存储库中。在 GitHub 允许您将其添加到新计算机用户之前,您需要删除作为部署密钥的 SSH 密钥。