Gitシークレットスキャン:Trufflehogでコミット履歴からAPIキーの漏洩を特定する方法

Git tutorial - IT technology blog
Git tutorial - IT technology blog

GitHubにAPIキーが「迷い込んだ」時:誰もが直面しうる問題

かつて、AWSから一晩で5,000ドルの請求が届き、冷や汗を流していた同僚を見たことがあります。原因は、午前2時にパブリックリポジトリへ誤ってプッシュされたアクセスキーを含むconfig.jsonでした。彼はすぐにキーを削除して新しいコミットをプッシュしましたが、時すでに遅しでした。

最も一般的な間違いは、パスワードを含むコード行を削除して新しいコミットを作成すれば安全だと信じることです。実際には、Gitはすべての変更履歴をスナップショットとして保存しています。git checkoutコマンドで古いコミットに戻るだけで、誰でも機密情報を復元できてしまいます。ハッカーの自動スキャンボットを使えば、プッシュしてから60秒以内にコミット履歴の中のシークレットを見つけ出すことも可能です。

なぜ手動の方法は失敗するのか?

多くのチームでは、まだ不十分なセキュリティチェック習慣が残っています。以下のような制限に直面することになります:

  • grepコマンドの使用: この方法では現在のコミット(HEAD)しか検索できません。過去の何百ものコミットや、すでに削除されたブランチにあるデータは完全に見落とされます。
  • 目視によるコードレビュー: 人間は数千行に及ぶ設定ファイルをチェックすると、どうしても目が疲れてしまいます。一見無害に見えるBase64文字列を見逃すだけで、システムが標的になります。
  • 自作スクリプト: ほとんどの単純なスクリプトは正規表現(Regex)に頼っています。これらは大量の誤検知(false positive)を発生させ、結果のフィルタリングに時間を取られてしまいます。

Trufflehog:プロフェッショナルなシークレット・ハンター

Trufflehogは単なる文字列検索ツールではありません. ブランチ、タグからコミット履歴全体まで、あらゆる隅々を捜索するように設計されています。Trufflehogの最大の利点は、700種類以上のディテクター(AWS, Slack, Stripe, Google Cloudなど)を認識し、それらのキーがまだ有効かどうかを確認できる点にあります。

1. LinuxへのTrufflehogのクイックインストール

複雑な設定は不要です。以下のコマンドを使用して、バイナリをシステムに直接インストールできます:

curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh -s -- -b /usr/local/bin

準備が整ったか確認します:

trufflehog --version

2. ローカルリポジトリのスキャンとシークレットの検証

開発中のプロジェクトをスキャンするには、リポジトリのディレクトリに移動して以下を実行します:

trufflehog git file://. --only-verified

重要な注意点: --only-verifiedフラグは非常に強力な機能です。TrufflehogはプロバイダーのAPIに対して匿名の要求を送り、そのキーがまだ有効かどうかを検証します。もし「Verified(検証済み)」と表示されたら、それはまさに時限爆弾を手にしていることを意味します。

3. GitHub/GitLabから直接スキャン

コードをローカルにクローンする時間を無駄にする必要はありません。TrufflehogはURL経由のリモートスキャンをサポートしています:

trufflehog git https://github.com/user/project.git

プライベートリポジトリの場合は、SSHキーを設定するか、URLにトークンを渡すことでツールにアクセス権限を付与できます。

4. 漏洩を発見した際の対処フロー

もし有効なシークレットが見つかっても、パニックにならないでください。以下の3つの「応急処置」を正しく実行してください:

  1. 即座に無効化(Revoke): 各サービスのダッシュボード(AWSコンソールなど)にアクセスし、漏洩したキーを削除します。これが最優先事項です。
  2. Git履歴の削除: git-filter-repoなどのツールを使用して、すべてのコミットからファイルや文字列を完全に削除します。単なるgit rmでは不十分です。
  3. 新しいキーの発行: 新しいクレデンシャルを作成し、環境変数(Environment Variables)を更新します。設定ファイルにハードコードすることは絶対に避けてください。

Git Hooksで「予防」を徹底する

最善の対策は、問題が発生する前に未然に防ぐことです。プロジェクトのpre-commit hookにTrufflehogを統合することをお勧めします。

.pre-commit-config.yamlファイルを以下のように設定します:

repos:
-   repo: https://github.com/trufflesecurity/trufflehog
    rev: main
    hooks:
    -   id: trufflehog
        name: TruffleHog
        entry: trufflehog git file://. --only-verified --fail
        language: system
        stages: [commit]

これにより、今後git commitを実行するたびに、システムが自動的にチェックを行います。機密性の高いキーが検出された場合、コミットは即座に拒否されます。

おわりに

セキュリティはゴールではなく、継続的なプロセスです。Trufflehogのような無料ツールは、チームを莫大な経済的損失や信用の失墜から救うことができます。今日、5分時間を割いて重要なリポジトリをスキャンしてみてください。もしかしたら、前任者が残した危険な「遺産」が見つかるかもしれません。

Share: