Gitでコミットとタグに暗号で署名することの利点と欠点は何ですか?


109

だから誰かが私の仕事をレビューし、彼は私にいつも私のコミットとタグに暗号で署名するべきだと言った。理由を尋ねられたとき、彼はそれを私に説明することを知らず、「やるのは良いことだ」と言った。

明らかなチンパンジーのシナリオを回避しようとすると、なぜ本当に必要なのでしょうか?本当に多くの明確な利点があり、欠点はありませんか?

私が作成するすべてのコミットとタグに署名したいと思う実用的な理由は何ですか?


3
私はそれがあなたへのコミットメントを結ぶペーパートレイルがあるようだと思います。しかし、gitまたは他のソース管理システムを使用して、コミットに署名したことはありません。同僚が不正なコミットのリスクがあると考えている場合、おそらくあなたの会社はより大きなセキュリティ問題を抱えています。
ジェームズ

@James:会社の仕事ではありませんが、私はいくつかのオープンソースプロジェクトとクローズドソースプロジェクトに参加しています。
マダラ

@James:「より大きなセキュリティ問題」---何のような?署名はそれらを解決する技術的な方法ではありませんか?
zerkms

8
mikegerwitz.com/papers/git-horror-story.htmlは、署名付きコミットおよびタグのユースケースの出発点です。

1
@Jamesは、SVNアカウントを使用してコミットするときに、コミットに署名します。gitグローバル設定でコミットするとき、あなたが自分が作者であることを確認する唯一の権限です。
フローリアンマーゲイン

回答:


102

(これは主に、Git Horror Story:署名済みコミットによるリポジトリの整合性に基づいています。非常に読みやすく、答えに入れることができる以上の情報です。)

gitリポジトリが危険にさらされる方法はいくつかあります(これはセキュリティ上の欠陥ではなく、単なる現実です。このため、gitの使用を避けるべきではありません)。たとえば、誰かがあなたであると主張してあなたのリポジトリにプッシュしたかもしれません。または、そのことについて、誰かがあなたであると主張する他の誰かリポジトリにプッシュすることもできます(誰かがあなたであると主張する自分のリポジトリにプッシュすることもできます)。これはDVCSの人生の一部にすぎません。

例として:

$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email muchiha@example.com

そこで、私はあなたのふりをするためにgit設定を変更しました。そして今、私は離れてコミットし、それらのコミットを何らかの形で本番ビルドに入れることができます。あなたはそれをやったようです。

コミット(およびタグ)に署名することで、特定のコミットおよびタグがあなたからのものであることを証明できます(そして、署名されていないものは本番ビルドに入れてはいけません)。それが本当にすべての鍵です。コミットに署名することで、それがあなたの仕事だと言いました。

「あなたの仕事」の側面は、著作権訴訟で時折ヒットするLinuxカーネル(およびgit)で特に重要です。コミットに署名することで、あなたはソフトウェアに対する権利を持っていると言います—それは起源を追跡します。著作権として主張されているソースにアクセスできず、主張が根拠のないものである可能性があります。それは会社があなたが数年前に彼らのために働いていたことを忘れている可能性があり、その指示の下、カーネル、または任意に材料を追加しました。

すべてのコミットに署名する必要があるかどうかについては、いくつかの議論があります。git commitのGPG署名から(2009年に戻る)、Linusは次のように書いています。

各コミットに署名することはまったくばかげています。それはあなたがそれを自動化することを意味し、あなたは署名の価値を減らします。また、SHA1のgit DAGチェーンの動作方法から、実際の価値が追加されることはありません。その1つの署名があれば、その1つからすべてのコミットを効果的にカバーできます。したがって、各コミットに署名するだけでは、ポイントが失われます。

gitでの署名に関する考え方については、こちらでも読むことができます。

とはいえ、とにかくgitに移行しました。

コミットへの署名は不要であるという大多数のコンセンサスがあるようですが、タグへの署名は非常に優れています。上部にリンクされているそのブログ投稿は、とにかくすべてに署名する必要があることを示唆しています。私が言ったように、すべてのコミットが必要かどうかについていくつかの議論があります。

「すべてのコミットに署名する」議論の鍵は、おそらくあなたが使用するワークフローに関係しています。ほとんどの人はローカルリポジトリで大量のコミットを行い、そのセットをプッシュします。最終コレクションにタグを付けるだけで十分です(つまり、すべての変更が正しいことを確認します)。多数の単一コミットが動き回る環境で作業している場合、タグとコミットの区別はより少なくなり、明確になり、コミットの署名がより便利になる場合があります。


5
(最後のタグにタグ付けするだけで)十分かもしれませんが、なぜすべてのコミットにタグ付けしないのでしょか?
ハイド

3
タグを使用しない怠け者として、私は前のコメントを更新しています。私のワークステーションのgit configには、commit.gpgsign = true欠点はありません。馬鹿げているかもしれませんが、それほど高価ではないようです。
pnovotnak

3
これについては@pnovotnakと一緒に行きますが、なぜあなたはこれをしないのですか?私は自分のコミットに署名し、別の開発者が同じプロジェクトに参加していないことを意味します、誰が気にしますか?しかし、ハッカーが私の身元を盗もうとすると、署名を指摘できます。署名には利点があるだけのように思えます。私はあなたの署名の価値が減ることに同意しますが、あなたはそれについて考える必要がないことと引き換えにします。その基本的に無料のセキュリティ。
ジャッピーカーク

2
私の個人的な意見では、すべてのコミットに署名することは良いことです。署名付きのコミットが私から送られてきたことはかなり確信で​​きますが、バニラgitで作成者になりすますことは簡単です。私はむしろそれをあなたがそうでなければあなたがそうであると仮定する人であり、セキュリティではない無料の検証と呼びたいです。
Bertoの

1
@JosiahYoder。いいえ、Githubはメールがサービスにないためプッシュを拒否しません。別のサービス(つまり、Bitbucket)でコードをホストしていて、リポジトリを別のプロバイダーに移動したいとします。これにより、ユーザーがリポジトリを転送(複数のユーザーによる複数のコミット)したり、ミラーを作成したりすることができなくなります。これはDVCSの機能です。
リッキーノタロガルシア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.