🔒 情報セキュリティ

GitHubのパスキー導入とSSH鍵によるGitコミット署名(Verifiedバッジ)・シークレット漏洩防止の実践設定

#GitHub#Git#SSH#セキュリティ#パスキー

ソフトウェア開発において、ソースコードそのものだけでなく 「誰がそのコードを書いたのか(コミットの真正性)」「リポジトリへのアクセス権や API キーが漏洩していないか」 を守るサプライチェーンセキュリティの重要性が年々高まっています。

特に個人開発者や少人数の開発チームで見落とされがちなのが、以下の3つのリスクです。

  1. Git の user.name / user.email は誰でも任意に偽装できる(署名なしコミットは本人性の証明にならない)
  2. TOTP(6桁のワンタイムコード)方式の二要素認証は、リアルタイムフィッシングに対して脆弱になり得る
  3. .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 登録

  1. 手元の公開鍵(例:~/.ssh/id_ed25519.pub)の内容をコピーします。
    Terminal
    pbcopy < ~/.ssh/id_ed25519.pub
  2. GitHub の 「Settings」>「SSH and GPG keys」>「New SSH key」 を開きます。
  3. Key type のプルダウンで Authentication Key ではなく Signing Key を選択 して登録します(同じ公開鍵を Authentication 用と Signing 用の両方として登録可能です)。

2.2 ローカルの ~/.gitconfig 設定(自動署名の有効化)

次に、すべてのコミットとタグに対して SSH 鍵で自動署名を行うよう Git を設定します。

Terminal
# 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 true

2.3 ローカルでの署名検証(git log --show-signature)用の設定

自分のローカル環境でも git log --show-signature で署名を検証できるように、allowed_signers ファイルを作成して登録しておきます。

Terminal
# メールアドレスと公開鍵を紐づけた 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

設定後、適当なリポジトリでコミットを作成し、以下のコマンドで確認します。

Terminal
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)gitleaksgit commit した瞬間にステージング差分をスキャンし、APIキーらしき文字列があればコミット自体を中断する(履歴に一切残らない)
第2段階:リモート (git push)GitHub Push Protection万が一ローカルチェックをすり抜けても、git push 時に GitHub 側がシークレットを検知してプッシュを拒否する

3.1 gitleaks の導入とスキャン実行

macOS では Homebrew で gitleaks を導入し、既存リポジトリの過去履歴にシークレットが含まれていないか一瞬で検査できます。

Terminal
# 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 トークン形式を自動検査し、検出された場合はプッシュをブロックしてくれます。


まとめ

開発環境のセキュリティ強化は、一度仕組みとして自動化してしまえば日々の開発スピードを一切落とさずに維持できます。

まだ未設定の項目があれば、ぜひ手元の環境で順番に有効化してみてください。


📚 関連する技術記事

情報セキュリティの記事一覧 →

Webアプリケーションにおけるパスワード認証と保持の正しい仕組み:なぜ「暗号化」もNGで「ハッシュ化」が必須なのか

Webアプリケーションの認証基盤において、パスワードを平文で保存してはいけない理由だけでなく、「暗号化(可逆変換)」での保存もNGである理由、「不可逆な暗号化」という表現が不適切な理由を整理。ソルト・ペッパー・ストレッチングの仕組みと、Argon2idやbcryptを用いた現代の正しい実装方式を解説します。

PHPの重大脆弱性「PHP2Shell」(CVE-2026-109618 / CVE-2026-109619)技術解説:なぜこの事件はAIとセキュリティ史の「転換点」なのか

2026年10月に公開されたPHPコアの致命的なリモートコード実行(RCE)脆弱性「PHP2Shell」(CVE-2026-109618・CVE-2026-109619)の内部メカニズム(zend_bailout / longjmp・multipart解析・Use-After-Free)をエンジニア向けに徹底解説。あわせて、フロンティアAIが10年以上眠っていた脆弱性を発見・連鎖させたこの事件がなぜ時代の転換点なのかを論じます。

eMudhra(emSign)中間CA秘密鍵脆弱性インシデント徹底解説:秘密鍵が「4」になった原因とWebPKI・開発環境への影響

2026年10月に発覚したインドの大手認証局eMudhra(emSign)の中間CA証明書インシデント(Mozilla Bug 2083449)を徹底解説。P-384楕円曲線暗号の秘密鍵スカラー値が「4」などの1バイト整数になっていた技術的原因、Sectigoクロス署名による影響範囲の拡大、各ブラウザの緊急対応、そしてLinux・コンテナ・Python等のバックエンド開発環境で必要な対策をまとめます。