【问题标题】:Should we share the public key for checking signing in the git repository?我们是否应该共享用于检查 git 存储库中的签名的公钥?
【发布时间】:2017-09-20 09:43:23
【问题描述】:

在 Pro Git, Tagging Your Releases 一书中:

它展示了一种将公钥收集到 git 中的 blob 中的方法,因此同步它的用户可以添加该公钥并验证签名标签。

这种方式真的安全吗?有人可以更改公钥 blob 并重做签名。我认为我们应该从单独的授权方式获取公钥,对吧?

书中的命令粘贴如下:

$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Scott Chacon <schacon@gmail.com>"
1024-bit DSA key, ID F721C45A, created 2009-02-09

$ gpg --list-keys
/Users/schacon/.gnupg/pubring.gpg
---------------------------------
pub   1024D/F721C45A 2009-02-09 [expires: 2010-02-09]
uid                  Scott Chacon <schacon@gmail.com>
sub   2048g/45D02282 2009-02-09 [expires: 2010-02-09]

$ gpg -a --export F721C45A | git hash-object -w --stdin
659ef797d181633c87ec71ac3f9ba29fe5775b92

$ git tag -a maintainer-pgp-pub 659ef797d181633c87ec71ac3f9ba29fe5775b92

$ git show maintainer-pgp-pub | gpg --import

【问题讨论】:

  • 为什么要接受 PR 更改公钥?
  • 为什么要接受恶意拉取请求?这不是攻击模型:而是考虑攻击者以某种方式获取存储库凭据并能够上传恶意提交包括一个新密钥,而无需发出拉取请求。
  • 我认为(也许我错了)通过从分离和授权的方式获取受信任的公钥来保证安全性,然后使用该密钥来验证签名标签,这也验证了提交标签指向和提交中的所有内容。所以无论我从哪里获得存储库,这都会验证它。根据你们的cmets,如果安全是由授权的git服务器保证的,为什么我们首先需要对标签进行签名?
  • 我没有声称 git 服务器必须被授权;并且必须有一些额外的方式来发布信任(尽管有不同的方式这样做,只是告诉“嗯,这是我首先看到的密钥,应该没问题,但是用于标志代码不应该改变”甚至可以)。

标签: git code-signing gnupg pgp openpgp


【解决方案1】:

共享您的签名密钥并没有错,尽管它当然不应被视为经过验证的密钥,除非通过其他方式进行验证。与根本不共享密钥相比,另一方必须通过签名中包含的指纹引用从密钥服务器获取它们——密钥仍然不可信,但对密钥服务器存在依赖性。

举个例子,为什么包含密钥可能会很有用:许多(企业)公司对服务器系统都有非常严格的防火墙规则。您可能能够获得存储库服务器的许可(甚至默认情况下拥有 Github 许可),但添加关键服务器的引用可能很乏味。在构建软件时,您可能会从存储库中导入密钥——并根据硬编码的公钥指纹发出信任。尽管如此,这比在本地静态存储密钥要好,例如滚动子密钥意味着构建损坏,除非更新本地密钥副本。当从存储库中获取密钥(并通过公共主密钥指纹进行验证)时,无需执行任何操作。

此外,还有 TOFU 的概念:“信任首次使用”。当您第一次获取密钥时(例如,在初始开发期间),您希望没有攻击者出现,但希望确保以后不会分发被操纵的源。开发人员在其本地开发机器上获取密钥并将其设置为受信任可能已经没问题,具体取决于您的攻击模型和可接受的风险。

无论如何,除了您建议的受信任来源上的密钥(或至少指纹,never use short key IDs)。一个可通过 HTTPs 获得的具有可信证书的网站是一个开始。特别是如果您从事开源项目,请尝试让您的密钥在开源会议上得到认证(或者至少让开发人员密钥得到认证,然后才能认证项目密钥)。

【讨论】:

  • 谢谢您的回答。但我在这里仍然感到困惑。如果我们可以信任 git 存储库中的公钥,我们就可以信任存储库中的标签,对吗?那么为什么我们首先需要对标签进行签名呢?
  • 嗯,这正是我所讨论的:您可以提供密钥,但仍需要通过其他方式进行验证。例如,通过将其指纹(哈希和)与网站进行比较,...;通过应用“豆腐”信任模型;通过使用信任网络。验证密钥(或指纹)后,您就可以了。事实上,大部分 OpenPGP 生态圈都依赖于不受信任的密钥交换方法(OpenPGP 密钥服务器),但随后采用了验证密钥的方法。
猜你喜欢
  • 2015-04-06
  • 2016-07-18
  • 2011-12-27
  • 2016-03-07
  • 1970-01-01
  • 2019-02-10
  • 2019-08-04
  • 1970-01-01
  • 2012-02-04
相关资源
最近更新 更多