「Claude に決済連携を組ませたら 1 時間で動いた」――その git push の中に、Stripe の本番シークレットキーと DB パスワードがそのまま入っていた。 2026 年、中堅企業のバイブコーディング (vibe coding = AI に書かせて雰囲気で作る開発スタイル) で静かに増えているのが シークレット (API キー / DB 認証情報 / クラウドアクセスキー) の漏洩 です。
AI 生成コードは「動かす」ことを最優先するため、鍵をソースに直書きし、.env ごと Git にコミットする ことに何のためらいもありません。そして漏れた鍵は、公開リポ・CI ログ・フロントエンドの成果物から自動収集ボットに拾われ、クラウド従量課金の爆発 や 不正アクセス・データ流出 に直結します。GitGuardian の年次調査 State of Secrets Sprawl 2026 によれば、2025 年に公開 GitHub のコミットへ新たに追加されたハードコードシークレットは 2,865 万件(前年比 +34%、過去最大の増加幅)。しかも同レポートは Claude Code が補助したコミットの漏洩率は 3.2% で、全コミット平均の 1.5% の 約 2 倍 だと報告しています。AI で速く書くほど、鍵が漏れやすくなっているのです。
本記事は連載「バイブコーディング危機」第 15 回として、シークレットが漏れる 5 経路、悪い例 / 良い例のコード、GitHub の Push Protection / Secret Scanning、gitleaks / TruffleHog / Trivy による検知、AWS Secrets Manager / HashiCorp Vault、キーローテーションと最小権限 IAM、中堅企業向け 30 分チェックリスト、GXO に相談すべき閾値 までを完全版で整理します。
**連載「バイブコーディング危機」**は、AI で自社システムを開発する中堅企業向けに、専門家不在で起きるリスクを1 本ずつ深掘りします。 連載ハブ(全 20 回の一覧) 第 2 回(SQL Injection の現実 5 パターン) 第 17 回(幻覚パッケージ / slopsquatting と依存の罠)
目次
- なぜ AI 生成コードは鍵を漏らすのか(経営者向け 5 分解説)
- 数字で見るシークレット漏洩の現実 2026
- シークレットが漏れる 5 経路(コード例つき)
- 漏れた鍵は何分で悪用されるか(クラウド課金爆発の構造)
- 公開報道済の鍵漏洩事例から学ぶ
- 防衛 1:GitHub Push Protection / Secret Scanning
- 防衛 2:検知ツール(gitleaks / TruffleHog / Trivy)と pre-commit
- 防衛 3:シークレットマネージャ(AWS Secrets Manager / Vault)
- 防衛 4:キーローテーションと最小権限 IAM
- 中堅企業向け 30 分チェックリスト
- いつ GXO に相談すべきか
- よくある質問(FAQ)
- まとめ
- 参考一次ソース
なぜ AI 生成コードは鍵を漏らすのか(経営者向け 5 分解説)
「シークレット」とは、それを知っている者がシステムになりすませる文字列 の総称です。具体的には次のものを指します。
- API キー / トークン: Stripe / OpenAI / SendGrid / LINE / Slack など外部サービスを呼ぶための鍵
- DB 認証情報: データベースの接続文字列(ユーザー名・パスワード・ホスト)
- クラウドアクセスキー: AWS のアクセスキー ID とシークレットアクセスキー、GCP のサービスアカウント鍵など
- 暗号鍵 / 証明書の秘密鍵: JWT 署名鍵、TLS 秘密鍵、SSH 秘密鍵
これらは コードと一緒に置いてはいけない のが鉄則です。ところが AI 生成コードは、この鉄則を構造的に守れません。理由は 3 つあります。
理由 1:AI は「動く最短経路」を選ぶ
「Stripe で決済できるようにして」と頼むと、AI はまず 動くコード を返します。最短で動かすには、sk_live_... のような鍵をソースに直書きするのが一番手っ取り早い。「環境変数に逃がして、本番では Secrets Manager から読む」という運用設計は、明示的に指示しない限り出てきません。
理由 2:.env を「便利なメモ帳」として扱ってしまう
AI は鍵を .env ファイルに書くところまでは提案します。しかし .env を .gitignore に入れ忘れたまま git add . すると、鍵ごとコミットされます。一度コミットされた鍵は、後でファイルを消しても Git の履歴に永久に残る(git log -p で誰でも掘り出せる)のが厄介な点です。
理由 3:「動いた = 安全」という誤認
鍵を直書きしても アプリは正常に動きます。SQL Injection や認可漏れ(第 2 回 参照)のように画面が壊れるわけではないので、専門家がいない環境では 誰も「これ、鍵が漏れてない?」と気づきません。漏洩は、攻撃者がクラウド請求を爆発させた 後 に発覚するのが典型です。
「動いている」と「漏れていない」は別物です。この差こそがバイブコーディング危機の核心 です。
AI ASSESSMENT
PoC の前に「そもそも使えるか」を30分で見極めませんか?
情シス部門の稟議書作成をサポートする無料の30分壁打ち。ROI 試算シート・失敗要因チェックリストをその場で共有します。
数字で見るシークレット漏洩の現実 2026
シークレット漏洩は「珍しい事故」ではなく 常態化した日常 です。一次ソースで裏取りできた数字を整理します。
| 指標 | 値 | 出典 |
|---|---|---|
| 2025 年に公開 GitHub コミットへ新規追加されたハードコードシークレット | 2,865 万件(前年比 +34%、過去最大の増加幅) | GitGuardian State of Secrets Sprawl 2026 |
| 2024 年の同件数 | 2,380 万件(前年比 +25%) | GitGuardian(同上) |
| Claude Code 補助コミットの漏洩率 | 3.2%(全コミット平均 1.5% の約 2 倍) | GitGuardian(同上) |
| 2022 年に検出された「有効な」シークレットのうち、2026 年時点でも未失効のもの | 64%(4 年間ローテートも失効もされず放置) | GitGuardian(同上) |
| EMERALDWHALE 作戦が収集した認証情報 | 1.5 万件超(公開された Git config / .env を走査) | Sysdig |
ここで注目すべきは 3 点です。
- AI で書くほど漏れやすい:Claude Code 補助コミットの漏洩率が平均の約 2 倍という GitGuardian の報告は、本連載の警鐘そのものです(※これは Claude 固有の欠陥ではなく、AI で開発速度が上がる一方でシークレット衛生のレビューが追いつかない 構造を示すデータとして引用します)。
- 漏れた鍵が放置される:検出されても 64% が 4 年後も生きている。つまり 「漏れたら終わり」ではなく「漏れても直さない」 という二重の問題です。
- 収集は自動化されている:EMERALDWHALE のように、公開された
.envや.gitを 大規模に自動走査 する攻撃インフラが既に存在します。公開した瞬間に拾われる前提で考えるべきです。
シークレットが漏れる 5 経路(コード例つき)
ここからが本記事の核心です。バイブコーディングでシークレットが漏れる 5 経路 を、現実に起きるコード例つきで整理します。
経路 1:ソースへの直書き(ハードコード)
最も古典的で、最も多い経路です。
悪い例(AI に「Stripe 決済を実装して」と頼んだ初期生成)
import stripe
# 鍵がソースに直書き → Git に入った瞬間に世界中へ公開
stripe.api_key = "sk_live_51Hxxxxxxxxxxxxxxxxxxxxxxxx"
def create_charge(amount, token):
return stripe.Charge.create(amount=amount, currency="jpy", source=token)
何が問題か: sk_live_... は本番の決済鍵です。これがリポジトリに入った瞬間、コミット履歴・フォーク・キャッシュ・CI ログのあらゆる場所に複製されます。後から行を消しても 履歴からは消えません。
良い例(環境変数 → 本番はシークレットマネージャ)
import os
import stripe
# 鍵は環境変数から。値はコードに存在しない
stripe.api_key = os.environ["STRIPE_SECRET_KEY"]
def create_charge(amount, token):
return stripe.Charge.create(amount=amount, currency="jpy", source=token)
ローカル開発では .env(後述の通り .gitignore 必須)、本番では Secrets Manager / Vault から注入します。鍵の値そのものはソースコードのどこにも書かれていない のが正解の状態です。
経路 2:.env の誤コミット
.env に逃がしたつもりでも、.gitignore に入れ忘れると鍵ごとコミットされます。
悪い例
# AI が生成した .env(中身は本物の鍵)
DATABASE_URL=postgres://admin:P@ssw0rd@db.example.com:5432/prod
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxx
# .gitignore に .env が無い状態で…
git add .
git commit -m "add env"
git push # ← 全部公開リポに飛ぶ
良い例
# .gitignore に必ず入れる
.env
.env.*
!.env.example
# .env.example はキー名だけ(値は空 or ダミー)
DATABASE_URL=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
OPENAI_API_KEY=
.env.example(値を含まないテンプレート)だけをコミットし、実値の入った .env は絶対にコミットしない。Web サーバの公開ディレクトリ(document root)には .env を置かないことも重要です。Sysdig の EMERALDWHALE 調査では、攻撃者が 約 11 万ドメインから .env を収集 し、9 万超の環境変数(うち 1,185 個のユニーク AWS アクセスキーを含む)を得たと報告されています。https://example.com/.env がブラウザで開けてしまう状態は、それ自体が公開漏洩です。
経路 3:フロントエンドへの埋め込み
「フロントから外部 API を直接叩く」設計にすると、鍵がブラウザに配信され、誰でも DevTools で抜けます。
悪い例(Next.js)
// クライアントコンポーネントで秘密鍵を参照
// NEXT_PUBLIC_ を付けると build 時に JS バンドルへインライン展開され、
// ブラウザの Sources から平文で読めてしまう
const stripe = require("stripe")(process.env.NEXT_PUBLIC_STRIPE_SECRET_KEY);
Next.js 公式ドキュメント Environment Variables の通り、NEXT_PUBLIC_ を付けた変数は next build 時にクライアント JS へインライン展開 されます。秘密鍵にこの接頭辞を付けるのは、鍵を全世界へ配るのと同じです。
良い例
// 秘密鍵は接頭辞なし = サーバ専用。クライアントからは undefined
// 決済はサーバ側 API ルート / Server Action でのみ実行
// app/api/checkout/route.ts (サーバ専用)
const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY);
原則: 秘密鍵をフロントに出さない。外部 API はバックエンド経由(BFF / API ルート)で呼ぶ。フロントに置いてよいのは「漏れても害がない公開可能な識別子」だけです。
経路 4:ログ・エラー出力への混入
デバッグ目的のログに、鍵や接続文字列がそのまま出てしまう経路です。
悪い例
print(f"Connecting with config: {config}") # config に DB パスワードが含まれる
logger.info(f"Calling API with headers: {headers}") # Authorization: Bearer ... が丸ごと出る
CI / CD のログ、クラウドのログ集約基盤(CloudWatch など)、エラートラッキング(Sentry 等)に鍵が流れ込み、ログを読める全員に漏れます。CI ログは公開リポでは外部からも見えることがあります。
良い例
# 鍵・認証情報はログに出す前にマスクする
def mask(s):
return s[:4] + "****" if s else ""
logger.info("Calling API key=%s", mask(api_key))
# 接続情報はホスト名だけ等、最小限に
logger.info("Connecting to db host=%s", config["host"])
経路 5:公開リポ・成果物・コンテナイメージからの流出
git init したフォルダごと公開したり、ビルド成果物や Docker イメージに鍵を焼き込んでしまう経路です。
悪い例
# ビルド引数や ENV で鍵をイメージに焼き込む
ENV AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
COPY .env /app/.env # .env ごとイメージに入る
Docker イメージのレイヤーは展開すれば誰でも中身を読めます。docker history や dive でビルド時の鍵が見えてしまいます。
良い例
# 鍵はイメージに入れない。実行時に環境変数 / Secrets で注入
# ビルド時の一時シークレットは BuildKit の --mount=type=secret を使う
# COPY .env はしない(.dockerignore に .env を入れる)
.dockerignore に .env と .git を入れ、実行時にオーケストレータ(ECS のタスク定義の Secrets、Kubernetes の Secret など)から注入 します。
FREE DOWNLOAD
AI導入チェックリスト(PoC 失敗要因 10項目)
情シス部門が PoC 前に押さえるべき失敗要因を10項目に整理した無料チェックリスト。
漏れた鍵は何分で悪用されるか(クラウド課金爆発の構造)
鍵が漏れると何が起きるか。最も分かりやすい被害が クラウド従量課金の爆発 です。
攻撃者は公開リポや .env を 自動で走査 しており、有効な AWS アクセスキーを見つけると即座に悪用します。2025 年末に報じられた、盗難 IAM 認証情報を悪用する大規模な暗号資産マイニングキャンペーンでは、攻撃者がアクセスを得てから 10 分以内に暗号資産マイナーが稼働した とされ、AWS GuardDuty による分析が報じられています(The Hacker News / The Register)。攻撃者は 「admin 相当」の権限を持つ IAM 認証情報 を使い、ECS / EC2 上に GPU インスタンスを大量起動して暗号資産を採掘し、その費用は 被害企業の請求書に乗ります。報道では、攻撃者が GPU インスタンスを立て、誰も気づかないうちに数万ドル規模のクラウド請求が積み上がる ケースが指摘されています(Dark Reading)。
被害の連鎖はこうなります。
鍵が Git / .env / フロントに出る
→ 自動収集ボットが数分〜数時間で発見
→ admin 相当の権限なら即座に GPU 大量起動(10 分で稼働の報道例)
→ 暗号資産マイニング / データ流出 / 他システムへの横展開
→ 月末に数万ドル規模の請求 → そこで初めて発覚
注記: 上記のマイニング報道は「バイブコーディングが直接原因」と断定するものではありません。しかし AI が直書きした admin 級の鍵が公開経路に出る という、本記事で扱う構造そのものが攻撃の入口になり得ます。漏れた鍵が admin 権限なら被害は青天井 という点が、後述の「最小権限 IAM」が効く理由です。
公開報道済の鍵漏洩事例から学ぶ
注記: 以下は当時の組織体制下で発生した事例であり、「バイブコーディング起因」と断定するものではありません。専門家チェックが薄い環境で同種リスクが顕在化しやすい という警鐘として参照します。
事例:Toyota(T-Connect)— アクセスキーが GitHub に約 5 年間公開
トヨタ自動車は 2022 年 10 月、テレマティクスサービス「T-Connect」のソースコードの一部が GitHub 上で公開状態になり、そのコードにデータサーバへのアクセスキーが含まれていた と公表しました。コードは 2017 年 12 月から 2022 年 9 月 15 日まで 公開され、その間 296,019 件 の顧客のメールアドレスと管理番号が第三者から閲覧可能な状態だったとされます。トヨタは公開を確認後にリポジトリを非公開化し、該当する接続認証情報を無効化・差し替え ました(BleepingComputer / The Register)。
この事例の教訓は中堅企業にこそ刺さります。
- 開発委託先(外注)のミス がきっかけだったと報じられている点。バイブコーディングを外部ベンダーや業務委託に任せている中堅企業は、自社で気づけない 構造が同じです。
- 5 年気づかなかった 点。鍵漏洩は SQL Injection と違い「壊れない」ので、検知の仕組み(Secret Scanning)が無いと年単位で放置 されます。
- 対応の正解が「鍵の無効化・差し替え(ローテーション)」 だった点。漏れた鍵はファイルを消すだけでは無意味で、鍵そのものを失効させる のが止血の本質です。
GitGuardian が「2022 年に検出された有効なシークレットの 64% が 2026 年も生きている」と報告している通り、多くの組織はこの止血すらできていません。
防衛 1:GitHub Push Protection / Secret Scanning
最初の防衛線は 「鍵をリポジトリに入れさせない」 ことです。GitHub には標準で 2 つの機能があります(GitHub Docs: Push protection)。
| 機能 | 役割 | タイミング |
|---|---|---|
| Secret Scanning | コミット済みのシークレットを検出してアラート | 事後(漏れた後) |
| Push Protection | シークレットを含む push をブロックして拒否 | 事前(漏れる前) |
Push Protection は、シークレットを含む push を検知すると push そのものをブロック し、何が検知されたかを表示します。開発者は鍵を取り除いて push し直す必要があります。リポジトリ・組織・エンタープライズの各レベルで有効化でき、リポジトリ管理者 / 組織オーナー / セキュリティマネージャ等が設定します。バイパスを限定的に許可する「委任バイパス(delegated bypass)」も設定可能です。
加えて GitHub は パートナープログラム を運用しており、AWS / Stripe / Slack など参加プロバイダのトークン形式が公開リポで検出されると、プロバイダ側へ直接アラートが飛び ます(GitHub Docs: About secret scanning for partners)。つまり、漏れた AWS キーは AWS にも通知され、自動失効の対象になり得ます。
中堅企業がまずやること: 自社の GitHub 組織で Push Protection を全リポジトリに有効化 する。これは設定変更だけで、追加開発はほぼ不要です。
防衛 2:検知ツール(gitleaks / TruffleHog / Trivy)と pre-commit
GitHub 以外(GitLab / 社内 Git / ローカル)も守るには、OSS の検知ツールを組み込みます。3 つの定番を役割で整理します(TruffleHog GitHub)。
| ツール | 強み | 検証機能 | 主な使いどころ |
|---|---|---|---|
| gitleaks | 高速・正規表現 150+ パターン + エントロピー。軽量 | なし | pre-commit / 高速 CI スキャン |
| TruffleHog | 800+ のシークレット型を検出、実際に認証を試して有効性を検証 | あり(live verify) | CI / 深い棚卸し・有効鍵の特定 |
| Trivy | IaC / コンテナ / 依存 / SBOM スキャンに シークレット検出も同梱 | なし | 既に Trivy 利用中なら追加コストゼロ |
実務の定石は 「pre-commit で gitleaks(速い)→ CI で TruffleHog(深い)」 の二段構えです。
pre-commit フックで「コミット前」に止める
開発者の手元で、コミットされる前に鍵を弾くのが最も早い防衛です。
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.x.x
hooks:
- id: gitleaks
# 導入(pre-commit を使う場合)
pip install pre-commit
pre-commit install # 以降、git commit のたびに自動でシークレットスキャン
CI での網羅スキャン例
# GitHub Actions の例:push / PR でリポジトリ全体をスキャン
- name: Scan for secrets
uses: trufflesecurity/trufflehog@main
with:
extra_args: --results=verified # 「実際に有効な」鍵だけ報告し誤検知を抑制
ポイント: 既にコミット済みの履歴も対象にスキャンすること。過去に紛れ込んだ鍵は、見つけたら 失効+ローテーション(次節)まで実施しないと「検知しただけ」で終わります。
防衛 3:シークレットマネージャ(AWS Secrets Manager / Vault)
根本対策は 「鍵をコードや .env に置かず、専用の金庫で集中管理する」 ことです。
AWS Secrets Manager
AWS のマネージドな鍵金庫。アプリは起動時に SDK 経由で鍵を取得し、ソースにも環境ファイルにも鍵を持ちません。DB 認証情報などは 自動ローテーション に対応しており、定期的に鍵を入れ替えられます。
import boto3, json
def get_secret(name):
client = boto3.client("secretsmanager")
resp = client.get_secret_value(SecretId=name)
return json.loads(resp["SecretString"])
secret = get_secret("prod/db") # 鍵の値はコードに無い
db_password = secret["password"]
HashiCorp Vault
クラウド非依存(マルチクラウド / オンプレ)で使えるシークレット管理基盤。動的シークレット(必要時に短命の認証情報を発行)、きめ細かいアクセスポリシー、監査ログが強みです。複数クラウドや社内システムが混在する中堅企業に向きます。
中堅企業の選び方
AWS 中心 / マネージドで楽に始めたい → AWS Secrets Manager
マルチクラウド・オンプレ混在 / 動的シークレット → HashiCorp Vault
まずローカルだけ整える → .env を .gitignore + .env.example 運用
重要: シークレットマネージャを入れても、.gitignore と検知ツール(防衛 1・2)はやめないこと。金庫を買っても、机に合鍵を放置していたら意味がありません。
防衛 4:キーローテーションと最小権限 IAM
漏れる前提で「漏れても被害を小さくする」のがこの 2 つです。
キーローテーション(鍵の定期入れ替え)
- 定期ローテーション: API キー / DB パスワード / クラウドキーを定期的に発行し直す。Secrets Manager の自動ローテーション機能を使うと運用負荷が下がります。
- 漏洩時の緊急ローテーション: 鍵が漏れたら、まず旧鍵を失効 させる。これが Toyota 事例で取られた「無効化・差し替え」です。ファイルを消すだけでは履歴に残った鍵は生きたままなので無意味です。
- 長期キーをやめる: AWS は長期アクセスキーより 一時認証情報(IAM ロール / STS) の利用を推奨しています。長期キーは漏れた瞬間から失効まで使われ続けます。
最小権限 IAM(Least Privilege)
漏れた鍵の被害は その鍵の権限の広さに比例 します。前述のマイニング事例で被害が大きかったのは、攻撃者が admin 相当の鍵 を得たからです。
- 1 つの鍵に全権限を持たせない。「S3 の特定バケットを read だけ」のように用途ごとに最小化する。
- 本番と開発の鍵・アカウントを分ける。
- MFA を強制 する(第 10 回(MFA 先送り) の連載でも扱う基本対策)。
- GuardDuty / コスト異常検知アラート を設定し、課金爆発や不審な API 呼び出しを早期に検知する。鍵漏洩は検知が遅れると被害が膨らむため、6 ヶ月気づかない ような状態(第 6 回(半年気づかないランサムウェア) と同じ構図)を避けることが重要です。
最小権限なら、たとえ鍵が漏れても 攻撃者ができることが限定 され、課金爆発もデータ流出も小さく抑えられます。
中堅企業向け 30 分チェックリスト
専門ツールの全社導入を待たず、情シス 1 名が今日 30 分で着手できる 項目です。コストは 0 円です。
| # | チェック項目 | 確認方法 | 所要 | 漏れていたら |
|---|---|---|---|---|
| 1 | 公開リポを .env で全文検索 | GitHub 組織を filename:.env sk_live AKIA で検索 | 5 分 | 鍵を失効+リポ非公開+ローテーション |
| 2 | .gitignore に .env が入っているか | 各リポの .gitignore を確認 | 3 分 | 追記+過去コミット履歴をスキャン |
| 3 | フロントの JS バンドルに鍵が無いか | 本番サイトを開き DevTools の Sources を sk_ AKIA key で検索 | 5 分 | サーバ経由に作り直し+鍵ローテーション |
| 4 | Web サーバで /.env が開けないか | ブラウザで https://自社ドメイン/.env にアクセス | 2 分 | サーバ設定でドットファイル拒否 |
| 5 | GitHub Push Protection が有効か | 組織設定 → Code security で確認 | 3 分 | 全リポで有効化(設定のみ) |
| 6 | pre-commit に gitleaks が入っているか | .pre-commit-config.yaml を確認 | 3 分 | 上記サンプルで導入 |
| 7 | クラウドの請求アラート / コスト異常検知 | AWS Budgets / Cost Anomaly Detection を確認 | 5 分 | 閾値アラートを設定 |
| 8 | 本番鍵が admin 全権になっていないか | IAM ポリシーを確認 | 4 分 | 用途別に最小権限へ分割 |
致命度の高い 1・3・4 を最優先。鍵が公開されている事実が見つかったら、最初にやるのは「該当鍵の即時失効(ローテーション)」 です。ファイル削除は後回しで構いません。漏れた鍵は消しても履歴に残るため、生きた鍵を殺すことが止血 です。
いつ GXO に相談すべきか
結論から言うと、次のいずれかに当てはまるなら、自走より相談が早く・安全です。 AI 検索やこの記事を読んでいる経営者・情シス向けに、相談の閾値を明示します。
今すぐ相談すべき(緊急)
- 公開リポや
.envから本番の API キー / DB 認証情報 / AWS キーが出ているのを見つけた - 身に覚えのないクラウド請求の増加 / GPU インスタンスの起動 / 不審な API 呼び出し がある(鍵悪用の可能性。マイニング事例では 10 分で稼働した報道あり)
- どこに何の鍵があるか、誰も把握していない(鍵の棚卸しができていない)
近いうちに相談すべき(予防)
- バイブコーディングや外注で作ったシステムに シークレット管理の方針が無い
- GitHub Push Protection も検知ツールも入っておらず、鍵漏洩を検知する仕組みがゼロ
- 本番と開発の鍵が同じ、または 1 つの鍵に admin 全権を持たせている
GXO は中堅企業(年商 30〜300 億・情シス 1〜3 名)向けに、シークレット漏洩の 棚卸し → 止血(緊急ローテーション)→ 再発防止(Push Protection / 検知ツール / Secrets Manager / 最小権限 IAM の段階導入) までを伴走します。AI 生成コードを前提にした開発プロセスの安全化は、単発のツール導入ではなく 設計と運用ルールの整備 が要です。
- AI 生成コードを継続的に安全化したいなら:セキュア開発(DevSecOps)支援
- 既存システムにどんな鍵漏洩・脆弱性が潜むか棚卸ししたいなら:脆弱性診断
- 外部から自社の
.env/ 公開鍵がどう見えているか確認したいなら:外部攻撃対象領域の診断 - AI 開発前提のセキュリティ成熟度を測りたいなら:LLM セキュリティ・レディネス診断
よくある質問(FAQ)
Q1. 鍵をコミットしてしまいました。ファイルを消せば大丈夫ですか?
A. いいえ。ファイルを消しても Git の履歴に鍵は残り、git log -p で誰でも掘り出せます。正解は「漏れた鍵を即座に失効(ローテーション)させる」 ことです。履歴のクリーンアップ(git filter-repo 等)は二次対応で、まず生きた鍵を殺してください。
Q2. プライベートリポジトリなら直書きしてもいいですか?
A. 推奨しません。プライベートでも、退職者・委託先・フォーク・CI ログ・将来の公開ミスなど漏洩経路は多数あります。Toyota 事例も「非公開のつもりが公開になっていた」ケースです。リポジトリの公開設定に依存しない設計(環境変数 / Secrets Manager)が安全です。
Q3. AI に「鍵は環境変数にして」と頼めば防げますか?
A. 改善しますが完全ではありません。指示すれば環境変数化しますが、.gitignore 追加漏れ・フロントへの誤露出・ログ出力など他の経路は残ります。AI の出力 → 検知ツール(gitleaks / TruffleHog)→ 人のレビュー の多層で守ってください。
Q4. .env は使ってはいけないのですか?
A. ローカル開発で使うのは問題ありません。条件は「.gitignore で除外」「公開ディレクトリに置かない」「本番では Secrets Manager / Vault から注入」の 3 点です。.env 自体ではなく .env をコミット・公開する ことが事故です。
Q5. シークレットマネージャは中堅企業には過剰ではないですか?
A. AWS 中心なら AWS Secrets Manager は数クリックで始められ、DB 認証情報の自動ローテーションまで使えます。まずローカルを .gitignore + .env.example で固め、本番から Secrets Manager に移すのが現実的な順序です。最初から Vault を入れる必要はありません。
Q6. 漏れた鍵が悪用されると、具体的に何が起きますか?
A. 最も多いのが クラウド従量課金の爆発(暗号資産マイニングに GPU を大量起動され請求が積み上がる)です。2025 年末の報道では盗難 IAM 鍵で 10 分以内にマイナーが稼働した例があります。加えて データ流出・他システムへの横展開 も起こり得ます。被害の大きさは鍵の権限に比例するため、最小権限が効きます。
まとめ:シークレットは「漏れない設計」で守る
本記事の要点を 7 行でまとめます。
- AI 生成コードは鍵をハードコードし
.envごとコミットする。GitGuardian 2026 では Claude Code 補助コミットの漏洩率が平均の約 2 倍(3.2% 対 1.5%)です。 - 2025 年に公開 GitHub へ 2,865 万件(前年比 +34%)のシークレットが流入。さらに 2022 年検出分の 64% が今も失効されず放置 されています。
- 漏洩は 5 経路:ハードコード /
.env誤コミット / フロント埋め込み / ログ出力 / 公開リポ・成果物・イメージ。 - 漏れた鍵は数分で悪用 され、admin 級なら 10 分でマイニング稼働・数万ドル規模の請求 という報道事例があります。
- Toyota は 5 年間アクセスキーを公開し 296,019 件が露出。正解の対応は「鍵の無効化・差し替え」でした。
- 防衛は 4 層:Push Protection / Secret Scanning → gitleaks・TruffleHog・Trivy + pre-commit → Secrets Manager・Vault → キーローテーション + 最小権限 IAM。
- 30 分チェックリスト で今日着手し、見つけたら まず鍵を失効 させる。ファイル削除は後回しでよい。
「動いている」と「漏れていない」は別物です。AI で速く作る時代こそ、シークレットは 漏らさない設計 で守る番です。次回(第 16 回)は クラウドコストの暴走:AI が書いた無限ループと従量課金の落とし穴 を取り上げます。あわせて、依存パッケージ経由で鍵やマルウェアが入り込む 第 17 回(幻覚パッケージ / slopsquatting) もご覧ください。
参考一次ソース
本記事の事実認定で参照した一次/一次に準ずるソース一覧:
調査レポート / 公式報道
- GitGuardian — The State of Secrets Sprawl 2026(2,865 万件・+34%・Claude Code 3.2% 対 1.5%・64% 未失効)
- Sysdig — EMERALDWHALE: 15k Cloud credentials stolen via exposed Git config / .env
- The Hacker News — Compromised IAM Credentials Power a Large AWS Crypto Mining Campaign(10 分でマイナー稼働)
- The Register — Crypto crooks co-opt stolen AWS creds to mine coins
- Dark Reading — Attackers Use Stolen AWS Credentials in Cryptomining Campaign
- BleepingComputer — Toyota discloses data leak after access key exposed on GitHub(296,019 件・約 5 年公開)
- The Register — Key to Toyota customer info left out on GitHub for years
公式ドキュメント / ツール
- GitHub Docs — Push protection
- GitHub Docs — About secret scanning for partners
- GitHub Docs — Supported secret scanning patterns
- TruffleHog(trufflesecurity/trufflehog)
- gitleaks(gitleaks/gitleaks)
- Trivy(aquasecurity/trivy)
- AWS Secrets Manager 公式
- HashiCorp Vault 公式
- Next.js 公式 — Environment Variables
国内公的機関(一般的参照)
関連記事
- 連載ハブ:バイブコーディング危機(全 20 回)
- 第 2 回 SQL Injection の現実 5 パターン
- 第 6 回 半年気づかないランサムウェアと検知の不在
- 第 17 回 幻覚パッケージ / slopsquatting と依存の罠
「うちの API キー、どこかに漏れてないか?」と一度でも思ったら、その勘は正しいです。
GXO は中堅企業(年商 30300 億・情シス 13 名)向けに、外部 CTO / セキュリティ顧問、AI 生成コードの脆弱性診断、シークレット棚卸しと止血、運用ルール整備までを段階的に支援します。
※ 営業電話はしません | オンライン対応可 | 相談だけでもOK
著者: GXO株式会社 初回公開: 2026 年 6 月 9 日 最終更新: 2026 年 6 月 9 日 連載: バイブコーディング危機 第 15 回(全 20 回予定)
