Github不允许将同一个ssh部署密钥用于多个项目,这在某些情况下非常有用(例如,CI服务器处理带有私有子模块的项目)。我已经看到各种线程似乎都说出于“安全原因”存在此限制,但是我还没有看到关于确切会引发何种风险的令人信服的解释。
请注意,Github不允许重复使用帐户级别密钥这一事实是有道理的(两个用户不应共享密钥)。我要问的只是对部署密钥的限制。
需要明确的是,我并不是在寻找解决方法(创建虚拟用户,使用多个密钥,...),而只是为了对这种对部署密钥的限制进行合理的解释。
相关主题:
Answers:
您引用的解决方法(创建一个“构建”用户或id_rsa.REPONAME.pub
每个回购共享一个共享用户)说明了唯一的原因:
避免为不同用户共享公钥/私钥
即使在您的情况(构建多个项目)中不是这种情况,允许重用相同的ssh密钥也将为两个不同的用户共享相同的ssh密钥提供可能性,这将使认证目的失效。
身份验证的意思是:
“使用某个ssh密钥应意味着您应该知道谁在使用它”。
GitHub页面“管理部署密钥”详细介绍了使用ssh的各种帐户:
SSH代理转发:代理转发使用在SSH进入服务器并运行git命令时已在本地开发计算机上设置的SSH密钥。
您可以有选择地让远程服务器访问本地ssh-agent,就像它在服务器上运行一样。
因此,无需在服务器上复制您的私钥。
机器用户:(这是“虚拟帐户”策略)将密钥附加到用户帐户。由于此帐户不会被人使用,因此称为机器用户。
您将以与人类相同的方式对待该用户,将密钥附加到机器用户帐户,就好像它是普通帐户一样。
向帐户协作者或团队授予对其需要访问的存储库的访问权限。
因此,与一个“机器用户”关联的一个私钥,每个服务器一个。
(DHa在注释中指出了部署密钥限制号,并且您只能拥有一个计算机用户帐户。)
Deploy Keys
”,然后单击“ Add deploy key
”。将公钥粘贴并提交。这次,ssh密钥未附加到用户(您可以向其授予访问多个存储库的权限),而不会附加到一个存储库。
授予ssh访问多个存储库的权限等同于“机器用户”。
在认证方面:
不幸的是,在这种情况下,github只是误解了密钥对与帐户或项目之间的区别。
由于密钥对用于身份验证和授权,因此实际上是身份。Github帐户是另一个身份。将github帐户连接到密钥对可以有效地在基于github帐户的身份和密钥对身份之间建立1:N映射。
相反,github强制将项目与基于密钥对的身份进行1:N映射。现实世界的模拟是,有一扇门可以访问该项目,并且可以由许多不同的人打开。但是一旦他们中的任何一个获得了门的钥匙,他们就再也无法获得任何其他门的任何其他钥匙。
从密钥泄露的角度考虑,如果密钥被泄露,不要经常重用密钥是有意义的。但这只是一个好的管理政策。原则上,防止多次使用密钥没有多大意义。某些门的一些钥匙从未被重复使用,这又取决于政策。
稍微复杂一点的视图是将密钥对说明为角色。您可以拥有许多密钥对,因此可以扮演许多角色。私钥可以验证您的角色。
Github对项目的部署密钥映射指出,一个角色永远不能包含多个任务。这很少是现实的。
当然,这些都不会改变github所允许的。
我花了很多时间思考合理化的含义,并提出了此方案。
假设您为分配给多个存储库的用户创建一个部署密钥。现在,您想撤消该密钥,但是它已在多个地方使用。因此,您可能会无意中撤消部分访问,而不是撤消所有访问。
这听起来像是一种好处,但是一旦考虑到人为因素,这种多对一关系实际上就本质上是不安全的。这是因为您无法确定是否真的取消了所有访问权限,而不检查每个存储库,并且在忘记了实际分配位置的情况下分别比较每个公钥。
分配和管理这么多唯一的密钥绝对令人沮丧,但是GitHub如何制定其策略显然会带来安全隐患:当您撤消某个密钥时,由于它仅在一个地方使用,因此您可以确保撤消该密钥授予的所有访问权限。 。
How is that fundamentally different from allowing one user to access multiple repositories, which is obviously allowed
您能进一步解释一下吗?我只有一个开发人员帐户,并且看到可以为整个帐户访问添加ssh密钥(所有存储库一个密钥)或添加单个部署密钥(每个存储库一个密钥)。这仍然是一对多或一对一的关系,在这两种情况下,撤消“一个”键都会撤消“所有”访问权限。