ヒヤッとした人へ | Claude Code利用者が必ず知るべき「APIキー漏洩」3つのシナリオと5つの対策
2026年4月、「Claude CodeがAPIキーをパブリックなパッケージレジストリに漏洩させている」という調査報告が公開されました。
攻撃者がやったわけじゃない。開発者自身が、気づかないうちにやっていた。
Claude Codeを毎日使っている自分も、ヒヤッとした瞬間があります。「allow alwaysを何気なく押したあのコマンド、本当に安全だったか」と。この記事では、AIコーディングアシスタントがシークレットを記録・漏洩させる仕組みと、今日からできる5つの対策を整理します。
Claude Codeが「シークレットを覚える」仕組み
Claude Codeには「allow always」という機能があります。繰り返し出てくる確認ダイアログを毎回承認するのが面倒なとき、このオプションを選ぶと以降は自動で許可されます。
便利なのですが、ここに落とし穴がある。
「allow always」を選択したコマンドは、プロジェクトの .claude/ ディレクトリ内のファイルに永続的に記録されます。もしそのコマンドの中に環境変数や認証トークンが含まれていたら、それもそのまま残ります。
AWS_ACCESS_KEY_ID=AKIA... aws s3 cp file.txt s3://bucket/ # allow alwaysにした場合、このコマンドが記録されるこの状態でプロジェクトを npm publish したり、.claude/ を除外せずにGitHubへpushしたりすると、シークレットが外に出る可能性があります。セキュリティ研究者の調査では、実際にこの経路でAPIキーが公開パッケージレジストリに流出したケースが確認されています
CLAUDE.mdと.claude/に書いていい情報・いけない情報
Claude Codeを使っていると、プロジェクトのルールや背景を CLAUDE.md に書くことがあります。Claudeに「このプロジェクトのお作法」を教えるためのファイルですが、ここにも注意点があります。
書いていいもの:
コーディング規約、アーキテクチャの説明
使用するツール・コマンドのパターン(認証なしのもの)
開発フローの手順、ブランチ戦略
書いてはいけないもの:
APIキー、トークン、パスワード
本番環境のURLやエンドポイント(内部情報)
個人情報・顧客データの断片
当然に見えますが、「念のため書いておこう」とCLAUDE.mdにトークンを入れてしまうケースが起きます。CLAUDE.md はGitリポジトリにコミットされるため、チームメンバー全員から見える場所に出てしまいます。
このリポジトリのCLAUDE.mdには「APIキーやトークンをgitにコミットしない」というルールを明記しています。ルールは書いておくだけでなく、実際にその状態になっているかを定期的に確認する必要があります。
3つの漏洩シナリオ
具体的にどのような経路でシークレットが漏れるか、整理してみました。
シナリオ1: .claude/ディレクトリのnpm publish漏洩
.npmignore や .gitignore で .claude/ を除外せずに npm publish した場合、allow-alwaysで記録されたコマンド履歴がパッケージに含まれます。そのコマンドにシークレットが入っていれば、全世界に公開されます。
シナリオ2: CLAUDE.mdへの誤記載
「Claudeに環境変数をわかりやすく渡したい」という意図でCLAUDE.mdにAPIキーを書いた場合、そのままGitにコミットされます。プライベートリポジトリでも、権限を持つ全員から参照できる状態になります。
シナリオ3: デバッグ時のプロンプト貼り付け
「このエラーが直らない」とデバッグしているとき、環境変数ファイルの中身をそのままClaudeへ貼り付けることがあります。そのセッションログはローカルに残ります。共有開発環境やCI環境でClaudeを使っている場合、ログが別のメンバーから参照できる状態になる可能性があります。
今日からできる5つの対策
1. .gitignoreに.claude/settings.local.jsonを追加する
最初にやるべき対策です。.claude/settings.local.json はallow-alwaysの設定やローカル固有の設定が保存されます。これをバージョン管理から除外します。
.claude/settings.local.jsonCLAUDE.md や .claude/settings.json(チームで共有すべき設定)は残したい場合もあるので、ファイル単位で判断します。npmパッケージを公開するプロジェクトなら .npmignore にも .claude/ を追加してください。
2. allow alwaysを使う前の1秒確認
「allow always」を押す前に、コマンドの中に環境変数・トークン・認証情報が含まれないかを確認します。これだけで大半のリスクは防げます。
特に注意が必要なコマンドパターン:
環境変数を前置するコマンド(VAR=value command の形式)
curlコマンドのAuthorizationヘッダー
AWS CLIやGCP CLIの認証が絡むコマンド
3. pre-commitフックでシークレットスキャンを設定する
detect-secrets(Yelpが公開しているOSS)を使うと、コミット時に自動でシークレットを検出できます。
uv add --dev detect-secrets
detect-secrets scan > .secrets.baseline.pre-commit-config.yaml に以下を追加します:
repos:
- repo: https://github.com/Yelp/detect-secrets
rev: v1.5.0
hooks:
- id: detect-secrets
args: ['--baseline', '.secrets.baseline']コミットのたびに自動チェックが走ります。意図しないシークレットが含まれていれば、コミット前に止まります。
4. 環境変数はシェルで管理し、Claudeに直接渡さない
Claude Codeに環境変数を渡す際、.env ファイルの内容をCLAUDE.mdに貼り付けるのではなく、シェルの環境変数経由で渡す設計にします。
export OPENAI_API_KEY="sk-..."
claude # シェルの環境変数はそのままClaudeから利用できる.env の中身をプロンプトやCLAUDE.mdに直接書くのは避けます。
5. 使用中のAPIキーを定期的にローテーションする
どれだけ対策しても漏洩リスクをゼロにはできません。定期的なローテーションが保険になります。
AIコーディングツールを使い始めてから、APIキーのローテーション間隔を90日から30日に短縮しました。1回あたりの作業は5分以内です。主要なサービスは全てコンソールからキーを無効化してすぐ再生成できます。
今日の15分チェックリスト
.gitignore に settings.local.json が含まれているか確認する
CLAUDE.md の中にAPIキーやトークンが書かれていないか確認する(grep でシークレットっぽい文字列を探す)
.env ファイルが .gitignore に入っているか確認する
npm publish するプロジェクトなら .npmignore に .claude/ を追加する
直近30日以内に「allow always」したコマンドを settings.local.json で確認し、シークレットが含まれていないか見直す
5つのうち、1つでも今すぐできるものがあれば、それだけやって終わりにする。全部一度にやろうとしなくていいです。
おわりに
Claude Codeのシークレット漏洩問題は「AIツールが悪い」ではなく、「ツールの動作を正確に把握していなかった」ことが原因です。allow-alwaysの記録先、CLAUDE.mdの公開範囲、npm publishの除外設定、これらを一度確かめるだけで、リスクは大きく下がります。
AIコーディングアシスタントを安全に使い続けるための第一歩は、「このツールは何を、どこに記録しているか」を知ることです。
参考になれば嬉しいです。
いいなと思ったら応援しよう!
よろしければ応援お願いします!
今月のClaude に大切に使わせていただきます!
