GitHubのパスキー導入とSSH鍵によるGitコミット署名(Verifiedバッジ)・シークレット漏洩防止の実践設定
ソフトウェア開発において、ソースコードそのものだけでなく 「誰がそのコードを書いたのか(コミットの真正性)」「リポジトリへのアクセス権や API キーが漏洩していないか」 を守るサプライチェーンセキュリティの重要性が年々高まっています。
特に個人開発者や少人数の開発チームで見落とされがちなのが、以下の3つのリスクです。
- Git の
user.name/user.emailは誰でも任意に偽装できる(署名なしコミットは本人性の証明にならない) - TOTP(6桁のワンタイムコード)方式の二要素認証は、リアルタイムフィッシングに対して脆弱になり得る
.envファイルや API トークンを誤ってコミットし、一度でもgit pushすると数秒でボットに検知・悪用される
本記事では、これら3つの課題を最小限の手間で防ぐための 「GitHub パスキー認証」「Ed25519 SSH 鍵によるコミット自動署名」「Gitleaks + Push Protection によるシークレット漏洩防止」 の実践設定を解説します。
1. GitHub アカウントをパスキー(Passkeys / WebAuthn)で保護する
従来の二要素認証(認証アプリによる6桁コード入力)は、攻撃者が用意した偽のログイン画面にコードを入力してしまうと突破されるリスク(中間者攻撃型フィッシング)がありました。
1.1 パスキー設定時のベストプラクティス
GitHub の 「Settings」>「Password and authentication」>「Passkeys」 から以下の構成で登録しておくのがおすすめです。
- メイン認証手段:Mac の Touch ID(iCloud キーチェーン同期)またはパスワードマネージャー(1Password 等)のパスキーを登録
- バックアップ手段:万が一の端末紛失や OS 障害に備え、物理セキュリティキー(YubiKey 等)と Recovery codes(リカバリーコード)のオフライン保管 を必ず併用する
2. 面倒な GPG 設定は不要!既存の SSH 鍵(Ed25519)で Git コミットに署名する
Git は仕様上、git config user.email に他人のメールアドレスを設定してコミットを作成することが可能です。そのため、コミットが本当に本人によって行われたことを証明するには 暗号署名(Commit Signing) が必要になります。
2.1 GitHub への Signing Key 登録
- 手元の公開鍵(例:
~/.ssh/id_ed25519.pub)の内容をコピーします。Terminalpbcopy < ~/.ssh/id_ed25519.pub - GitHub の 「Settings」>「SSH and GPG keys」>「New SSH key」 を開きます。
- Key type のプルダウンで
Authentication KeyではなくSigning Keyを選択 して登録します(同じ公開鍵を Authentication 用と Signing 用の両方として登録可能です)。
2.2 ローカルの ~/.gitconfig 設定(自動署名の有効化)
次に、すべてのコミットとタグに対して SSH 鍵で自動署名を行うよう Git を設定します。
# 1. 署名フォーマットを GPG ではなく SSH に変更
git config --global gpg.format ssh
# 2. 署名に使用する SSH 公開鍵のパスを指定
git config --global user.signingkey ~/.ssh/id_ed25519.pub
# 3. すべての git commit 時に自動で署名(-S)を付与する
git config --global commit.gpgsign true
# 4. git tag 作成時にも自動で署名を付与する
git config --global tag.gpgsign true2.3 ローカルでの署名検証(git log --show-signature)用の設定
自分のローカル環境でも git log --show-signature で署名を検証できるように、allowed_signers ファイルを作成して登録しておきます。
# メールアドレスと公開鍵を紐づけた allowed_signers ファイルを作成
echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/id_ed25519.pub)" >> ~/.ssh/allowed_signers
# Git に allowed_signers ファイルの場所を登録
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers設定後、適当なリポジトリでコミットを作成し、以下のコマンドで確認します。
git log -1 --show-signature出力に Good "git" signature for your-email@example.com with ED25519 key SHA256:... と表示され、GitHub にプッシュした際に緑色の Verified バッジ が付けば完了です。
3. API キーや .env の誤コミットを水際で防ぐ 2段階防御
どれだけ認証や署名を固めても、ソースコード内に Cloudflare の API トークンや OpenAI / AWS のシークレットキーをハードコードして公開リポジトリにプッシュしてしまえば、重大なインシデントにつながります。
| 防御レイヤー | 使用ツール・機能 | 役割とメリット |
|---|---|---|
第1段階:ローカル (pre-commit) | gitleaks | git commit した瞬間にステージング差分をスキャンし、APIキーらしき文字列があればコミット自体を中断する(履歴に一切残らない) |
第2段階:リモート (git push) | GitHub Push Protection | 万が一ローカルチェックをすり抜けても、git push 時に GitHub 側がシークレットを検知してプッシュを拒否する |
3.1 gitleaks の導入とスキャン実行
macOS では Homebrew で gitleaks を導入し、既存リポジトリの過去履歴にシークレットが含まれていないか一瞬で検査できます。
# 1. gitleaks のインストール
brew install gitleaks
# 2. リポジトリ全体の過去コミット履歴をスキャン
gitleaks detect --source . -v
# 3. ステージング済み(git add 済み)の差分だけを高速スキャン(pre-commit フック向け)
gitleaks protect --staged -v.git/hooks/pre-commit に gitleaks protect --staged を仕込んでおくことで、誤ってトークンを書いたままコミットしようとしても即座にターミナル上で警告が表示され、履歴が汚れるのを未然に防げます。
3.2 GitHub Secret Scanning(Push Protection)の有効化
さらに、GitHub の 「Settings」>「Code security」 から以下の項目を ON にしておきます。
- Secret scanning > Push protection for yourself:有効(
Enabled)
これを有効にしておくと、自分がどのリポジトリへ git push する際にも、GitHub が認識している数百種類のクラウド・SaaS トークン形式を自動検査し、検出された場合はプッシュをブロックしてくれます。
まとめ
開発環境のセキュリティ強化は、一度仕組みとして自動化してしまえば日々の開発スピードを一切落とさずに維持できます。
まだ未設定の項目があれば、ぜひ手元の環境で順番に有効化してみてください。