GitHubにAPIキーを置き忘れたら、5分で使われる|gitleaks・TruffleHogで「合鍵の貼り忘れ」を見つける

🔑 基礎知識|開発者のうっかり対策

GitHubにAPIキーを置き忘れたら、5分で使われる「合鍵の貼り忘れ」を無料ツール gitleaks・TruffleHog で見つけて、止める

設定ファイルにAPIキーを書いたまま git push。気づいてファイルを消したから大丈夫……ではありません。公開された鍵は数分で拾われ、消したつもりの履歴にも残り続けます。何が起きるのか、どう見つけるのか、置き忘れたら何から手をつけるのかを1枚の絵から順番に説明します。

APIキー漏えいGitHubgitleaksTruffleHogpre-commit鍵の無効化

🧭 結論:鍵を置き忘れたら「消す」より先に「替える」。そして次から自動で止める

  1. 公開リポジトリに置いたキーは、分単位で拾われます。AWSのキーをわざと置いた実験では、攻撃者は5分以内に見つけて使い始めました。
  2. ファイルを消しても、鍵は残ります。Gitの過去の記録、他人の複製(フォーク)、上書きの記録など、自分では消せない場所に写しがあります。
  3. だから最初にやるのは鍵そのものを無効にして、新しい鍵に替えること。履歴の掃除はそのあとです。
  4. 見つける道具は無料で使えます。gitleaks=コミット前のポケット検査、TruffleHog=拾った鍵が今も開くかを確かめる鍵屋です。
  5. 個人開発者は今日1回スキャン、チームはコミット前の自動チェックを全員に入れ、管理者は鍵の権限と利用上限を絞る。これで「うっかり」の多くは被害になる前に止まります。

鍵を貼ってしまったら、急いで剥がすより先に錠前を替えましょう。

PICTURE0

まずこの1枚

鍵は「貼った瞬間」に拾われ、「剥がしても」写しが残る

公開リポジトリにAPIキーを置き忘れたときに起きること

公開リポジトリに鍵を置き忘れると…… 1 貼ってしまう git push で世界に公開 0分 2 見つかる 収集プログラムが常に巡回 数分 3 使われる 採掘・勝手な利用・持ち出し 5分以内 ※時間はUnit 42の実験(2023年、AWSのキー)。キーの種類や状況で変わります 慌ててファイルを消しても、写しが4か所に残る Gitの履歴 過去のコミットにそのまま残る フォーク・複製 他人の手元の写しは自分では消せない 上書きの記録 force push しても公開の記録に残る 拾った人の手元 一度コピーされたら取り戻せない 正解は「錠前を替える」 貼り紙(コード)を剥がすより先に 鍵を無効化 → 新しい鍵を発行 使われた形跡の確認・履歴の掃除はそのあと 貼らない・見つける無料の道具 gitleaks|家を出る前のポケット検査 コミットする前に鍵を見つけて止める TruffleHog|今も開く鍵かを確かめる鍵屋 過去をまるごと棚卸しし、生きた鍵を優先

この記事で覚えてほしいのは、この1枚だけです。「早く見つかる」「消しても残る」「だから鍵を替える」「次からは貼る前に止める」。以下の章は、この絵の中身を1つずつ確かめていきます。

METAPHOR1

たとえると

APIキーの置き忘れは、「合鍵を町の掲示板に貼る」こと

APIキーは、プログラムがクラウドやAIのサービスに入るための合鍵です。人間のパスワードと違って、持っている人を「本人かどうか」確かめないことがほとんど。鍵を持っている人=入ってよい人として扱われます。

その合鍵を、GitHubの公開リポジトリに置くのは、世界中の人が通る町の掲示板に合鍵を貼るのと同じです。しかもこの掲示板には、合鍵だけを探して24時間見回っている人たちがいます。

🔑 APIキー・トークン・パスワード= 家の合鍵。持っていれば誰でも入れる
📋 公開リポジトリ= 世界中から見える町の掲示板
🤖 自動収集プログラム= 掲示板を24時間見回る「合鍵集め」
📷 Gitの履歴= 掲示板の定点カメラ。剥がしても過去の写真に写っている
🔒 鍵の無効化・再発行= 錠前の交換。古い合鍵はもう開かない
🧰 gitleaks / TruffleHog= 出かける前のポケット検査 / 拾われた鍵が今も開くか調べる鍵屋

※厳密には違う部分もありますが、最初の理解としてはこの絵で十分です。たとえば「非公開リポジトリ」は掲示板ではなく社内の回覧板ですが、回覧板も外に持ち出されることがあります(事例1)。

このたとえで考えると、正しい行動は自然に分かります。貼ってしまった合鍵に気づいたら、掲示板から剥がしに走るより、錠前を替えるのが先。定点カメラの写真や、もう誰かが持ち帰った合鍵は、剥がしても消えないからです。

CASES2

何が起きた?

実際に起きたこと4つ:5年気づかない例も、5分で使われる例もある

2,865万件2025年に公開GitHubへ新たに漏れた秘密(1日あたり約7.8万件)
64%2022年に「使える」と確認された秘密のうち、2026年1月も使えたもの(3つに2つ近く)
2分AWSが漏れたキーに自動で制限をかけるまで(Unit 42の実験)
5分以内攻撃者がキーを見つけて使い始めるまで(同上)

出典:GitGuardian「The State of Secrets Sprawl 2026」(2026年3月)、Palo Alto Networks Unit 42(2023年10月)。「秘密」はAPIキー・トークン・パスワードなどの認証情報のこと。

事例1トヨタ「T-Connect」:委託先が公開設定のままアップロード、約5年気づかず(2022年)

車の通信サービス「T-Connect」のWebサイトを開発していた委託先が、ソースコードの一部を誤って公開設定のままGitHubにアップロードしていました。そのコードに、顧客データが入ったサーバーへのアクセスキーが含まれていました。

公開状態だったのは2017年12月〜2022年9月15日。トヨタは9月15日にコードを非公開にし、9月17日にアクセスキーを変更。メールアドレスとお客様管理番号 最大296,019件が漏れた可能性があると発表しました。不正利用は確認されていないものの、第三者のアクセスは「完全には否定できない」としています。

教訓:自社ではなく委託先のリポジトリから漏れることがある。そして気づいた後の対応は「非公開化」と「キー変更」の2つがセット。

事例2AWSのキーを置いたら5分以内に使われた:Unit 42の実験「EleKtra-Leak」(2023年)

セキュリティ企業Palo Alto NetworksのUnit 42は、わざとAWSのキーを公開GitHubに置いて、何が起きるかを観察しました。

AWSは置かれてから2分以内に、そのキーへ自動で制限(隔離用のポリシー)をかけました。それでも攻撃者は、隔離のわずか4分後に偵察を始めています。研究者が制限を外して観察を続けると、攻撃者は7分で400回を超える操作を自動で行い、高性能なサーバーを各地域に立てて暗号資産(Monero)の採掘を始めました。観察期間中に見つかった採掘用サーバーは474台。この活動は少なくとも2020年12月から続いていたとされます。

教訓:「気づいたらすぐ直す」では間に合わない。人間の反応速度より、拾う側の自動化のほうが速い。

事例3force push で消したはずのコミットから、数千の生きた鍵(2025年)

鍵をコミットしてしまった開発者は、よく git push --force で履歴ごと上書きして「なかったこと」にします。ところがGitHubの公開の出来事は、GH Archiveという外部の記録に残ります。

研究者のSharon Brizinov氏はTruffle Securityと組み、2020年以降の「上書きで消されたコミット」をすべて調べました。結果、数千の有効な秘密が見つかり、報奨金は合計約2万5,000ドル。中には、人気のオープンソース「Istio」の全リポジトリを管理できるトークンもありました。一番多く見つかったファイルは .env です。

教訓:履歴を消しても、公開された時点の記録は外に残る。「一度コミットした鍵は漏れたものとみなし、すぐ無効化する」が研究者の結論。

事例4削除したフォークからも有効なキー40個(2024年)

