git - 在没有 gpg 签名的情况下验证 git 提交

标签 git version-control gitlab

我们开始使用 git 作为 VCS,之前使用 SVN,并发现在 git 中您可以轻松区分更改和提交背后的真实人物。现在我们想知道为什么做出这样的设计选择以及是否有我们忽略的事情。

让我们假设以下情况:

  1. 每个人都已向 gitlab 注册了 ssh key
  2. 提交使用 gpg 签名
  3. 每个人都使用注册的 ssh key 来使用 git bash

现在我们都知道 authorcommitter 只是 git 的元数据,很容易被欺骗,如下所示:

  1. git config --global --add user.email [email protected]
  2. git config --global --add user.name“隐身用户”
  3. git commit -m “你不知道我到底是谁” --author="Max Mustermann "
  4. git 推送

提交的元数据将如下所示:

Author:     Max Mustermann <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="402d21386e2d35333425322d212e2e00232f2d30212e396e232f2d" rel="noreferrer noopener nofollow">[email protected]</a>>
AuthorDate: Mon Jun 4 13:12:47 2018 +0200
Commit:     Incognito User <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="81c8efe2eee6efe8f5eec1e7e0eae4afe2eeec" rel="noreferrer noopener nofollow">[email protected]</a>>
CommitDate: Mon Jun 4 13:13:26 2018 +0200

现在我认为必须有一种方法可以找到用于提交的ssh key 真人,因为终端和系统知道 key ,因此提交和推送背后的真正的人。

问题:如果不使用 gpg 签名就没有办法找出真人吗?

PS:不,我们并不是不信任对方来利用这一点,但我们很好奇并想了解。

最佳答案

更新 - 从torek的评论中复制信息,因为我相信这个上下文足够重要,它应该在答案本身中提供,而不仅仅是在评论中:


首先,您需要将 gitgitlab 分开。就 git 而言,ssh 只是您可能用来连接服务器的协议(protocol)之一。你的 ssh key 或其有效性对于 git 来说并不重要;这是您和您的服务器之间的事情,因为服务器会对您进行身份验证,以便它可以决定您是否有权通过 ssh 连接。

(服务器可能会执行更细粒度的授权检查,特别是对于像 gitlab 这样的主机,其全部功能就是与 git 集成。尽管如此,这是主机的事,而不是 git 的事。)

像 gitlab 这样的托管服务可能会选择基于 ssh key 记录事件,也可能不会。即使他们这样做,也只能告诉您谁将提交推送到该服务器,这可能与作者或提交者不同。例如:

假设 Alice 编写了代码;她是作者。她将自己的作品寄给了鲍勃。 Bob 将代码放入本地 git 存储库中。 Bob 是提交者。 Bob 创建了一个捆绑文件并将其发送给 Cindy。现在,Cindy 将 Bob 的包含 Alice 代码的提交加载到她的本地存储库中,然后使用她的 ssh key 推送到 gitlab。现在,git 本身并不关心 Cindy 在其中扮演的角色;她不是作者,也不是提交者。但是如果 gitlab 选择基于 ssh key 记录事件,gitlab 可能会记录 Cindy 向该服务器引入了提交。

在 git 中创建可验证提交的方法是使用签名[1]。所以不,“如果不使用 [git 记录真人的机制],根本没有办法找出真人”。

Note that this arises from the distributed nature of Git. Without some sort of external constraint, it's impossible to say if Cindy is legitimately relaying Alice and Bob's work. With SVN, there's one clearly-distinguished central server / Source of Truth, and Alice must connect to that server to create a commit, after which Bob must connect to that server, and Cindy must connect to that server. Each individual connects individually to the server. Unlike SVN, Git does not assume this must always happen. If you want to enforce such a policy yourself, you can by having your server do it.

-torek


[1] 虽然我不知道他们的观点是否已经改变,但至少一些 git 开发者很早就表示相信签署标签(而不是直接签署提交)是正确的方法来做到这一点。

关于git - 在没有 gpg 签名的情况下验证 git 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50744215/

相关文章:

iphone - 您是否将配置文件保存在版本控制中?

git - 修复一个坏的 merge

git "reset"workdir 到 HEAD 而不触及暂存区

git - 无法推送到远程分支,无法解析到分支

svn - 有效的工作流程允许设计人员访问 SVN 存储库的部分内容

python - 使用 git 跟踪对 dropbox 的更改?

java - GitLab AutoDevops 与 Oracle Artifact

gitlab - 在 GitLab CI 脚本中使用 CURL 响应

ssh - gitlab.com SSH连接超时

git - 从命令行使用 git apply --whitespace=fix 手动修复普通文本文件