35
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【セキュリティ】なぜAPIキーは流出するのか?2026年最新データと実例から学ぶ原因と対策

35
Posted at

はじめに

生成AIの普及により、OpenAI・Anthropic・Google などのAPIキーを扱う開発者が爆発的に増えました。それに伴い、APIキーの流出事故も急増しています。

セキュリティ企業 GitGuardian が公開した「State of Secrets Sprawl 2025」レポートによると、2024年にGitHub上の公開リポジトリで検出されたハードコードされた機密情報は約2,380万件にのぼり、前年比 25%増 という深刻な状況です。

さらに恐ろしいことに、2022年に漏洩した秘密情報の70%が、2025年現在も有効なまま放置されています。

本記事では、APIキーがなぜ流出するのかを最新データと実例を交えて整理し、今日からできる対策をまとめます。

対象読者

  • APIキーを扱うすべての開発者
  • バイブコーディング(AI駆動開発)を始めたばかりの方
  • チームのセキュリティ意識を高めたいリーダー

1. そもそもAPIキーとは?なぜ流出すると危険なのか

APIキーとは、外部サービスのAPIを利用する際に必要な 「秘密の認証文字列」 です。パスワードと同様、知っていれば誰でもそのサービスの機能を利用できてしまいます。

流出した場合のリスク

リスク 具体例
高額請求 クラウドAPIの従量課金を悪用され、数千〜数万ドルの請求が発生
不正アクセス データベースやストレージへの侵入、情報の窃取
サービス停止 レート制限の超過やクォータの枯渇によりサービスが止まる
信用の失墜 企業の場合、顧客データ漏洩による社会的信用の喪失

APIキーが1つ漏れるだけで、攻撃者は高度な技術を必要とせずにシステム全体にアクセスできる可能性があります。ゼロデイ脆弱性のような複雑な攻撃とは根本的に異なり、「鍵を拾うだけ」で侵入できてしまうのが恐ろしい点です。

2. APIキーが流出する6つの主な原因

2-1. GitHubリポジトリへの誤コミット(最多原因)

最もよくある流出経路は、ソースコードにAPIキーをハードコードしたままGitHubにプッシュしてしまうケースです。

OpenAI公式のベストプラクティスガイドでも、APIキーをソースコードにコミットすることが認証情報漏洩の最も一般的な原因の一つとして挙げられています。

https://help.openai.com/ja-jp/articles/5112595-best-practices-for-api-key-safety

ダメな例
# APIキーを直接コードに書いてはいけない
import openai
client = openai.OpenAI(api_key="sk-1234567890abcdef")
正しい例
# 環境変数から読み込む
import os
import openai
client = openai.OpenAI(api_key=os.environ["OPENAI_API_KEY"])

「プライベートリポジトリだから安全」という考えは危険です。GitGuardianの調査では、プライベートリポジトリの35%に平文の秘密情報が含まれており、AWSのIAMキーがパブリックリポジトリの5倍の頻度で検出されています。

2-2. バイブコーディング(AI生成コード)による流出

2025年に急速に普及したバイブコーディング(Vibe Coding) は、自然言語でAIに指示を出してコードを生成する開発スタイルです。生産性は飛躍的に向上しますが、セキュリティ面での新たなリスクも生まれています。

GitGuardianの調査では、GitHub Copilotを利用しているリポジトリの秘密情報漏洩率は6.4% と報告されています。AIが生成するコードにAPIキーがハードコードされていても、開発者がそのまま気づかずにコミットしてしまうケースが多発しています。

なぜAIはAPIキーをハードコードしがちなのか?

AIは「目的の機能を実現する」ことを最優先します。環境変数やシークレットマネージャーを使う構成が明示的に指示されていない場合、手っ取り早くAPIキーを直接コードに埋め込むことがあります。

あるQiita記事では、「APIキーをコードに書くな」と指示しているにもかかわらず、AI側に秘匿する手段がないために直接コードに書こうとした事例が報告されています。

対策として、AIへのプロンプトに「APIキーは環境変数として扱うこと」「機密情報をハードコードしないこと」を明示的に含めましょう。

2-3. SlackやJiraなどコラボレーションツール経由の流出

コードリポジトリだけが危険なわけではありません。GitGuardianのレポートでは、Slack・Jira・Confluenceなどのコラボレーションツールが認証情報流出の高リスクゾーンになっていると指摘されています。

