GitHubにAPIキーを置き忘れたら、5分で使われる「合鍵の貼り忘れ」を無料ツール gitleaks・TruffleHog で見つけて、止める
設定ファイルにAPIキーを書いたまま git push。気づいてファイルを消したから大丈夫……ではありません。公開された鍵は数分で拾われ、消したつもりの履歴にも残り続けます。何が起きるのか、どう見つけるのか、置き忘れたら何から手をつけるのかを1枚の絵から順番に説明します。
🧭 結論:鍵を置き忘れたら「消す」より先に「替える」。そして次から自動で止める
- 公開リポジトリに置いたキーは、分単位で拾われます。AWSのキーをわざと置いた実験では、攻撃者は5分以内に見つけて使い始めました。
- ファイルを消しても、鍵は残ります。Gitの過去の記録、他人の複製(フォーク)、上書きの記録など、自分では消せない場所に写しがあります。
- だから最初にやるのは鍵そのものを無効にして、新しい鍵に替えること。履歴の掃除はそのあとです。
- 見つける道具は無料で使えます。gitleaks=コミット前のポケット検査、TruffleHog=拾った鍵が今も開くかを確かめる鍵屋です。
- 個人開発者は今日1回スキャン、チームはコミット前の自動チェックを全員に入れ、管理者は鍵の権限と利用上限を絞る。これで「うっかり」の多くは被害になる前に止まります。
鍵を貼ってしまったら、急いで剥がすより先に錠前を替えましょう。
📋 目次
鍵は「貼った瞬間」に拾われ、「剥がしても」写しが残る
公開リポジトリにAPIキーを置き忘れたときに起きること
この記事で覚えてほしいのは、この1枚だけです。「早く見つかる」「消しても残る」「だから鍵を替える」「次からは貼る前に止める」。以下の章は、この絵の中身を1つずつ確かめていきます。
APIキーの置き忘れは、「合鍵を町の掲示板に貼る」こと
APIキーは、プログラムがクラウドやAIのサービスに入るための合鍵です。人間のパスワードと違って、持っている人を「本人かどうか」確かめないことがほとんど。鍵を持っている人=入ってよい人として扱われます。
その合鍵を、GitHubの公開リポジトリに置くのは、世界中の人が通る町の掲示板に合鍵を貼るのと同じです。しかもこの掲示板には、合鍵だけを探して24時間見回っている人たちがいます。
※厳密には違う部分もありますが、最初の理解としてはこの絵で十分です。たとえば「非公開リポジトリ」は掲示板ではなく社内の回覧板ですが、回覧板も外に持ち出されることがあります(事例1)。
このたとえで考えると、正しい行動は自然に分かります。貼ってしまった合鍵に気づいたら、掲示板から剥がしに走るより、錠前を替えるのが先。定点カメラの写真や、もう誰かが持ち帰った合鍵は、剥がしても消えないからです。
実際に起きたこと4つ:5年気づかない例も、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は「仕様どおりの動作」と回答しています。
教訓:「リポジトリごと消したから大丈夫」も成り立たない。確実な対策は鍵の交換だけ。
漏れ方はほぼ同じ:「全部まとめてコミット」から始まる
- 鍵をファイルに書く。動作確認のためにコードへ直書きしたり、
.envや設定ファイルに書いたりする。AIに書かせたサンプルコードに、そのまま貼っていることもある。 git add .で全部入れる。.gitignoreを作り忘れている、または.envを除外し忘れている。- コミットする。この瞬間、鍵はGitの履歴に刻まれる。あとでファイルを消しても、このコミットは残る。
- push して公開される。公開リポジトリなら、その瞬間から世界中が読める。非公開リポジトリでも、公開設定のミス・メンバーの持ち出し・委託先経由で外に出ることがある。
- 自動収集プログラムが拾う。公開された更新を監視し、鍵らしい文字列を探す仕組みが常に動いている。数分の勝負。
- 使える鍵だけが悪用される。クラウドなら採掘用サーバーを立てて高額請求、AIのキーなら他人の利用料で使い放題、データベースなら情報の持ち出し、パッケージ公開用のキーなら不正な版の配布(サプライチェーン攻撃)につながる。
鍵が紛れ込みやすい場所
設定ファイル
.env、config.json、application.properties など。事例3で最多だったのも .env。
コードとテスト
「あとで消す」つもりの直書き。テスト用に本物のキーを使ったコード。AIが生成したサンプル。
コード以外
issue・プルリクエストのコメント、Wiki、Gist、CIのログ。エラー画面を貼ったらキーが写っていた、もよくある。
「消したから大丈夫」は通用しない:よくある思い込み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が書いたコードの中の「とりあえず直書き」は、人が書いたものと同じようにチェックが必要です。
gitleaksは「ポケット検査」、TruffleHogは「鍵屋」:役割が違う
どちらも無料で使えるオープンソースの「秘密(シークレット)スキャナー」です。GitHub上の星の数はどちらも3万前後(2026年9月30日時点で約2.96万と約2.82万)。よく比べられますが、得意な場面が違います。
gitleaks(ギットリークス)
= 家を出る前のポケット検査係
- 鍵らしい文字列をパターン(正規表現)と文字のランダムさで見つける
- 軽くて速い。コミットの直前に自動で止めるのが得意
- Gitの全履歴、普通のフォルダ、標準入力を調べられる
- 鍵が今も使えるかは確かめない(ダミーも拾う)
TruffleHog(トラッフルホッグ)
= 拾った鍵が今も開くか確かめる鍵屋
- 800種類以上の鍵を「AWSの鍵」「Stripeの鍵」のように見分ける
- 見つけた鍵で実際にログインできるか確かめ、「verified(生きている)」と表示
- Git以外に、GitHubの組織全体、S3、Dockerイメージなども調べられる
- 過去の棚卸しと、直す順番を決めるのが得意
| 項目 | gitleaks | TruffleHog |
|---|---|---|
| 一言でいうと | コミット前に止める | 生きている鍵を見つけて優先順位をつける |
| 見つけ方 | 正規表現+文字のランダムさ(エントロピー) | 800種類以上の検出器で分類 |
| 鍵が使えるかの確認 | しない | する(verified/unverified/unknown) |
| 調べられる場所 | Gitリポジトリ、フォルダ・ファイル、標準入力 | Git、GitHub(組織・issue・PRコメント)、S3、GCS、Docker、Postman、Jenkins、Elasticsearch ほか |
| ライセンス | MIT | AGPL-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 を付けると確認をしません。
使い方:①今ある鍵を探す → ②次からコミット前に止める
順番が大事です。まず過去の棚卸しで「もう貼ってしまった鍵」を見つけ、次にコミット前の自動チェックで「これから貼る鍵」を止めます。
ステップ1:インストール
| 環境 | gitleaks | TruffleHog |
|---|---|---|
| Mac | brew install gitleaks | brew install trufflehog |
| Windows | 公式のReleasesページから gitleaks_8.30.1_windows_x64.zip を取得して展開 | 公式のReleasesページから trufflehog_3.97.9_windows_amd64.tar.gz を取得して展開 |
| Docker | docker pull zricethezav/gitleaks:latest | docker pull trufflesecurity/trufflehog:latest |
ダウンロードは必ず公式リポジトリ(github.com/gitleaks/gitleaks、github.com/trufflesecurity/trufflehog)のReleasesから。似た名前の偽ツールに注意してください。
ステップ2:過去をまるごとスキャンする
gitleaksリポジトリの全履歴を調べる(リポジトリのフォルダで実行)
-v で見つかった場所を詳しく表示、--redact で鍵の中身を伏せ字にします。画面を人に見せたり、ログに残したりするときは --redact を付けましょう。Gitで管理していないフォルダなら gitleaks dir -v フォルダ名 です。
TruffleHog生きている鍵を優先して調べる
verified は「今も使えると確認できた鍵」、unknown は「確認しようとしたが通信エラーなどで判定できなかった鍵」。この2つを先に表示させ、まずverifiedを最優先で無効化します。フォルダを調べるなら trufflehog filesystem フォルダ名。
結果の読み方(gitleaksの例)
表示項目は公式READMEの出力例に沿った説明用です(値は架空)。
見るべきはFile・Commit・Dateの3つ。「どのファイルに・いつから・今も最新版に残っているか」が分かれば、どれだけの期間、外から見えていたかを判断できます。TruffleHogでは Found verified result と出たものが「今も開く鍵」です。
ステップ3:次からコミット前に自動で止める
一番おすすめなのは、pre-commit(コミットの直前に検査を走らせる仕組み)にgitleaksを組み込む方法です。リポジトリの一番上に .pre-commit-config.yaml を作ります。
そのあと pre-commit install を1回実行すれば準備完了。以後、鍵を含むコミットをしようとすると次のように止まります。
検査の対象はこれからコミットする変更だけなので、速く終わります。なお SKIP=gitleaks git commit … で検査を飛ばせますが、これは本当にダミーだと分かっているときだけにしましょう。
TruffleHog全リポジトリにまとめて入れる(Gitの hooksPath を使う方法)
~/.git-hooks/pre-commit というファイルを作り、次の3行を書いて実行権限を付けます。
これで、パソコン上のすべてのリポジトリでコミット前にTruffleHogが動きます(公式のPreCommit.mdの手順)。すでに別のpre-commitの仕組みを使っているリポジトリでは、そちらの設定が効かなくなることがあるので注意してください。
ステップ4:GitHub側の「最後の網」も確認する
GitHubには、公開リポジトリへ鍵をpushしようとすると止める「Push protection for yourself(自分用のプッシュ保護)」があり、既定でオンです。設定画面の「Code security」で Enabled になっているかを確認しておきましょう。ただし前の章のとおり、止まるのは対応している種類の鍵だけです。手元のgitleaks=1枚目の網、GitHub=2枚目の網と考えます。
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。それより前のコミットに入っているなら、履歴の書き換えが必要です。まだ外に出ていないので、基本的に鍵の交換までは不要です。ただし、そのリポジトリを誰かと共有していた、バックアップに同期された、など外に出た可能性があれば交換します。
置き忘れたときの正しい順番:止める → 確かめる → 外す → 消す → 防ぐ
まず自分の状況を選んでください。
- A. コミットしたが、まだpushしていないコミットをやり直せばOK(クイズQ4)。外に出た可能性がなければ交換は不要。
- B. 非公開リポジトリにpushした鍵を交換する。リポジトリを見られる人・CI・委託先の範囲も確認。
- C. 公開リポジトリにpushした分単位で動く。下の手順①を今すぐ。使われた前提で②まで進める。
- D. 身に覚えのない請求・操作がある①②に加え、サービスの窓口(AWSならサポートケース)と社内のインシデント対応へ。
- 鍵を止める(最優先)。発行元の管理画面でキーを無効化・削除し、新しいキーを発行してアプリを差し替える。GitHubのトークンなら設定画面から削除(revoke)。
- 使われていないか確かめる。利用履歴・請求額・ログを確認。AWSなら操作の記録(CloudTrail)と、見知らぬ地域のサーバーがないか。詳しくはクラウドのログ調査の記事を参照。
- コードから外す。鍵は
.envなどに移し、.gitignoreに登録。本番はクラウドの秘密情報の保管サービスやCIの「シークレット」機能で渡す。 - 必要なら履歴から消す。
git filter-repo(--sensitive-data-removalが使える2.47以上)で書き換えて強制push。ただし他人の複製やフォークは消せない。GitHub上のキャッシュ表示やPRの参照は、GitHubサポートに削除を依頼できる。 - 次から防ぐ。前の章のコミット前チェックを入れ、チーム全員に広げる。
履歴の書き換えは「やらなくていい」こともある
GitHubの公式ドキュメントは、最初に鍵を無効化・交換すること、そして鍵を無効にしたならそれで十分な場合があり、履歴の書き換えまでは必要ないこともあると説明しています。履歴の書き換えは、共同作業者の作業が消える、コミットの番号が全部変わる、といった副作用が大きい作業です。慌てて書き換えるより、鍵の交換を確実に。
会社の場合は、個人で抱え込まず報告するのが鉄則です。初動の考え方はインシデント発生から最初の30分にまとめています。
今日やることは3つだけ
- 自分のリポジトリを1回スキャンする。
gitleaks git -v --redactかtrufflehog git file://. --results=verified,unknown。見つかったら、verified(生きている鍵)から順に交換。 - コミット前に止める仕組みを入れる。pre-commitにgitleaksを登録し、GitHubの「Push protection for yourself」がEnabledかも確認。チームなら全員の環境に。
- 「漏れても被害が小さい鍵」にする。鍵は
.envに置いて.gitignoreで除外。権限は必要最小限、利用上限や有効期限を設定。使っていない鍵は今日消す。
GitHubの基本操作に不安がある人は、先にGitHub入門も読んでおくと、この記事のコマンドが分かりやすくなります。
細かい仕様:オプション・終了コード・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に取り込める) |
| GitHub | trufflehog 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社の独自集計で、検出方法は同社のものです。
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日確認)
事例・調査
- トヨタ自動車「お客様のメールアドレス等の漏洩可能性に関するお詫びとお知らせについて」(2022年10月7日)
https://global.toyota/jp/newsroom/corporate/38095972.html - Palo Alto Networks Unit 42「CloudKeys in the Air: Tracking Malicious Operations of Exposed IAM Keys」(2023年10月30日)
https://unit42.paloaltonetworks.com/malicious-operations-of-exposed-iam-keys-cryptojacking/ - GitGuardian「The State of Secrets Sprawl 2026」(2026年3月17日)
https://blog.gitguardian.com/the-state-of-secrets-sprawl-2026/ - Truffle Security「Anyone can Access Deleted and Private Repository Data on GitHub」(2024年7月24日)
https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github - Truffle Security(ゲスト投稿:Sharon Brizinov)「How I Scanned all of GitHub’s “Oops Commits” for Leaked Secrets」(2025年)
https://trufflesecurity.com/blog/guest-post-how-i-scanned-all-of-github-s-oops-commits-for-leaked-secrets
ツールの公式情報
- gitleaks(README・リリース v8.30.1)
https://github.com/gitleaks/gitleaks - gitleaks-action(ライセンスキーの扱い)
https://github.com/gitleaks/gitleaks-action - Betterleaks
https://github.com/betterleaks/betterleaks - TruffleHog(README・PreCommit.md・リリース v3.97.9)
https://github.com/trufflesecurity/trufflehog
GitHub・AWSの公式ドキュメント
- GitHub Docs「Secret scanning」「Push protection」「Secret scanning for partners」「Secret leakage risks」
https://docs.github.com/en/code-security/secret-scanning - GitHub Docs「Removing sensitive data from a repository」
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository - AWS「AWSCompromisedKeyQuarantineV3」
https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSCompromisedKeyQuarantineV3.html
このサイトの関連記事
ツールのバージョン・星の数・開発状況は2026年9月30日にGitHubで確認したものです。コマンドは各ツールの公式READMEに基づきます。結果表示の例は説明用で、キーの値は架空です。
🔑 鍵を貼ったら「剥がす」より「替える」
貼った鍵は数分で拾われ、剥がしても写しが残ります。だから最初に錠前を交換し、次からはポケット検査(gitleaks)で貼る前に止める。棚卸しは鍵屋(TruffleHog)に任せましょう。


コメント