Truffle Securityは2024年7月、GitHubでは削除したフォーク(複製)や削除したリポジトリのデータにも、条件によってはアクセスできると報告しました。ある大手AI企業の、よくフォークされる公開リポジトリ3つを調べただけで、削除されたフォークから有効なAPIキーが40個見つかっています。GitHubは「仕様どおりの動作」と回答しています。

教訓:「リポジトリごと消したから大丈夫」も成り立たない。確実な対策は鍵の交換だけ。

FLOW3

どうやって起きる?

漏れ方はほぼ同じ:「全部まとめてコミット」から始まる

  1. 鍵をファイルに書く。動作確認のためにコードへ直書きしたり、.env や設定ファイルに書いたりする。AIに書かせたサンプルコードに、そのまま貼っていることもある。
  2. git add . で全部入れる。.gitignore を作り忘れている、または .env を除外し忘れている。
  3. コミットする。この瞬間、鍵はGitの履歴に刻まれる。あとでファイルを消しても、このコミットは残る。
  4. push して公開される。公開リポジトリなら、その瞬間から世界中が読める。非公開リポジトリでも、公開設定のミス・メンバーの持ち出し・委託先経由で外に出ることがある。
  5. 自動収集プログラムが拾う。公開された更新を監視し、鍵らしい文字列を探す仕組みが常に動いている。数分の勝負。
  6. 使える鍵だけが悪用される。クラウドなら採掘用サーバーを立てて高額請求、AIのキーなら他人の利用料で使い放題、データベースなら情報の持ち出し、パッケージ公開用のキーなら不正な版の配布(サプライチェーン攻撃)につながる。

鍵が紛れ込みやすい場所

設定ファイル

.env、config.json、application.properties など。事例3で最多だったのも .env。

コードとテスト

「あとで消す」つもりの直書き。テスト用に本物のキーを使ったコード。AIが生成したサンプル。

コード以外

issue・プルリクエストのコメント、Wiki、Gist、CIのログ。エラー画面を貼ったらキーが写っていた、もよくある。

MYTHS4

昔の常識と何が違う?

「消したから大丈夫」は通用しない:よくある思い込み6つ

思い込み実際は危険度
ファイルを消して push し直したから大丈夫過去のコミットに残っています。GitHub自身も「秘密は履歴に残るので、ファイルを消すだけでなく無効化と交換が必要」と書いています。危険
force push で履歴ごと消した公開の出来事は外部の記録(GH Archive)に残り、そこから数千の鍵が見つかっています(事例3)。危険
数時間以内に気づけば問題ない拾う側は自動で、分単位です(事例2)。気づいた時点で「もう使われたかもしれない」前提で動きます。危険
非公開リポジトリだから大丈夫公開設定のミス(事例1)、メンバーや委託先の持ち出し、非公開→公開への切り替えがあります。GitGuardianは、社内リポジトリは公開リポジトリより約6倍、秘密を含みやすいと報告しています。注意
GitHubが自動で止めてくれる個人向けの「プッシュ保護」は既定でオンですが、止まるのは公開リポジトリへの、対応している種類の鍵だけ。本人が「許可」を押せば通せます。自作システムのパスワードなどは対象外になりがちです。注意
AWSが隔離してくれたから安心隔離用のポリシーは危ない操作の一部を止めるだけです。AWSは「このポリシーを外さず、サポートケースの指示に従う」よう案内しています。鍵そのものの無効化は自分でやります。要対応

AIにコードを書かせる時代の新しい落とし穴

GitGuardianの2026年版報告では、AI関連サービスのキーの漏えいが1年で81%増(約127万件)。また、AIのコーディング支援(集計ではClaude Code)が関わったコミットの漏えい率は3.2%で、公開コミット全体の1.5%の約2倍でした。AIが書いたコードの中の「とりあえず直書き」は、人が書いたものと同じようにチェックが必要です。

TOOLS5

見つける道具

gitleaksは「ポケット検査」、TruffleHogは「鍵屋」:役割が違う

どちらも無料で使えるオープンソースの「秘密(シークレット)スキャナー」です。GitHub上の星の数はどちらも3万前後(2026年9月30日時点で約2.96万と約2.82万)。よく比べられますが、得意な場面が違います。

