テック技報最新号へ →
セキュリティ

.gitignore に入れたはずの .env が漏れていないか 5 か所で点検する

「.gitignore に書いたから大丈夫」は、すでに追跡中のファイルと過去の履歴には効かない。今のファイル・Git 履歴・公開 JS・ホスティング/GitHub 設定・AI エージェントの 5 か所を 30 分で確認し、見つかったら履歴を直す前に鍵を無効化する。

@yousukezan · 2026-10-16
#secrets#dotenv#git#github#secret-scanning#nextjs#vercel#key-rotation

いつ使うか

まず「公開してよい鍵」と「秘密の鍵」を分ける

サービス公開してよい秘密にする
StripePublishable key(pk_)Secret key(sk_)、Restricted key(rk_)
Supabasepublishable(旧 anon)secret(旧 service_role)
FirebaseWeb 用 apiKey(Security Rules と App Check で守る前提)Gemini API の鍵
OpenAI / AnthropicなしAPI キーはすべて

Supabase の旧キー(anon / service_role)は 2026 年末に廃止予定なので、新キーへの切り替えも予定に入れる。

5 か所の点検

1. 今の .env が Git の追跡対象になっていないか

bash
git ls-files .env          # 何か表示されたら追跡中
git rm --cached .env       # 追跡をやめる(履歴は消えない)

git check-ignore -v .env は追跡中のファイルには何も出さない。「何も出ない=無視されている」と誤解しない。

2. Git 履歴に .env や鍵の文字列が残っていないか

bash
git log --all --oneline -- .env                # .env を変更したコミット
git log --all --oneline -S"変数名や鍵の一部"     # 文字列が追加/削除されたコミット
git grep -n "sk-proj-" $(git rev-list --all)   # 全コミットから鍵の接頭辞を検索

専用ツールなら gitleaks(新機能追加は終了しセキュリティ修正のみ)や trufflehog。trufflehog の「本物か確かめる」機能は鍵を外部サービスへ送るので、使う前に設定を確認する。

3. 公開サイトの JavaScript に秘密が埋め込まれていないか

  • Next.js の NEXT_PUBLIC_ 付き変数はビルド時にブラウザ向け JS に埋め込まれる。秘密には付けない。
  • 公開サイトを開き、開発者ツールで読み込まれた JS を sk_ / sk-proj- など使っている鍵の接頭辞で検索する。pk_ や publishable が出るのは正常なので、上の表で切り分ける。

4. Vercel と GitHub の設定

  • Vercel の環境変数は秘密を Sensitive(Secret) として保存する(書き込み専用になり、32 文字以上の値はビルドログで伏せ字)。
  • GitHub は公開リポジトリの secret scanning と個人の push protection が既定オン(Settings → Code security →「Push protection for yourself」で確認)。リポジトリ単位の push protection は既定オフ。非公開リポジトリはパートナー通知の対象外なので「非公開だから安心」と思わず自分で履歴を調べる。

5. AI エージェントが .env を読めないか

見つかったときの順番(ここが一番大事)

  1. 発行元で古い鍵を無効化し、新しい鍵を発行(Stripe は API keys の Rotate key、Anthropic は Console の API keys で Disable / Delete)。履歴を直している間も古い鍵は使えるので先に止める。
  2. 新しい鍵へ差し替えたうえで、必要なら履歴を書き換える:
    bash
    git filter-repo --sensitive-data-removal --invert-paths --path .env
  3. fork・他人の clone・キャッシュのコピーは消せない。鍵を止める手順は省略しない。

チェックリスト

  • [ ] git ls-files .env で追跡されていない
  • [ ] 履歴を .env のパスと鍵の文字列で検索した
  • [ ] 公開サイトの JS を鍵の接頭辞で検索した
  • [ ] Vercel の Sensitive 設定、GitHub の secret scanning / push protection(リポジトリ単位も)を確認した
  • [ ] AI エージェントに .env を読ませない設定を入れた
  • [ ] 漏れた鍵は履歴修正より先に無効化・再発行した

出典

X の元の投稿を開く