0.そもそもGPG署名とは
一言でいうと、GPG署名は「このコミットは間違いなく本人が作成したものである」ということを暗号学的に証明する、なりすまし防止の仕組みです。
1. GitHubのコミット情報は誰でも偽装できる
Gitの仕組み上、コミットに記録される名前とメールアドレスは、ローカル環境で以下のように設定するだけで誰でも自由に変更できます。
git config --global user.name "有名開発者の名前"
git config --global user.email "elonmusk@tesla.com"
この状態でコミットしてGitHubにプッシュすると、コミット履歴にはその名前とメールアドレスがそのまま表示されます。ユーザー名がGitHub上の登録アドレスと一致していれば、該当ユーザーのアイコンまで紐づいて表示されるため、見た目だけではその人物が本当にコードを書いたのかどうか判断できません。
2. 「Verified」バッジによる信頼の担保
GPG鍵を設定してコミットに署名すると、GitHubはその署名が公開鍵に対して暗号学的に検証可能かどうかを確認します。検証に成功すると、コミットやプルリクエストの履歴に緑色の Verified(確認済み)バッジが表示されます。
| 状態 | 説明 |
|---|---|
| 署名なし | 名前・メールアドレスだけでは本当の作成者を客観的に証明できない |
| 署名あり(Verified) | 秘密鍵を持つ本人が作成したコミットであることが暗号学的に裏付けられている |
なお、GitHubはGPGだけでなくSSH鍵やS/MIMEによる署名も検証対象としており、個人利用であればGPGかSSHのどちらかを使うのが一般的とされています。SSH署名は鍵の生成・運用がシンプルな一方、GPGには鍵の有効期限設定や失効(リボーク)といった、SSHにはない機能があります。
3. 放置すると起こりうるセキュリティリスク
GPG署名を使わずに開発を続けると、いわゆる「サプライチェーン攻撃」の標的になるリスクが残ります。
というのも、
コミット署名がない場合、コミット作成者の真正性を検証しにくくなり、
なりすましや出自の偽装を検出しづらくなる。これはサプライチェーンセキュリティ上のリスク要因の一つになりうるからです。
なりすましによる不正コードの混入
悪意ある第三者が、リポジトリの管理者や信頼されているシニアエンジニアの名前・メールアドレスを偽ってコミットを作成し、バックドアや脆弱性を含むコードをプルリクエストとして送り込む。表示上の名前だけで信用してマージしてしまうと、製品に深刻な脆弱性が組み込まれる恐れがあります。
4. GPG署名導入によるメリット
-
ソースコードの完全性の証明
オープンソース(OSS)開発や、金融・インフラなど厳格なセキュリティ要件を持つプロジェクトでは、コミットの出自を保証できることが重要な要件になります。 -
コンプライアンス・監査対応
ISMSなどのセキュリティ監査において、「誰が・いつ・どのコードを変更したか」という変更履歴の信頼性を高める根拠になります。 -
アカウント侵害時の被害抑制
GitHubのパスワードやアクセストークンが漏洩したとしても、攻撃者の手元にGPGの秘密鍵そのものがなければ、その攻撃者はVerified付きのコミットを作ることはできません。
ただし、これは秘密鍵の管理が適切であることが前提です。秘密鍵自体が漏洩・流出してしまった場合は、攻撃者も Verified なコミットを作成できてしまうため、署名鍵はパスワードと同様、あるいはそれ以上に厳重に管理する必要があります。漏洩が疑われる場合は、速やかにGitHub上で鍵を失効(削除)し、新しい鍵を再登録してください。
5. 設定方法
ここでは一例として、RSA 4096方式で行います。
Step 1: 既存のGPG鍵を確認する
gpg --list-secret-keys --keyid-format=long
すでに鍵があれば、sec の行に表示される鍵IDを使って後続の手順に進めます。
Step 2: 新しいGPG鍵を生成する
gpg --full-generate-key
対話形式で以下を選択・入力します。
- 鍵の種類:
RSA and RSA(デフォルトのままで問題ありません) - 鍵長:
4096 - 有効期限: 組織の方針に合わせて設定(例:
1yで1年) - 名前・メールアドレス: GitHubに登録しているメールアドレスと一致させる(重要)
- パスフレーズ: 推測されにくいものを設定
生成後、鍵IDを確認します。
gpg --list-secret-keys --keyid-format=long
出力例:
sec rsa4096/3AA5C34371567BD2 2026-06-20 [SC]
この場合 3AA5C34371567BD2 が鍵IDです。
Step 3: 公開鍵をエクスポートしてGitHubに登録する
gpg --armor --export 3AA5C34371567BD2
-----BEGIN PGP PUBLIC KEY BLOCK----- から -----END PGP PUBLIC KEY BLOCK----- までの内容をコピーし、GitHubの Settings → SSH and GPG keys → New GPG key に貼り付けて登録します。
Step 4: Gitに署名鍵を伝える
git config --global user.signingkey 3AA5C34371567BD2
Step 5: コミットを署名する
個別のコミットで署名する場合:
git commit -S -m "コミットメッセージ"
毎回 -S を付けるのを忘れないよう、以降すべてのコミットを自動的に署名する設定にしておくと便利です。
git config --global commit.gpgsign true
タグにも署名したい場合は同様に以下を設定します。
git config --global tag.gpgsign true
Step 6: パスフレーズの自動入力を設定する(任意)
毎回パスフレーズを入力するのが煩わしい場合、OSごとに以下のようなツールでパスフレーズをキャッシュ・保存できます。
- macOS: GPG Suite(macOSのキーチェーンと連携)
- Windows: Gpg4win
- Linux:
gpg-agentの設定
Step 7: プッシュして確認する
git push
GitHub上でコミット履歴を開き、コミットメッセージの横に緑色の Verified バッジが表示されていれば設定は成功です。
6.終わりに
Gitのコミットに署名するのは、現実世界でいえば「本人確認書類の提出」ような行為です。
最初は鍵の作成やGitHubへの登録にやや手間がかかりますが、git config --global commit.gpgsign true を一度設定してしまえば、以降は意識せずとも自動的に署名されるようになります。
また、理想を言えば各環境ごとに鍵を使い分けるのが理想です。
チームの安全と自分自身のコードに対する信頼性を守るためにも、GPG署名(または近年利用が増えているSSH鍵による署名)の導入を検討してみてください。