gitleaks(ギットリークス)

= 家を出る前のポケット検査係

  • 鍵らしい文字列をパターン(正規表現)と文字のランダムさで見つける
  • 軽くて速い。コミットの直前に自動で止めるのが得意
  • Gitの全履歴、普通のフォルダ、標準入力を調べられる
  • 鍵が今も使えるかは確かめない(ダミーも拾う)

TruffleHog(トラッフルホッグ)

= 拾った鍵が今も開くか確かめる鍵屋

  • 800種類以上の鍵を「AWSの鍵」「Stripeの鍵」のように見分ける
  • 見つけた鍵で実際にログインできるか確かめ、「verified(生きている)」と表示
  • Git以外に、GitHubの組織全体、S3、Dockerイメージなども調べられる
  • 過去の棚卸しと、直す順番を決めるのが得意
項目gitleaksTruffleHog
一言でいうとコミット前に止める生きている鍵を見つけて優先順位をつける
見つけ方正規表現+文字のランダムさ(エントロピー)800種類以上の検出器で分類
鍵が使えるかの確認しないする(verified/unverified/unknown)
調べられる場所Gitリポジトリ、フォルダ・ファイル、標準入力Git、GitHub(組織・issue・PRコメント)、S3、GCS、Docker、Postman、Jenkins、Elasticsearch ほか
ライセンスMITAGPL-3.0
最新版(2026-09-30確認)v8.30.1(2026年3月21日)v3.97.9(2026年9月24日)
開発の状況新機能の追加は終了。今後はセキュリティ修正のみ。作者は後継の「Betterleaks」に移行活発に更新中。有料の企業版もある

gitleaksの「開発終了」はどう受け止める?

gitleaksの公式ページには「機能としては完成。今後のリリースはセキュリティ修正のみ」と書かれています。今すぐ使えなくなるわけではありません。作者を含むメンバーは後継の Betterleaks(2026年2月公開、MITライセンス)を開発しており、こちらは鍵が生きているかの確認機能も持っています。ただしBetterleaksは2026年9月時点で新しい版(v2)への移行期です。この記事では、情報が多く導入しやすいgitleaksで説明し、担当者向けの章でBetterleaksにも触れます。

⚠️ 他人のリポジトリで見つけた鍵は、絶対に試さない

TruffleHogの「確認」は、見つけた鍵で実際にそのサービスへ接続します。自分や自社、調査の許可を得た対象にだけ使いましょう。他人の鍵を使って接続を試すことは、不正アクセス禁止法に触れるおそれがあります。他人のリポジトリで鍵を見つけたら、使わずに持ち主へ知らせます。接続させたくないときは --no-verification を付けると確認をしません。

HOW TO6

やってみる

使い方:①今ある鍵を探す → ②次からコミット前に止める

順番が大事です。まず過去の棚卸しで「もう貼ってしまった鍵」を見つけ、次にコミット前の自動チェックで「これから貼る鍵」を止めます。

ステップ1:インストール

環境gitleaksTruffleHog
Macbrew install gitleaksbrew install trufflehog
Windows公式のReleasesページから gitleaks_8.30.1_windows_x64.zip を取得して展開公式のReleasesページから trufflehog_3.97.9_windows_amd64.tar.gz を取得して展開
Dockerdocker pull zricethezav/gitleaks:latestdocker pull trufflesecurity/trufflehog:latest

ダウンロードは必ず公式リポジトリ(github.com/gitleaks/gitleaks、github.com/trufflesecurity/trufflehog)のReleasesから。似た名前の偽ツールに注意してください。

ステップ2:過去をまるごとスキャンする

gitleaksリポジトリの全履歴を調べる(リポジトリのフォルダで実行)

gitleaks git -v –redact

-v で見つかった場所を詳しく表示、--redact で鍵の中身を伏せ字にします。画面を人に見せたり、ログに残したりするときは --redact を付けましょう。Gitで管理していないフォルダなら gitleaks dir -v フォルダ名 です。

TruffleHog生きている鍵を優先して調べる

trufflehog git file://. –results=verified,unknown

