对多个github项目使用相同的部署密钥


94

Github不允许将同一个ssh部署密钥用于多个项目,这在某些情况下非常有用(例如,CI服务器处理带有私有子模块的项目)。我已经看到各种线程似乎都说出于“安全原因”存在此限制,但是我还没有看到关于确切会引发何种风险的令人信服的解释。

请注意,Github不允许重复使用帐户级别密钥这一事实是有道理的(两个用户不应共享密钥)。我要问的只是对部署密钥的限制。

需要明确的是,我并不是在寻找解决方法(创建虚拟用户,使用多个密钥,...),而只是为了对这种对部署密钥的限制进行合理的解释。

相关主题:


由于没有更好的方法,因此我们创建了一个专用的部署用户,该用户将被授予对存储库的只读访问权限。最终结果是相同的。
Datageek '16

Answers:


22

您引用的解决方法(创建一个“构建”用户或id_rsa.REPONAME.pub每个回购共享一个共享用户)说明了唯一的原因:

避免为不同用户共享公钥/私钥

即使在您的情况(构建多个项目)中不是这种情况,允许重用相同的ssh密钥也将为两个不同的用户共享相同的ssh密钥提供可能性,这将使认证目的失效。

身份验证的意思是:
“使用某个ssh密钥应意味着您应该知道谁在使用它”。


GitHub页面“管理部署密钥”详细介绍了使用ssh的各种帐户:

  • SSH代理转发:代理转发使用在SSH进入服务器并运行git命令时已在本地开发计算机上设置的SSH密钥。
    您可以有选择地让远程服务器访问本地ssh-agent,就像它在服务器上运行一样。
    因此,无需在服务器上复制您的私钥。

  • 机器用户:(这是“虚拟帐户”策略)将密钥附加到用户帐户。由于此帐户不会被人使用,因此称为机器用户。
    您将以与人类相同的方式对待该用户,将密钥附加到机器用户帐户,就好像它是普通帐户一样。
    向帐户协作者或团队授予对其需要访问的存储库的访问权限。
    因此,与一个“机器用户”关联的一个私钥,每个服务器一个。

DHa在注释中指出了部署密钥限制号,并且您只能拥有一个计算机用户帐户。)

  • 部署密钥(每个GitHub存储库一个)SSH密钥,存储在服务器上,并授予对GitHub上单个存储库的访问权限。
    该密钥直接附加到存储库上,而不是用户帐户上
    无需转到帐户设置,而是转到目标存储库的管理页面。
    转到“ Deploy Keys”,然后单击“ Add deploy key”。将公钥粘贴并提交。

这次,ssh密钥未附加到用户(您可以向其授予访问多个存储库的权限),而不会附加到一个存储库。
授予ssh访问多个存储库的权限等同于“机器用户”。

认证方面

  • 当用户完成操作时,可以使用相同的密钥进行多次回购(该密钥与他/她的帐户相关联)
  • 当密钥由存储库附加时,不能对多个存储库使用相同的密钥,因为您根本不知道访问了什么。
    这与“机器用户”不同,在“机器用户”中,“用户”被声明为许多回购的协作者。
    在这里(部署键),没有“ collaborator”,只有授予存储库的直接ssh访问权限。

53
GitHub支持帐户级别的公共密钥和项目级别的密钥(也称为部署密钥)。不允许重复使用“帐户级别”密钥是有道理的,但我认为不允许将其用于“部署密钥”是没有道理的。我的一个“帐户级别”密钥允许访问我的所有项目,所以为什么不能有一个允许访问某些项目的部署密钥?这只是限制性更高,不会引起我所看到的任何担忧。在这种情况下,您不必担心两个不同用户共享同一ssh密钥的可能性。
David Ebbo,2012年

@DavidEbbo可能不会出现在图片中,但是这种担心(两个不同的用户共享同一个ssh密钥)是不共享ssh密钥的原因的核心。
VonC 2012年

21
恐怕我在这里不遵循您的推理。我问的是一个非常特定的方案(在多个项目中使用部署密钥),而您认为不可能的是提出一个不相关的方案(两个用户共享ssh密钥)。完全坚持Deploy Key方案,github允许它的负面影响是什么?
David Ebbo,2012年

