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

时间:2018-06-07 14:48:48

标签: git version-control gitlab

我们开始使用git作为VCS,以前使用SVN,并发现在git中你可以轻易地分散变更和提交背后的真实人。现在我们想知道为什么要做出这样的设计选择以及是否存在我们忽略的事情。

让我们假设以下事项:

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

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

    1. git config --global --add user.email Incognito@fake.com
    2. git config --global --add user.name“Incognito User”
    3. git commit -m“你不知道我到底是谁”--author =“Max Mustermann”
    4. git push
    5. 提交的元数据看起来像这样:

      Author:     Max Mustermann <max.mustermann@company.com>
      AuthorDate: Mon Jun 4 13:12:47 2018 +0200
      Commit:     Incognito User <Incognito@fake.com>
      CommitDate: Mon Jun 4 13:13:26 2018 +0200
      

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

      问题:在没有使用gpg签名的情况下,根本没有找到真人的方法吗?

      PS:不,我们不会互相怀疑利用这一点,但我们很好奇,想要理解。

3 个答案:

答案 0 :(得分:2)

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

首先,您需要将 git gitlab 分开。就 git 而言,ssh只是您可能用于连接服务器的可能协议之一。你的ssh密钥或其有效性对git来说并不重要;当您和服务器对您进行身份验证时,您可以决定是否已授权您通过ssh进行连接。

(服务器可能会执行更精细的授权检查,尤其是对于像 gitlab 这样的主机,其整个功能是与git集成。尽管如此,这是主机的业务,而不是git&#39 ; S)

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

让我们说爱丽丝写了代码;她是作者。她把自己作品的副本寄给了鲍勃。 Bob将代码放入本地git仓库。鲍勃是提交者。 Bob创建了一个捆绑文件并将其发送给Cindy。现在,Cindy将包含Alice代码的Bob的提交加载到她的本地仓库中,然后使用她的ssh密钥将其推送到gitlab。现在,git本身并不关心Cindy在这方面的作用;她不是作者而且她不是提交者。但是如果gitlab选择基于ssh密钥记录活动,gitlab可能会记录Cindy将提交引入该服务器。

在git中创建可验证提交的方法是使用签名[1]。所以不,在没有使用[git&#39的记录真人的机制]的情况下,根本无法找到真人#34;

  

请注意,这源于Git的分布式特性。如果没有某种外部约束,Cindy是否合法地转发Alice和Bob的工作是不可能的。使用SVN,有一个明显区分的中央服务器/真理源,Alice必须连接到该服务器才能创建提交,之后Bob必须连接到该服务器,Cindy必须连接到该服务器。每个人都单独连接到服务器。与SVN不同,Git并不认为必须始终如此。如果您想自己执行此类策略,可以让服务器执行此操作。

     

-torek

[1]虽然我不知道他们的观点是否已经改变,但至少有一些git开发人员早先表示相信签署标签 - 而不是直接签署提交 - 是正确的方法。

答案 1 :(得分:1)

我认为集中式和分布式之间的一个主要区别在于,在集中式的情况下,您必须通过身份验证过程才能验证&#34;您是谁,你是谁&#34;为了能够被信任然后提交或做其他事情。

但是分布式每个人都是他们自己王国的国王/王后。我不需要在计算机上对我的自己的回购进行身份验证,对吗?然后记住,即使推送可以在分布式VCS上进行,它实际上是为&#34;拉动&#34;所以没有人弄乱我的回购。我将从谁那里拉出来?我信任的人,对吧?所以仍然有一些信任,但它在不同的地方,最终,你是你自己的回购的所有者。没有人可以强迫你接受你不喜欢的改变你自己的回购。莱纳斯&#39;从2007年谷歌git演示文稿已经解释了所有的基础知识。 https://www.youtube.com/watch?v=4XpnKHJAok8

答案 2 :(得分:1)

首先:自Git 2.19(2018年第三季度)以来,新的配置变量gpg.format(可以设置为“ openpgp”或“ x509”)和gpg.<format>.program (用于指定用于处理格式的程序)意味着:您可以通过“ gpgsm”将x.509证书与CMS一起使用,而不是通过“ openpgp使用{.1}} “。

gpgsm是类似于gpg的工具,可在X.509证书和 CMS protocol 上提供数字加密和签名服务。
它主要用作S / MIME邮件处理的后端

Cryptographic Message Syntax (CMS)是IETF用于受密码保护的邮件的标准。
加密方案和协议可以使用它对数字形式的数字数据进行数字签名,摘要,认证或加密。)

是的,有一种方法(使用Git)无需使用gpg签名即可找到真实的人


第二,GitLab 12.8(2020年2月)现在支持“ S/MIME Signature Verification of Commits

Git存储库中的每个提交都有一个作者,但这并未得到Git的验证,这意味着创建似乎由其他人创作的提交很容易。
提交签名使您可以证明自己是提交的作者。这对于敏感项目和某些商业环境非常重要。

在Git 2.19中,OpenGPG签名和验证支持已扩展为包括对使用X.509证书的S / MIME的支持,因为对大型组织而言,管理这些证书更为方便。

GitLab现在还支持提交的S / MIME签名验证,这要感谢西门子的Roger Meier!还要感谢西门子的 Henning Schild ,首先是contributing this feature to Git

CMS -- https://about.gitlab.com/images/12_8/x509-signing.png

请参见documentationissue 29782

是的,有一种方法(现在已与GitLab集成)可以在不使用gpg签名的情况下找到真实的人。