1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Git履歴からSecretsを完全削除するには?filter-repoの使い方

Posted at

はじめに

  • 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 .envgit commitgit 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と自動チェックの導入 今後の再発防止へ
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?