GitHub「Commit Signing」完全ガイド:GPG/SSH鍵でコミットの正当性を証明し、なりすましを防ぐ
こんにちは。テックリードの私だ。
日々の開発において、`git commit` や `git push` は呼吸をするように行っていることだろう。しかし、あなたが今日リポジトリにプッシュしたその輝かしいコード、本当に「あなた」が書いたものと言い切れるだろうか?
Gitの歴史において、作者名(Author)やコミッター名(Committer)は、極めて簡単に偽装できる。`git config user.name “Linus Torvalds”` と設定してコミットを積むことは、小学生でも数秒でできてしまう。個人開発なら笑い話で済むが、エンタープライズ環境や信頼性が命のオープンソース・プロジェクト(OSS)において、これはサプライチェーン攻撃の温床となる致命的な脆弱性だ。
今回は、この「なりすまし」を完全無力化し、あなたのコードの正当性を暗号学的に担保する「Commit Signing(コミット署名)」について、GPGとSSHそれぞれの実践的アプローチからチームへの強制ルール化まで、現場のプロが知るべきすべてを解説する。
—
なぜ、今「コミット署名」が必須なのか?
GitHubのプロフィール画面を見ると、マージされたコミットの横に 「Verified」 という緑色のバッジが表示されているのを見たことがあるだろうか?
あれこそが、そのコミットが正当な持ち主によって書かれ、途中で改ざんされていないことをGitHubが暗号学的に証明している証拠だ。
[master a1b2c3d] feat: 究極の高速化ロジクト (Verified)
もし署名をしていない場合、悪意ある第三者があなたのメールアドレスをローカルのGit設定に紐付け、バックドアを仕込んだコードをあなた名義でコントリビュートすることが技術的に可能になる。SOC2やISO 27001などのセキュリティ監査が厳格化する昨今、「誰がこのコードを書いたのか」を数学的に証明できない状態は、プロフェッショナルとして許されないリスクなのだ。
—
1. 署名方式の選択:GPG vs SSH
GitHubで使えるコミット署名方式には主に GPG (GNU Privacy Guard) と SSH の2つがある。
- GPG方式: 伝統的かつ最も強力。鍵の有効期限設定や、より高度な暗号学的制御が可能だが、セットアップと鍵の管理がやや煩雑。
- SSH方式: 現代のデファクトスタンダード。 すでにGitHubへの認証にSSHを使っているなら、既存の鍵をそのまま署名に流用できるため、導入コストがほぼゼロ。
結論から言えば、特別な要件がない限り「SSH鍵による署名」を強く推奨する。 設定が圧倒的にラクであり、開発スピードを落とさない。
—
2. ステップバイステップ:SSH鍵によるコミット署名の全手順
ここからは、最も効率的なSSH方式をベースに、実務で即座に導入するための手順を解説する。
Step 1: 署名用SSH鍵の生成(または既存鍵の流用)
もし既に `~/.ssh/id_ed25519` などのEd25519鍵を持っているなら、それをそのまま流用できる。新しく専用の鍵を作る場合は以下を実行する。
Ed25519アルゴリズムを使用して安全な鍵を生成
ssh-keygen -t ed25519 -C “your_email@example.com” -f ~/.ssh/id_ed25519_github
Step 2: GitHubへの公開鍵の登録
生成した公開鍵(例: `~/.ssh/id_ed25519_github.pub`)の中身をコピーし、GitHubのSettings > SSH and GPG keys から “New SSH key” を登録する。
この際、Key typeを “Signing Key” に指定することを忘れないようにしてほしい(認証用と署名用の両方にチェックを入れても良い)。
Step 3: Gitへの署名設定(ローカル)
ローカルのGitに対し、どの鍵を使って署名するかを教え込む。
署名方式としてSSHを指定
git config –global gpg.format ssh
使用するSSHの公開鍵(または秘密鍵)のパスを指定
git config –global user.signingkey ~/.ssh/id_ed25519_github
【重要】コミット時に自動で署名を行うフラグを有効化
git config –global commit.gpgsign true
ここまで設定すれば、あとは普通に `git commit -m “feat: xxx”` を叩くだけで、自動的にSSH署名が付与されるようになる。
—
3. 【プロの技】開発スピードを極限まで高めるハック
セキュリティを厳格にすると「開発がめんどくさくなる」というジレンマが生まれる。これを解決するのがプロの自動化ハックだ。
キーボードショートカットとVS Code連携
ターミナルでの作業が多いなら、シェルのエイリアスに組み込むか、IDEのインテグレーションを活用しよう。
VS Codeを使用している場合、`settings.json` に以下を記述しておくと、内蔵のGitパネルからのコミットでも自動で署名が走る。
{
“git.enableCommitSigning”: true
}
パスフレーズ入力を省略する(macOS Keychain / ssh-agent)
SSH署名のたびに秘密鍵のパスフレーズを聞かれるのは、開発のリズムを崩す最大のストレスだ。macOSであれば、Keychainにパスフレーズを記憶させよう。
`~/.ssh/config` に以下の設定を追記する。
-config
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519_github
これで、セキュリティを担保したまま、パスフレーズ入力を意識することのないシームレスな爆速開発環境が手に入る。
—
4. チーム開発で役立つ「設定の共有化ルール」とベストプラクティス
個々の開発者が勝手に設定するだけでは、チーム全体のセキュリティ水準は担保できない。テックリードとして組織にコミット署名を義務付けるための仕組みを解説する。
組織全体(GitHub Organization)での署名強制
GitHub EnterpriseやOrganizationのセキュリティ設定では、「Strict verification(厳格な検証)」を有効にすることを強く推奨する。
- 設定場所: `Organization Settings` > `Repository defaults` > `Commit signing`
- 効果: リポジトリに対するすべてのプッシュに対して、署名されたコミットのみを許可(unsignedなコミットを拒否)するように設定できる。
リポジトリごとの強制:`.gitconfig` のテンプレート化
プロジェクトごとに特定の署名ルールやメールアドレスを強制したい場合、リポジトリローカルの `.git/config` を書き換えるスクリプトをCIやセットアップスクリプト(`Makefile` など)に組み込む。
実用的な `Makefile` のセットアップ例を以下に示す。
開発環境の初期セットアップを自動化するMakefileの断片
.PHONY: setup-git-security
setup-git-security:
@echo “==> Configuring Git Commit Signing…”
git config gpg.format ssh
git config user.signingkey ~/.ssh/id_ed25519_github
git config commit.gpgsign true
@echo “==> Git security configuration completed successfully.”
新メンバーが参戦した際、`make setup-git-security` を叩くだけで、ヒューマンエラーなくプロジェクト基準の署名体制が構築される。
—
トラブルシューティング:署名が「Unverified」になる原因と対策
もしGitHub上で `Unverified` と表示された場合、以下の3点を確認せよ。
1. メールアドレスの不一致:
Gitのローカル設定(`git config user.email`)に登録されているメールアドレスと、GitHubアカウントに登録しているプライマリ(またはセカンダリ)メールアドレスが完全一致しているか? GitHubは、署名に使われた鍵と、紐づくメールアドレスの整合性を検証している。
2. 鍵の失効・有効期限:
GPGの場合は特に有効期限切れに注意。SSH鍵の場合はGitHub側で「Signing Key」として正しくチェックが入っているか確認する。
3. 環境変数の漏れ:
WSL(Windows Subsystem for Linux)環境などでは、`gpg-agent` や `ssh-agent` が適切にフォワードされていない場合がある。`echo “test” | ssh-keygen -Y sign -f …` などのコマンドで単体テストを行おう。
—
まとめ:信頼をコードのデフォルトに
コミット署名は、単なる「セキュリティのおまじない」ではない。それは、「このコードベースに関わる全員が、プロとしての責任と誇りを持ってコードを書いている」というエンジニアリング文化の証明だ。
今日からあなたの環境でも `commit.gpgsign true` を有効化し、緑色の「Verified」バッジに満ちた美しいコミットログをチームの標準にしよう。その小さな一手間が、あなたのプロダクトをサプライチェーン攻撃から守る最強の盾となる。