web-dev-qa-db-ja.com

GPG署名のGitコミットはどのような保証を提供しますか?

GPG署名とGitHub sshキーが別の目的で機能することは明らかです

しかし、GPG署名コミットの使用は何ですか?あなたはそのコミットを知っているだけですかabcd1234はアリスの鍵によって署名されましたか? GPGがコミットに署名するのに役立つ他のことはありますか?

5
Wayne Werner

Gitでは、ブランチの先端にある暗号署名により、すべてのメタデータとリポジトリのすべてのコンテンツを含む、そのブランチの履歴全体の強力な整合性が保証されます。最初のコミット。これは、gitが前のコミットのハッシュを次のコミットのメタデータに記録し、壊れない暗号化されたレコードのチェーンを作成するために可能です。ブランチの先端で暗号署名を検証できれば、そのブランチの履歴全体を効果的に検証できます。

たとえば、執筆時の最新のタグv5.5-rc4がLinus Torvaldsによって署名されているlinux.gitを見てみましょう。 (これはあなたの質問と少し異なります署名付きのタグを見ているときにコミットへの署名について尋ねたためです-しかし、あらゆる実用的な意味でこれはまったく同じです。)

$ git cat-file -p v5.5-rc4
object fd6988496e79a6a4bdb514a4655d2920209eb85d
type commit
tag v5.5-rc4
tagger Linus Torvalds <[email protected]> 1577662169 -0800

Linux 5.5-rc4
-----BEGIN PGP SIGNATURE-----

iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAl4JNtkeHHRvcnZhbGRz
...
=rNsn
-----END PGP SIGNATURE-----

このタグのコンテンツ全体が署名されているため、Linusがタグに署名したとき、彼のシステムの「オブジェクトハッシュ」はfd6988496e79a6a4bdb514a4655d2920209eb85dであったことがわかります。

しかし、その「オブジェクトハッシュ」とは正確には何ですか。ここでハッシュされる内容は何ですか? gitにそのオブジェクトの詳細を教えてもらうことで確認できます。

$ git cat-file -p fd6988496e79a6a4bdb514a4655d2920209eb85d
tree 30efc38ed890f113f9e1f0cbc801bab7090365eb
parent a99efa00891b66405ebd25e49868efc701fe1546
author Linus Torvalds <[email protected]> 1577662156 -0800
committer Linus Torvalds <[email protected]> 1577662156 -0800

Linux 5.5-rc4

上記の内容全体( わずかに異なる形式 )は、sha1ハッシュfd6988496e79a6a4bdb514a4655d2920209eb85dを提供します。したがって、これまでのところ、LinusのPGP署名から、彼のgitリポジトリに関する他の2つの重要な部分まで、暗号化された証明が切れていません。

  • 彼のソースコードの状態に関する情報(tree
  • 履歴における前回のコミットに関する情報(parent
  • コミットの作者とコミッターに関する情報、これらはこの特定のケースでは同一のものです
  • コミットが行われた日時に関する情報

tree行を見てみましょう-そのチェックサムに到達するためにハッシュされたコンテンツは何ですか? gitに聞いてみましょう:

$ git cat-file -p 30efc38ed890f113f9e1f0cbc801bab7090365eb
100644 blob 196ca317bd1f24ad57ad9ded549bc0b7994d8111    .clang-format
100644 blob 43967c6b20151ee126db08e24758e3c789bcb844    .cocciconfig
100644 blob a64d219137455f407a7b1f2c6b156c5575852e9e    .get_maintainer.ignore
100644 blob 4b32eaa9571e64e47b51c43537063f56b204d8b3    .gitattributes
100644 blob 72ef86a5570d28015d0ccb95ccd212bf8820c1c2    .gitignore
100644 blob a7bc8cabd157b89adbc2d8f6c4d6e3c88b14e3cd    .mailmap
100644 blob da4cb28febe66172a9fdf1a235525ae6c00cde1d    COPYING
100644 blob 9602b0fa1c958da4b605127c2b8da0628efeb34e    CREDITS
040000 tree b239b5eaacf2619bf564d152661ee425c4ee76f9    Documentation
...
040000 tree 82dd6833b421625c7b15d4d1c26964fc65874eb4    virt

これは、トップレベルのLinuxカーネルディレクトリの内容全体です。 blobエントリは、そのディレクトリ内の実際のファイルの内容のsha1sumであるため、簡単です。サブディレクトリは、他のtreeエントリとして表されます。これもblobおよびtreeレコードで構成され、最後のサブレベルまで続き、ブロブのみが含まれます。

したがって、コミットレコードのtree 30efc38ed890f113f9e1f0cbc801bab7090365ebは他のチェックサムのチェックサムであり、linux.gitのすべてのファイルが、Linus Torvaldsがシステムを作成したときのファイルとまったく同じであることを確認できます。コミット。ファイルが変更された場合、ツリーのチェックサムは異なり、オブジェクトハッシュはコミットとは異なるため、リポジトリ全体が無効と見なされます。

最後に、parent a99efa00891b66405ebd25e49868efc701fe1546で言及されているオブジェクトを見ると、それは独自のtreeおよびparentレコードを含む別のコミットのハッシュであることがわかります。気を付ければ、各コミットをLinux git履歴の最初まで遡ることができますが、そうする必要はありません-最新のコミットのチェックサムを確認することで、必要なすべての保証を提供できます。その木の歴史全体。

したがって、タグの署名を検証し、それがLinus Torvaldsに属するキーと一致することを確認すると、ディスク上のリポジトリがであることが強力に暗号化されて保証されます、バイト-for-byteは、Linus Torvaldsに属するコンピューター上のリポジトリーと同じです。その内容と履歴全体が最初のコミットに戻ります。

タグに署名するのではなく、コミットに署名することについて具体的に質問したので、特に複数の人が同じリポジトリブランチにプッシュできる環境では、PGP署名コミットに一般的に良い習慣であることを述べなければなりません。署名されたコミットは、コードの出所を簡単に法医学的に証明します(たとえば、コミット署名なしで、アリスは 偽のコミット ボブによって実際に作成されたふりをすることができます)。また、gitマージを実行せずに特定のコミットを自分のツリーにチェリーピックしたい場合に、簡単に検証できます。

GitおよびPGP署名の使用を開始する場合は、こちらのガイドをお勧めします: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md

重要な注意:最近、sha1はハッシュの目的で十分に強力であるとは見なされていません。これはgit開発コミュニティによって広く認められています。 gitをより強力な暗号化ハッシュに移行するための重要な取り組みが進行中ですが、gitを使用するさまざまなプロジェクトの中断を最小限に抑えるために、慎重な計画と実装が必要です。私の知る限りでは、gitが使用するsha1に対する効果的な攻撃はありません。また、git開発者は、git自体にsha1衝突攻撃に対する予防策を追加しました。これは、強力なハッシュ実装の準備が整うまでの時間を稼ぐのに役立ちます。

7
mricon