Git のコミット作成者の確認
認可チェックを無効にするコミットが見つかった。author は開発者の鈴木氏だが,本人は作成していないと述べている。次は git log の出力であり,%G? は署名の検証結果(G:正しい署名,B:不正な署名,N:署名なし),%GS は署名者の名前を表す。
$ git log -3 --format='%h %G? [%GS] author=%an committer=%cn %s'
9f3c2a1 N [] author=Suzuki committer=Suzuki 認可チェックを無効化
5d81e0b G [Tanaka <tanaka@example.com>] author=Tanaka committer=Tanaka 検索 API の修正
2b77c4e G [Suzuki <suzuki@example.com>] author=Suzuki committer=Suzuki ログ出力の追加この出力から言えることとして,適切なものはどれか。
- ア9f3c2a1 は署名の検証に失敗しているので,コミットの作成後に内容が改ざんされたと判断できる。
- イ9f3c2a1 の author と committer は,コミットを作成する者が任意に設定できる値であり,署名もないので,この出力からは鈴木氏が作成したとは確認できない。
- ウコミット ID は author を含むコミットの内容から計算したハッシュ値なので,9f3c2a1 の author が鈴木氏であることは,鈴木氏が作成したことの根拠になる。
- エ5d81e0b は田中氏の鍵による正しい署名が付いているので,田中氏以外の開発者がこのコミットの内容をレビューして承認したことが確認できる。
正解と解説を見る
正解 イ
この問題の基礎知識
- Git のコミットの author と committer の名前とメールアドレスは,git config や環境変数などでコミットを作成する者が自由に設定できる値であり,作成者の認証にはならない。
- コミットにデジタル署名を付けると,署名した鍵の持ち主によって署名されたことと,署名後に内容が変更されていないことを検証できる。レビューや承認の有無は署名からは分からない。
- git log の %G? は署名の検証結果を示し,G は正しい署名,B は不正な署名,N は署名なしを表す。コミット ID は内容から計算したハッシュ値であり,内容の変更の検知には役立つが,誰が作成したかは示さない。
ア9f3c2a1 は署名の検証に失敗しているので,コミットの作成後に内容が改ざんされたと判断できる。
9f3c2a1 の検証結果 N は署名がないことを示し,署名の検証に失敗したこと(B)を示すものではない。この出力から改ざんの有無は判断できない。
イ9f3c2a1 の author と committer は,コミットを作成する者が任意に設定できる値であり,署名もないので,この出力からは鈴木氏が作成したとは確認できない。正解
author と committer の名前やメールアドレスは,git config や --author オプション,環境変数で誰でも設定できる。署名のない 9f3c2a1 は,鈴木氏以外の者が鈴木氏の名前で作成した可能性を否定できない。
ウコミット ID は author を含むコミットの内容から計算したハッシュ値なので,9f3c2a1 の author が鈴木氏であることは,鈴木氏が作成したことの根拠になる。
コミット ID は作成後の内容の変更を検知する手掛かりにはなるが,作成者を認証するものではない。他人が鈴木氏の名前を author に設定して新しくコミットを作れば,それに対応する正しいコミット ID が計算される。
エ5d81e0b は田中氏の鍵による正しい署名が付いているので,田中氏以外の開発者がこのコミットの内容をレビューして承認したことが確認できる。
コミットの署名が示すのは,そのコミットが署名した鍵の持ち主によって署名され,署名後に変更されていないことである。他の開発者によるレビューや承認の有無は署名からは分からず,プルリクエストの承認記録などで確認する。
検証用の出典出典照合済み
Git Documentation: pretty-formats(%G?,%GS) / Git Documentation: git-commit(--author,COMMIT INFORMATION) / Git Documentation: gitdatamodel(object ID,commit)照合の根拠(6 件)
- ア(誤り): 検証失敗(不正な署名)は B であり,N とは別
%G?+:: show "G" for a good (valid) signature, "B" for a bad signature,
Git Documentation: pretty-formats · %G?(新しいタブで開きます) - ア(誤り)・イ(正解): N は署名がないことを示す
and "N" for no signature
Git Documentation: pretty-formats · %G?(新しいタブで開きます) - イ(正解): author と committer は環境変数などからコミットを作る者が設定する値である
Author and committer information is taken from the following environment variables, if set:
Git Documentation: git-commit · COMMIT INFORMATION(新しいタブで開きます) - イ(正解): --author でコミットの author を任意に上書きできる
Override the commit author. Specify an explicit author using the standard `A U Thor ` format.
Git Documentation: git-commit · OPTIONS --author(新しいタブで開きます) - ウ(誤り): コミット ID は内容のハッシュ値であり,他人が鈴木氏の名前で作ったコミットにもそれに対応する ID が計算される(作成者の認証にはならない)
an *ID* (aka "object name"), which is a cryptographic hash of its type and contents.
Git Documentation: gitdatamodel · Objects(新しいタブで開きます) - エ(誤り): 署名から分かるのは署名者であり,他者のレビューや承認ではない
%GS+:: show the name of the signer for a signed commit
Git Documentation: pretty-formats · %GS(新しいタブで開きます)
%G? には U・X・Y・R・E もあるが,問題文は出力に現れる G・B・N だけを示しており,解答に影響しない。