git阻止模拟另一个用户

use*_*265 3 git authentication

我们刚刚开始将Git用于我们的源代码控制。我们有一个中央存储库,可以通过SSH进行访问,因此我们在中央服务器上的authorized_keys文件中设置了各自的密钥。

当您在git中提交时,与该提交相关联的元数据包括例如user.name,但是据我们所知,没有什么阻止我将user.name设置为另一个用户user.name并假装他/她做了承诺。

有什么办法可以防止这种情况吗?例如,将user.name与特定的SSH密钥相关联?

顺便说一句,我的问题不是为什么git允许这样做,我读过有有效的用例。我的问题是,如果我们不想这样做,可以以任何方式防止这种情况发生吗?

谢谢

tor*_*rek 5

如您所述,Git允许任何用户使用作者和/或提交者名称和电子邮件地址设置为任何(可解析)值的任何提交。(任何用户还可以将任何提交的作者和/或提交者日期设置为任意值,只要它是Git认为可用的日期戳即可。)

在中央服务器上审核这些事情的方法是,请注意git pushpush commits,然后要求或告诉服务器设置一个或多个引用名称(通常是某些分支和/或标记名称)以指向新的提交。这些请求被传递给pre-receiveupdate挂钩,挂钩可以通过它们(挂钩)接受或拒绝引用名称更新的任何方式测试新提交。

pre-receive钩得到所有的更新请求同时,在标准输入,并且可以拒绝整个推。如果它接受推送,则update挂钩随后一次获取一个更新请求(作为命令行参数),并且可以拒绝该特定更新。

Git本身并没有内置功能来执行所有这些操作,但是Gitolite等某些附加组件可以为您完成此操作

如果您想使用粗略的“作者姓名必须与ssh凭据匹配”方法以外的方法来执行此操作,则可以考虑在每次提交时要求使用数字签名(但请注意,中央服务器仍必须检查这些签名,而我不需要认为在Gitolite中可以做任何事情)。这是相当棘手的;通常,不签署单个提交,而是签署带注释的标签。由于提交具有身份验证树(Merkle tree)的形式,因此对特定标签进行签名意味着您不仅可以信任该标签的提交,而且还可以信任其所有祖先提交。(这种含义仅与签署该协议的人一样强烈,要找出它们的含义,您就必须问他们。)