verified は「今も使えると確認できた鍵」、unknown は「確認しようとしたが通信エラーなどで判定できなかった鍵」。この2つを先に表示させ、まずverifiedを最優先で無効化します。フォルダを調べるなら trufflehog filesystem フォルダ名。

結果の読み方(gitleaksの例)

Finding: API_KEY = “REDACTED” ← 見つかった行 Secret: REDACTED ← 鍵の中身(–redactで伏せ字) RuleID: generic-api-key ← どの種類の鍵と判断したか Entropy: 4.52 ← 文字のランダムさ(高いほど鍵らしい) File: src/config.py ← ファイル Line: 12 ← 行番号 Commit: 3f2a9c… ← 入り込んだコミット Author: Taro ← 誰がコミットしたか Date: 2025-11-03T09:12:44Z ← いつ入り込んだか Fingerprint: 3f2a9c…:src/config.py:generic-api-key:12

表示項目は公式READMEの出力例に沿った説明用です(値は架空)。

見るべきはFile・Commit・Dateの3つ。「どのファイルに・いつから・今も最新版に残っているか」が分かれば、どれだけの期間、外から見えていたかを判断できます。TruffleHogでは Found verified result と出たものが「今も開く鍵」です。

ステップ3:次からコミット前に自動で止める

一番おすすめなのは、pre-commit(コミットの直前に検査を走らせる仕組み)にgitleaksを組み込む方法です。リポジトリの一番上に .pre-commit-config.yaml を作ります。

repos: – repo: https://github.com/gitleaks/gitleaks rev: v8.30.1 hooks: – id: gitleaks

そのあと pre-commit install を1回実行すれば準備完了。以後、鍵を含むコミットをしようとすると次のように止まります。

Detect hardcoded secrets………………………………………….Failed

検査の対象はこれからコミットする変更だけなので、速く終わります。なお SKIP=gitleaks git commit … で検査を飛ばせますが、これは本当にダミーだと分かっているときだけにしましょう。

TruffleHog全リポジトリにまとめて入れる(Gitの hooksPath を使う方法)

mkdir -p ~/.git-hooks git config –global core.hooksPath ~/.git-hooks

~/.git-hooks/pre-commit というファイルを作り、次の3行を書いて実行権限を付けます。

#!/bin/sh export TRUFFLEHOG_PRE_COMMIT=1 trufflehog git file://.

これで、パソコン上のすべてのリポジトリでコミット前にTruffleHogが動きます(公式のPreCommit.mdの手順)。すでに別のpre-commitの仕組みを使っているリポジトリでは、そちらの設定が効かなくなることがあるので注意してください。

ステップ4:GitHub側の「最後の網」も確認する

GitHubには、公開リポジトリへ鍵をpushしようとすると止める「Push protection for yourself(自分用のプッシュ保護)」があり、既定でオンです。設定画面の「Code security」で Enabled になっているかを確認しておきましょう。ただし前の章のとおり、止まるのは対応している種類の鍵だけです。手元のgitleaks=1枚目の網、GitHub=2枚目の網と考えます。

CHECK7

あなたは大丈夫?

8項目で診断:3つ以上当てはまったら今日スキャン

✅ 当てはまるものを数えてください

  • .env や設定ファイルに本物のキーを書いている
  • .gitignore の中身を確認したことがない
  • いつも git add . か git add -A でまとめて追加している
  • 過去に「キーを消すためのコミット」をしたことがある
  • AIに書かせたコードを、中身を読まずにコミットすることがある
  • もう使っていないAPIキーを無効にせず放置している
  • キーに権限の絞り込みや利用上限を設定していない
  • 非公開だったリポジトリを公開に切り替えたことがある

0〜2個:今の習慣を続けつつ、コミット前チェックだけ入れておきましょう。3〜5個:今日、過去の履歴を1回スキャンしてください。6個以上:スキャンに加えて、使っていないキーの無効化と、残すキーの権限の見直しまでやりましょう。

クイズ:こんなとき、どうする?

Q1. 公開リポジトリにAWSのキーをpushしてしまった。最初にやることは?
(A)ファイルを消してpush (B)リポジトリを非公開にする (C)キーを無効化して新しいキーを発行