6
@DavidEbbo继help.github.com/articles/managing-deploy-keys,没有这三个方法(计费,部署或计算机帐户)包括用于共享访问的SSH私钥的说回购。由于它是服务器上的密钥,因此仅坚持部署密钥方案,因为它在多个存储库中均有效,这意味着在多个存储库上共享(或复制)私钥。这减少了身份验证方面,并且如果密钥被泄露,则会增加公开的存储库的数量。
VonC 2012年

8
谢谢,该页面有有趣的信息。如果我什么都没看到,我会在一两天内将您的答复标记为答案,尽管老实说,我仍然不相信该论点。在两个存储库上使用部署密钥并不比使用可以访问同一组存储库的机器密钥弱。
大卫·埃博

11

不幸的是,在这种情况下,github只是误解了密钥对与帐户或项目之间的区别。

由于密钥对用于身份验证和授权,因此实际上是身份。Github帐户是另一个身份。将github帐户连接到密钥对可以有效地在基于github帐户的身份和密钥对身份之间建立1:N映射。

相反,github强制将项目与基于密钥对的身份进行1:N映射。现实世界的模拟是,有一扇门可以访问该项目,并且可以由许多不同的人打开。但是一旦他们中的任何一个获得了门的钥匙,他们就再也无法获得任何其他门的任何其他钥匙。

从密钥泄露的角度考虑,如果密钥被泄露,不要经常重用密钥是有意义的。但这只是一个好的管理政策原则上,防止多次使用密钥没有多大意义。某些门的一些钥匙从未被重复使用,这又取决于政策


稍微复杂一点的视图是将密钥对说明为角色。您可以拥有许多密钥对,因此可以扮演许多角色。私钥可以验证您的角色。

Github对项目的部署密钥映射指出,一个角色永远不能包含多个任务。这很少是现实的。

当然,这些都不会改变github所允许的。


1
嘿。当它比公认的答案更正确时,这是如何被人们嘲笑的,这很有趣。实际上,没有任何事情可以阻止与多个用户共享密钥。
Jens Finkhaeuser

2

我花了很多时间思考合理化的含义,并提出了此方案。

假设您为分配给多个存储库的用户创建一个部署密钥。现在,您想撤消该密钥,但是它已在多个地方使用。因此,您可能会无意中撤消部分访问,而不是撤消所有访问。

这听起来像是一种好处,但是一旦考虑到人为因素,这种多对一关系实际上就本质上是不安全的。这是因为您无法确定是否真的取消了所有访问权限,而不检查每个存储库,并且在忘记了实际分配位置的情况下分别比较每个公钥。

分配和管理这么多唯一的密钥绝对令人沮丧,但是GitHub如何制定其策略显然会带来安全隐患:当您撤消某个密钥时,由于它仅在一个地方使用,因此您可以确保撤消该密钥授予的所有访问权限。 。


1
我不相信这种解释。这与允许一个用户访问多个存储库(这显然是允许的)有什么根本区别?如果您不再信任该用户,则需要将其从每个存储库中删除。
大卫·埃博

@David:How is that fundamentally different from allowing one user to access multiple repositories, which is obviously allowed您能进一步解释一下吗?我只有一个开发人员帐户,并且看到可以为整个帐户访问添加ssh密钥(所有存储库一个密钥)或添加单个部署密钥(每个存储库一个密钥)。这仍然是一对多或一对一的关系,在这两种情况下,撤消“一个”键都会撤消“所有”访问权限。
Zhro

为了进一步阐明,没有机会(我能说什么)在多对一关系中意外分配密钥,而该密钥在撤销后可能在其他位置存在。这似乎是GitHub进行此限制的动机,但我只是在猜测。
Zhro

我看待事物的方式,部署密钥有点像“匿名用户”,虽然没有完整的帐户,但仍然代表某种身份。区别在于,在该帐户的情况下,您可以访问该帐户,而该帐户可以间接地访问该帐户中的所有ssh密钥。在“部署密钥”情况下,您跳过帐户抽象,而直接授予对ssh密钥的访问权限。但是除此之外,我认为安全需求不会有所不同。如果帐户或部署密钥的所有者变得邪恶,则需要将其从每个存储库中删除。
大卫·埃博
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.