はじめに
- Gitで
.envやAPIキー、秘密鍵などをうっかりcommit & pushしてしまう事故は多い。 - Gitの特性上、履歴に残るため、単に削除しても意味がない。
- 今回はそのような事故の際に、Git履歴からSecretsを完全に削除する方法を紹介。
なぜ「削除」だけでは危険なのか?
- Gitは「差分の履歴をすべて保存」するため、過去のcommitに残っていれば復元できてしまう。
- GitHubやGitLabでは、pushした瞬間にキャッシュやActionsからもアクセスされる可能性あり。
- 事故直後に行うべき行動と、完全に削除するための手順が重要。
誤ってSecretをpushしてしまったときの緊急対応
① 公開されたキーはすぐに無効化・再生成する
- GitHub Token, AWS Secret, Firebase Keyなどは即無効化
- 誤ってpushされたキーは誰かに見られた前提で対応する
② 該当ファイルを消しただけでは不十分
-
git rm .env→git commit→git pushだけでは履歴に残る
Git履歴からSecretを削除する方法:git filter-repo
なぜfilter-repoを使うのか?
- GitHub公式が
filter-branchやBFGの代わりに推奨 - パフォーマンスも高く、柔軟に使える
インストール
brew install git-filter-repo # macOS
pip install git-filter-repo # Pythonユーザー向け
使い方:特定ファイルを履歴から削除
git filter-repo --path .env --invert-paths
これで.envファイルがすべての履歴から削除される
注意点
- リポジトリの履歴が書き換わるため、リモートに強制pushが必要
- チーム開発中の場合は、他のメンバーも履歴を修正する必要あり
git push --force
対策:今後、Secretをコミットしないための設定
.gitignore に追加
.env
*.key
config/secrets/*
git-secrets を導入して自動チェック
- AWS公式の
git-secretsで、APIキーなどをcommit前に検出
brew install git-secrets
git secrets --install
git secrets --register-aws
.envrc + direnvなどを使ったSecretの安全管理
まとめ
| やること | 解説 |
|---|---|
| Secretの再発行 | 公開されたキーは即無効化が基本 |
| filter-repo or BFGで履歴から削除 | push後の履歴には注意 |
| チームへの連携も忘れずに | 履歴が変わるため、協調が必要 |
.gitignoreと自動チェックの導入 |
今後の再発防止へ |