答え:(C)。AとBでは、すでに拾われた鍵を止められません。まず鍵を使えなくし、そのあとで使われた形跡の確認、コードの修正、非公開化や履歴の掃除に進みます。

Q2. gitleaksがテスト用のダミーキーを検出した。本物ではない。どうする?

答え:その行に gitleaks:allow というコメントを付けるか、結果の Fingerprint を .gitleaksignore に書く。これで次から報告されません。ただし「本当にダミーか」は必ず確かめてから。「たぶんダミー」が一番危険です。

Q3. TruffleHogの結果が unverified(未確認)だった。放っておいていい?

答え:放っておかない。unverified は「使えないと確定した」ではなく、「確認できなかった」という意味です。確認方法がない種類の鍵、確認をオフにした場合、期限切れの鍵などが含まれます。持ち主が発行元の管理画面で状態を確かめ、不要なら無効化します。

Q4. まだpushしていない。コミットしただけで気づいた。どうする?

答え:pushする前にコミットをやり直す。直前のコミットなら、ファイルから鍵を消して git add し直し、git commit --amend。それより前のコミットに入っているなら、履歴の書き換えが必要です。まだ外に出ていないので、基本的に鍵の交換までは不要です。ただし、そのリポジトリを誰かと共有していた、バックアップに同期された、など外に出た可能性があれば交換します。

RESPONSE8

置き忘れたら

置き忘れたときの正しい順番:止める → 確かめる → 外す → 消す → 防ぐ

まず自分の状況を選んでください。

  • A. コミットしたが、まだpushしていないコミットをやり直せばOK(クイズQ4)。外に出た可能性がなければ交換は不要。
  • B. 非公開リポジトリにpushした鍵を交換する。リポジトリを見られる人・CI・委託先の範囲も確認。
  • C. 公開リポジトリにpushした分単位で動く。下の手順①を今すぐ。使われた前提で②まで進める。
  • D. 身に覚えのない請求・操作がある①②に加え、サービスの窓口(AWSならサポートケース)と社内のインシデント対応へ。
  1. 鍵を止める(最優先)。発行元の管理画面でキーを無効化・削除し、新しいキーを発行してアプリを差し替える。GitHubのトークンなら設定画面から削除(revoke)。
  2. 使われていないか確かめる。利用履歴・請求額・ログを確認。AWSなら操作の記録(CloudTrail)と、見知らぬ地域のサーバーがないか。詳しくはクラウドのログ調査の記事を参照。
  3. コードから外す。鍵は .env などに移し、.gitignore に登録。本番はクラウドの秘密情報の保管サービスやCIの「シークレット」機能で渡す。
  4. 必要なら履歴から消す。git filter-repo(--sensitive-data-removal が使える2.47以上)で書き換えて強制push。ただし他人の複製やフォークは消せない。GitHub上のキャッシュ表示やPRの参照は、GitHubサポートに削除を依頼できる。
  5. 次から防ぐ。前の章のコミット前チェックを入れ、チーム全員に広げる。

履歴の書き換えは「やらなくていい」こともある

GitHubの公式ドキュメントは、最初に鍵を無効化・交換すること、そして鍵を無効にしたならそれで十分な場合があり、履歴の書き換えまでは必要ないこともあると説明しています。履歴の書き換えは、共同作業者の作業が消える、コミットの番号が全部変わる、といった副作用が大きい作業です。慌てて書き換えるより、鍵の交換を確実に。

会社の場合は、個人で抱え込まず報告するのが鉄則です。初動の考え方はインシデント発生から最初の30分にまとめています。

TODO9

今やること

今日やることは3つだけ

  1. 自分のリポジトリを1回スキャンする。gitleaks git -v --redact か trufflehog git file://. --results=verified,unknown。見つかったら、verified(生きている鍵)から順に交換。
  2. コミット前に止める仕組みを入れる。pre-commitにgitleaksを登録し、GitHubの「Push protection for yourself」がEnabledかも確認。チームなら全員の環境に。
  3. 「漏れても被害が小さい鍵」にする。鍵は .env に置いて .gitignore で除外。権限は必要最小限、利用上限や有効期限を設定。使っていない鍵は今日消す。