Slackでは、分析対象ワークスペースのチャンネルの2.4%に漏洩した秘密情報が含まれていたと報告されています。

よくあるパターンとしては以下のようなものがあります。

  • 「このAPIキーで試してみて」とSlackのDMで共有
  • Jiraチケットの説明欄にデバッグ用のキーを記載
  • Confluenceのドキュメントに設定情報としてキーを記録

これらのツールはコードリポジトリと異なり、シークレットスキャン機能がネイティブで備わっていないため、一度投稿された秘密情報はそのまま残り続けます。

2-4. Dockerイメージや設定ファイルへの混入

意外と見落とされがちなのが、Dockerイメージ内に秘密情報が残ってしまうケースです。

GitGuardianが1,500万件の公開Dockerイメージを分析した結果、10万件の有効な秘密情報(AWSキーやGitHubトークンを含む)が発見されました。Fortune 500企業のものも含まれていたとのことです。

よくある混入パターン

ダメな例
# ビルド引数にAPIキーを渡し、レイヤーに残ってしまう
FROM python:3.11
ENV API_KEY=sk-1234567890abcdef
RUN pip install mypackage
正しい例
# ビルド時のみ使用し、最終イメージには含めない
FROM python:3.11 AS builder
ARG API_KEY
RUN pip install mypackage

FROM python:3.11-slim
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
# 実行時は環境変数として外部から注入

.envファイルも同様に注意が必要です。.gitignoreに追加し忘れてコミットしてしまう事故が後を絶ちません。

2-5. フレームワーク・ライブラリの脆弱性

自分のコード管理が万全でも、利用しているフレームワークの脆弱性を通じてAPIキーが流出する可能性があります。

2025年には、LLMアプリケーション開発フレームワーク「LangChain」に深刻な脆弱性(CVE-2025-68664)が発見されました。デシリアライズ処理の不備により、環境変数に格納されたAPIキーが外部から取得される恐れがありました。CVSSスコアは9.1(Critical) と評価されています。

また、Wiz社の調査(2025年11月)では、Forbes「AI 50」に選出されたAI企業の65%がGitHub上で検証済みの秘密情報を漏洩していたことが明らかになりました。流出したシークレットには、非公開モデルの暴露に繋がるものも含まれていたとされています。

2-6. マルウェア・スパイウェアによる窃取

GitHubへの誤コミットやツール経由の流出とは異なり、端末自体が侵害されて秘密情報が盗まれるケースもあります。

2025年4月、個人開発者がAnthropicのAPIキーを何者かに窃取され、短時間で大量にClaude 3.7 Sonnetを不正利用される被害に遭いました。GitHubリポジトリからの漏洩は確認されず、マルウェアスキャンでも検出されなかったため原因の特定が難航しましたが、当時PCのキーボードの反応が悪くなるなどの異常があり、スパイウェアの関与が疑われています。

また、別の個人開発者も2025年11月、Flutterアプリの開発中にGCPからAPIキー漏洩の通知を受けました。こちらは firebase_options.dart に含まれるAPIキーがGitの履歴に記録されていたことが原因でした。

3. 流出後に何が起こるのか

APIキーが漏洩すると、驚くほど短い時間で悪用が始まります

ある開発者の事例では、GitHub公開リポジトリにAWSキーを誤ってプッシュした後、数分以内にEC2インスタンスが大量に起動され、仮想通貨のマイニングに悪用された結果、$6,000以上の請求が発生したと報告されています。

GitHubの公開リポジトリは、攻撃者のBotによって常時監視されています。APIキーを含むコミットをプッシュした瞬間から、悪用までのタイムリミットは数秒〜数分です。「すぐに消せば大丈夫」は通用しません。

4. なぜ流出したキーは放置されるのか

GitGuardianの調査で最も衝撃的だったのは、2022年に漏洩した秘密情報の70%が2025年現在も有効という事実です。

放置される主な理由は以下の通りです。

そもそも漏洩に気づいていない。 プライベートリポジトリやDockerイメージ内の秘密情報は、外部スキャンの対象になりにくく発見が遅れます。

ローテーションが難しい。 本番環境で稼働中のサービスに紐づくAPIキーは、変更するとサービス停止のリスクがあるため、担当者が変更を躊躇してしまいます。

組織的な管理体制がない。 誰がどのキーを発行し、どこで使っているかを一元管理できていない組織が多く、漏洩しても影響範囲を把握できません。

