git 阻止模拟另一个用户

标签 git authentication

我们刚刚开始使用 Git 进行源代码管理。我们有一个中央存储库并通过 SSH 访问它,因此我们在中央服务器上的 authorized_keys 文件中设置了各自的 key 。

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

在 git 中有什么办法可以防止这种情况发生吗?例如将 user.name 与特定的 SSH key 相关联?

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

谢谢

最佳答案

正如您所注意到的,Git 允许任何用户进行任何提交,并将作者和/或提交者姓名和电子邮件地址设置为任何(可解析的)值。 (任何用户也可以将任何提交的作者和/或提交者日期设置为任意值,只要它是 Git 视为可用的日期戳即可。)

在中央服务器上检查这些东西的方法是注意 git push 推送 commits,然后要求或告诉服务器设置一个或多个引用名称——通常是一些分支和/或标签名称——指向新的提交。这些请求被传递给 pre-receiveupdate 钩子(Hook),它们可以以它们(钩子(Hook))喜欢的任何方式测试新提交,接受或拒绝引用名称更新。

pre-receive Hook 在标准输入上一次获取所有更新请求,并且可以拒绝整个推送。如果它接受推送,update Hook 然后一次获取每个更新请求(作为命令行参数),并可以拒绝该特定更新。

Git 本身并没有内置任何东西来做这一切,但是 there are some add-ons such as Gitolite that can do this for you .

如果您想使用粗略的“作者姓名必须匹配 ssh 凭据”方法以外的方法来执行此操作,您可以考虑在每次提交时要求数字签名(但请注意,中央服务器仍然必须检查这些签名,我不要认为在 Gitolite 中有什么可以做的)。这实际上更加棘手;通常不会签署个人提交,而是签署带注释的标签。由于提交具有身份验证树 ( Merkle tree ) 的形式,因此签署特定标签意味着您不仅信任该标签的提交,而且还信任其所有祖先提交。 (这种暗示的强度取决于签署它的人的意思,要弄清楚他们的意思你必须问他们。)

关于git 阻止模拟另一个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37295783/

相关文章:

git - 如何使用语义版本构建 Go Module?

ruby-on-rails - 使用带有远程 git repo 的 capistrano 进行部署,但没有在生产服务器上运行 git

node.js - Node js - 用户身份验证,在 session 中存储什么?

java - 使用RADIUS的RSA新引脚模式服务器通信

git - 取消提交当前分支中的所有提交,但将所有更改保留在当前状态

Git:显示提交后的文件内容

linux - 克隆 git 存储库时权限被拒绝

c# - 更改身份服务器 V3 登录页面的设计

authentication - 已启用CAS的Grails应用程序

Azure 自动化/运行手册/身份验证