GitHubの基本操作に不安がある人は、先にGitHub入門も読んでおくと、この記事のコマンドが分かりやすくなります。

DETAIL10

担当者・開発者向け

細かい仕様:オプション・終了コード・GitHubとAWSの挙動

gitleaks(v8.30.1)

項目内容
コマンドgit(内部で git log -p を読む)/dir(別名 files・directory)/stdin。v8.19.0で detect・protect は非推奨(隠しコマンドとして残存)
範囲指定--log-opts="--all commitA..commitB" で git log の範囲を渡せる
既存の検出を無視--baseline-path に過去のレポートを渡すと新規分だけ報告。個別には .gitleaksignore に Fingerprint、行単位は gitleaks:allow コメント
設定優先順:--config → 環境変数 GITLEAKS_CONFIG → GITLEAKS_CONFIG_TOML → 対象内の .gitleaks.toml → 既定。[extend] useDefault = true で既定ルールに追加できる
出力-f で json/csv/junit/sarif/template、-r で保存先
終了コード0=検出なし、1=検出またはエラー、126=不明なフラグ(--exit-code で変更可)
その他--max-decode-depth(エンコードされた文字列の再帰デコード)、--max-archive-depth(圧縮ファイルの中)。既定はどちらも0(無効)
GitHub Actions公式の gitleaks-action は、組織アカウントのリポジトリでは無料のライセンスキー(GITLEAKS_LICENSE)が必要。個人アカウントは不要。v2.0.0以降はMITから独自ライセンスに変更

TruffleHog(v3.97.9)

項目内容
結果の種類verified(APIで有効と確認)/unverified(検出したが未確認)/unknown(確認を試みたがエラー)/filtered_unverified。--results で選択、既定は verified,unverified,unknown
確認をしない--no-verification
CIで失敗させる--fail で検出時に終了コード183。例:trufflehog git file://. --since-commit main --branch feature-1 --results=verified,unknown --fail
無視行に trufflehog:ignore コメント(--no-ignore-tag で無視を解除して再確認)
出力--json、--sarif(GitHubのcode scanningに取り込める)
GitHubtrufflehog github --org=組織名、--issue-comments --pr-comments でissue・PRコメントも。未認証はレート制限が厳しいので --token を推奨
権限の分析trufflehog analyze で、よく漏れる約20種類の鍵について権限や触れるリソースを詳しく調べる
ローカルリポジトリの安全策悪意あるGit設定への対策(CVE-2025-41390)として、ローカルのリポジトリは一時フォルダに複製してから調べる。--trust-local-git-config で省略可(信頼できるリポジトリのみ)

GitHub側の仕組み(2026年9月30日時点のドキュメント)

機能内容
secret scanning(公開リポジトリ)無料で自動実行。全ブランチの全履歴に加え、issue・PR・Wiki・Discussions・Gistも対象
パートナープログラム提携事業者の鍵が公開リポジトリや公開npmパッケージで見つかると、GitHubが発行元へ直接通知し、発行元が無効化などを判断。この通知はリポジトリのアラートには表示されない
ユーザー単位のプッシュ保護github.comのアカウントごとに既定でオン。公開リポジトリへの対応済みの鍵のpushを止める。理由の入力なしで許可でき、リポジトリ側で有効化していなければアラートも出ない
リポジトリ単位のプッシュ保護GitHub Secret Protection が必要で、既定はオフ。許可(バイパス)すると、アラート・監査ログ・メール通知が残る
履歴からの削除git filter-repo 2.47以上の --sensitive-data-removal。クローン・フォークは消せず、SHA指定のキャッシュ表示やPRの参照はサポートへ依頼。鍵の交換で危険が解消できる場合、サポートは削除に応じないことがある

AWSの隔離ポリシー

AWSは、IAMユーザーの認証情報が漏れた・公開されたと判断すると、管理ポリシー AWSCompromisedKeyQuarantineV3(2024年8月作成、2026年3月更新)を付けます。インスタンスの起動、IAMの変更、S3の読み書き、Bedrockのモデル呼び出しなどを拒否し、不正な課金を抑える目的です。公式説明は「このポリシーを外さず、作成されたサポートケースの指示に従う」。Unit 42の実験当時はV2でした。