非人間アイデンティティ(NHI)の増加。 サービスアカウントやアプリケーション間の認証に使われるNHIは人間ユーザーより数が多く、有効期限が設定されていないものも多いのが実態です。

5. 今日からできる対策

5-1. 環境変数・シークレットマネージャーの活用

APIキーは絶対にソースコードに直書きせず、環境変数またはシークレットマネージャーで管理しましょう。

# .envファイルに記載(.gitignoreに必ず追加すること)
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxx
# .gitignore に追加
.env
.env.local
.env.*.local

本番環境では、AWS Secrets Manager、GCP Secret Manager、HashiCorp Vault などの専用サービスを利用することを推奨します。

5-2. pre-commitフックによる検知(Gitleaks)

コミット前に秘密情報を自動検出する仕組みを導入しましょう。Gitleaks は160種類以上の秘密情報パターンを検出できるオープンソースツールです。

.pre-commit-config.yaml
repos:
  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.28.0
    hooks:
      - id: gitleaks
# 初期化
pre-commit install

# これ以降、コミット時に自動でスキャンが実行される

5-3. GitHub Push Protection / Secret Scanningの有効化

GitHubには、プッシュ時に既知のシークレットパターンを検出してブロックする Push Protection 機能があります。

ただし、Push Protectionにも限界があります。GitGuardianの調査では、漏洩した認証情報の58%が汎用的なシークレット(Generic Secrets) であり、Push Protectionでは検出しにくいカテゴリです。Push Protectionだけに頼らず、複数の防御策を組み合わせましょう。

5-4. CI/CDパイプラインでの自動スキャン

GitHub Actionsなどを活用し、プッシュやPR作成のたびにスキャンを実行する仕組みを構築しましょう。

.github/workflows/secrets-scan.yml
name: Secrets Scan
on: [push, pull_request]
jobs:
  gitleaks:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: gitleaks/gitleaks-action@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

5-5. APIキーの権限最小化とローテーション

APIキーを発行する際は、必要最小限の権限のみ付与しましょう。

対策 説明
権限の制限 読み取り専用、特定のエンドポイントのみなど、用途に応じた最小権限を設定
利用期限の設定 可能な限り有効期限付きのキーを発行し、自動ローテーションを実施
用途別の発行 サービスごと・環境ごとにキーを分け、漏洩時の影響範囲を限定
利用状況の監視 異常なリクエストパターンを検知するモニタリングを導入
IPアドレス制限 利用元のIPアドレスを制限し、想定外のアクセスをブロック

5-6. IAMロールなど、APIキーを使わない認証への移行

最も根本的な対策は、そもそもAPIキーを発行しないことです。

AWSの場合、EC2インスタンスにIAMロールを割り当てることで、アクセスキーを発行せずにAWSリソースへアクセスできます。GCPではWorkload Identity、AzureではManaged Identityが同様の機能を提供しています。

6. バイブコーディング時代に特に気をつけるべきこと

バイブコーディングの普及により、プログラミング経験の浅い方もAPIキーを扱う機会が増えています。以下のポイントを習慣化しましょう。

AIが生成したコードを必ずレビューする

AIが出力したコードをそのままコミットするのではなく、秘密情報が含まれていないかを確認する習慣をつけましょう。

プロンプトにセキュリティ指示を明示する

AIへの指示に以下のような文言を加えることで、安全なコードが生成されやすくなります。

プロンプト例
以下の要件でコードを生成してください。
- APIキーは環境変数から読み込むこと
- 機密情報を絶対にハードコードしないこと
- .env.example を用意して必要な変数名のみ記載すること

.gitignoreのテンプレートを最初に用意する

プロジェクト開始時に、.envや認証関連ファイルを除外する.gitignoreを必ず設定しましょう。GitHub公式が提供するgitignoreテンプレートを活用するのもおすすめです。

セキュリティツールを開発フローに組み込む

レコチョクのテックブログでは、Gitleaks と AWS CDK MCP Server を組み合わせたセキュアなAI開発の実践方法が詳しく紹介されています。

まとめ

APIキーの流出は、「うっかりミス」で片付けるには被害が大きすぎる問題です。
image.png

APIキーの管理は「面倒な作業」ではなく 「開発の基盤」 です。特にバイブコーディングが当たり前になった2025年、AIの便利さを享受しつつも、セキュリティを意識した開発を心がけましょう。

参考資料

35
29
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
35
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?