.gitignore に入れたはずの .env が漏れていないか 5 か所で点検する
「.gitignore に書いたから大丈夫」は、すでに追跡中のファイルと過去の履歴には効かない。今のファイル・Git 履歴・公開 JS・ホスティング/GitHub 設定・AI エージェントの 5 か所を 30 分で確認し、見つかったら履歴を直す前に鍵を無効化する。
いつ使うか
- 個人開発や小規模チームで、Next.js を Vercel などに載せ、Stripe / Supabase / Firebase / OpenAI / Anthropic の鍵を使っているとき。
- 公開前の最終確認、または「昔一度 .env をコミットしたかも」と思ったとき。
- 常設の対策(Semgrep+gitleaks(+secretlint)の二段構えを全リポジトリに入れる)を入れる前の棚卸しとして。
まず「公開してよい鍵」と「秘密の鍵」を分ける
| サービス | 公開してよい | 秘密にする |
|---|---|---|
| Stripe | Publishable key(pk_) | Secret key(sk_)、Restricted key(rk_) |
| Supabase | publishable(旧 anon) | secret(旧 service_role) |
| Firebase | Web 用 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 を読めないか
- Claude Code や Codex は設定しなければ作業フォルダの
.envを開ける。読ませない設定を入れ、Bash を全許可しない。詳細は .env を AI コーディングエージェントに読ませない(hooks・deny ルール)。
見つかったときの順番(ここが一番大事)
- 発行元で古い鍵を無効化し、新しい鍵を発行(Stripe は API keys の Rotate key、Anthropic は Console の API keys で Disable / Delete)。履歴を直している間も古い鍵は使えるので先に止める。
- 新しい鍵へ差し替えたうえで、必要なら履歴を書き換える:
bash
git filter-repo --sensitive-data-removal --invert-paths --path .env - fork・他人の clone・キャッシュのコピーは消せない。鍵を止める手順は省略しない。
チェックリスト
- [ ]
git ls-files .envで追跡されていない - [ ] 履歴を
.envのパスと鍵の文字列で検索した - [ ] 公開サイトの JS を鍵の接頭辞で検索した
- [ ] Vercel の Sensitive 設定、GitHub の secret scanning / push protection(リポジトリ単位も)を確認した
- [ ] AI エージェントに
.envを読ませない設定を入れた - [ ] 漏れた鍵は履歴修正より先に無効化・再発行した
出典
- @yousukezan · 2026-10-15
- 元記事(Qiita, BPR_Prot): qiita.com