Betterleaks(gitleaksの後継)

gitleaksの作者を含むメンバーが開発。MITライセンス、2026年2月公開。正規表現に加えて、鍵が生きているかの確認(-v/--validate)、権限の分析(-a/--analyze)、任意の無効化、GitHub・GitLab・Hugging Face・S3などの読み込みに対応。2026年9月時点で main はv2開発中で、パッケージ管理ツールやDockerの latest はまだv1を返す場合があると案内されています。新規導入なら比較候補に入れる価値があります。

数字の出どころ(GitGuardian 2026年版)

2025年に公開GitHubのコミットへ新たに加わった秘密は2,865万件(前年比34%増、過去最大の伸び)。AI関連サービスの秘密は1,275,105件(81%増)で、伸び率上位10種のうち8種がAI関連。2022年に有効だった秘密の64%が2026年1月時点でも有効。社内リポジトリは公開リポジトリより約6倍秘密を含みやすい。いずれもGitGuardian社の独自集計で、検出方法は同社のものです。

FAQ?

よくある疑問

GitHubの鍵の置き忘れでよく聞かれること

gitleaksとTruffleHog、1つだけ入れるならどっち?

目的で選びます。「これから漏らさない」ならコミット前に軽く動くgitleaks、「もう漏れているものを探して直す順番を決めたい」なら生きている鍵を確認できるTruffleHog。どちらも無料なので、普段はgitleaksで止め、ときどきTruffleHogで棚卸しという組み合わせがおすすめです。

非公開リポジトリでもスキャンは必要?

必要です。非公開の設定ミス、メンバーや委託先の端末からの流出、あとで公開に切り替えるケースがあります。トヨタの事例も「誤って公開設定」でした。GitHubのsecret scanningが無料で自動に動くのは公開リポジトリだけで、組織の非公開リポジトリは有料の「GitHub Secret Protection」が必要です。そのため、手元のツールの重要度はむしろ上がります。

誤検知が多くて困る

gitleaksなら、今ある検出をまとめて基準(baseline)として保存し、新しく増えたものだけを報告させられます。個別には .gitleaksignore や gitleaks:allow。TruffleHogなら --results=verified で「生きている鍵」だけに絞ると、ほぼ誤検知はなくなります。

AIのコーディング支援を使うとき、何に気をつければいい?

鍵をプロンプトやチャットに貼らないこと、AIが書いたコードに鍵の直書きがないか確かめることの2つです。AIは「動くサンプル」を優先して、設定ファイルではなくコードに直接書くことがあります。pre-commitのチェックは、人が書いたかAIが書いたかに関係なく働くので、AI時代こそ効果的です。

他人の公開リポジトリで鍵を見つけてしまった

使ったり、動くか試したりしないでください。持ち主にリポジトリのセキュリティポリシーや連絡先から知らせるのが基本です。試しに接続すること自体が、不正アクセス禁止法に触れるおそれがあります。

GitHubのパートナープログラムで自動的に無効化されるなら、放っておいていい?

いいえ。通知を受けた発行元が何をするかは発行元の判断で、無効化されるとは限りません。自作システムのパスワードや対象外のサービスの鍵は、そもそも通知されません。自分で無効化・交換するのが確実です。

📚 出典・参考資料(2026年9月30日確認)

事例・調査

ツールの公式情報

GitHub・AWSの公式ドキュメント

このサイトの関連記事

ツールのバージョン・星の数・開発状況は2026年9月30日にGitHubで確認したものです。コマンドは各ツールの公式READMEに基づきます。結果表示の例は説明用で、キーの値は架空です。

🔑 鍵を貼ったら「剥がす」より「替える」

貼った鍵は数分で拾われ、剥がしても写しが残ります。だから最初に錠前を交換し、次からはポケット検査(gitleaks)で貼る前に止める。棚卸しは鍵屋(TruffleHog)に任せましょう。

コメント