
Claude Code によるシークレット漏洩を防ぐ .env 設定(完全構成ガイド)
AI features
- Views
- 1.7M
- Likes
- 1.3K
- Reposts
- 149
- Comments
- 30
- Bookmarks
- 5.9K
TL;DR
settings.json の拒否ルール設定、ダミーテスト環境の利用、およびプリコミットフックの実装を通じて、機密情報の漏洩を防止し Claude Code を安全に運用する方法を解説します。
Reading the 日本語 translation
Claude Code はプロジェクトを開いた瞬間に .env ファイルを読み取ります。
API キー、データベースのパスワード、Stripe トークンなど、.env ファイル内のすべてがメモリに読み込まれ、Anthropic のサーバーに送信される会話ログに含まれる可能性があります。
実際にアクセスをブロックできるのは settings.json の 1 行だけですが、ほとんどの人はその設定を持っておらず、その存在すら知りません。
完全なセキュリティ設定はこちら 👇
本題に入る前に、私は Telegram チャンネルで AI とバイブコーディングに関する日々のメモを共有しています:**https://t.me/zodchixquant**🧠

CLAUDE.md のルールがあなたを守れない理由
ほとんどの人は CLAUDE.md に「.env ファイルを読み取らない」と追加して安全だと思い込んでいます(実際はそうではありません)
CLAUDE.md は提案に過ぎません。Claude はほとんどの場合それに従いますが、プレッシャーがかかると(複雑なタスク、長いコンテキスト、曖昧な指示)、アドバイザリールールを無視することがあり、実際に無視します。
2026 年 4 月の GitHub の issue で確認されたこと:CLAUDE.md で明示的に禁止されていても、Claude は .env の内容を読み取り、会話に反映します。
唯一信頼できる保護は settings.json の拒否ルールです。拒否ルールは Claude がファイルを見る前にシステムレベルで適用されます。
「これを読まないでください」と「これを物理的に読むことはできません」の違いです。

シークレットが漏洩する 3 つの経路
Claude が直接 .env を読み取るだけではありません。3 つの経路があります:
1. 直接ファイル読み取り。 Claude がプロジェクトをスキャンし、.env を開き、その内容が会話コンテキストの一部になります。これは明白な経路であり、拒否ルールで最も簡単にブロックできます。
2. ランタイム出力のキャプチャ。 Claude がテストを実行したりアプリを起動したりします。失敗した HTTP リクエストは完全な Authorization: Bearer sk-live-abc123... ヘッダーをログに記録します。データベースのタイムアウトはパスワードを含む接続文字列をダンプします。Claude はすべてのコマンド出力をキャプチャします。Claude が .env を開いていなくても、あなたのシークレットは会話に含まれることになります。
3. Grep および検索ツール。 Claude は grep を使用してコードベースから関数名を検索します。検索が認証情報を含む設定ファイルにヒットします。grep の出力には、シークレットが表示された一致行が含まれます。
ほとんどの人は経路 1 のみを保護しています。実際の被害は経路 2 と 3 で発生します。
実際に機能する拒否ルール
これらを ~/.claude/settings.json に追加すると、すべてのプロジェクトでグローバルに保護されます:
1{2 "permissions": {3 "deny": [4 "Read(**/.env*)",5 "Read(**/.dev.vars*)",6 "Read(**/*.pem)",7 "Read(**/*.key)",8 "Read(**/secrets/**)",9 "Read(**/credentials/**)",10 "Read(**/.aws/**)",11 "Read(**/.ssh/**)",12 "Read(**/config/database.yml)",13 "Read(**/config/credentials.json)",14 "Read(**/.npmrc)",15 "Read(**/.pypirc)",16 "Write(**/.env*)",17 "Write(**/secrets/**)",18 "Write(**/.ssh/**)"19 ]20 }21}
これにより、Claude が .env ファイル、PEM キー、SSH キー、AWS 設定、認証情報ファイル、npm/PyPI トークンを読み書きするのをブロックします。\\ ワイルドカードは、プロジェクト内のすべてのサブディレクトリに適用されることを意味します。
ランタイム漏洩のブロック
拒否ルールは直接ファイル読み取りを防ぎますが、ランタイム出力は防ぎません。そのためには、ダミー値を使用したテスト用の .env ファイルを使用します:
1# .env.test — safe to read, safe to leak2STRIPE_SECRET_KEY=sk_test_not_a_real_key3DATABASE_URL=postgres://test:test@localhost:5432/testdb4OPENAI_API_KEY=sk-test-dummy-key-for-mocking5AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE6AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
テストフレームワークが .env ではなく .env.test を指すようにします。これで Claude がテストを実行して出力をキャプチャしても、表示されるキーはダミーのみになります。
すべてをキャッチする pre-commit フック
拒否ルールがあってもミスは起こります。コミットがリポジトリに到達する前にシークレットをスキャンする git pre-commit フックを追加しましょう:
1#!/bin/bash2# .git/hooks/pre-commit — blocks commits containing secrets34PATTERNS=(5 'sk-ant-' # Anthropic API keys6 'sk-live-' # Stripe live keys7 'sk_live_' # Stripe live keys (alt format)8 'ghp_' # GitHub personal tokens9 'gho_' # GitHub OAuth tokens10 'AKIA' # AWS access keys11 'xox[bpors]-' # Slack tokens12 'SG\.' # SendGrid keys13 'eyJ' # JWTs14 'BEGIN.*PRIVATE KEY' # Private key material15)1617BLOCKED_FILES=('.env' 'credentials.json' 'id_rsa' '*.pem' '*.key')1819for pattern in "${PATTERNS[@]}"; do20 if git diff --cached --diff-filter=ACM | grep -qE "$pattern"; then21 echo "BLOCKED: Found potential secret matching '$pattern'"22 echo "Remove the secret and try again."23 exit 124 fi25done2627for file in "${BLOCKED_FILES[@]}"; do28 if git diff --cached --name-only | grep -q "$file"; then29 echo "BLOCKED: Attempted to commit sensitive file: $file"30 exit 131 fi32done3334echo "Pre-commit security check passed."35exit 0
実行可能にします:chmod +x .git/hooks/pre-commit
これにより、Anthropic API キー、Stripe キー、GitHub トークン、AWS キー、Slack トークン、SendGrid キー、JWT、秘密鍵素材がキャッチされます。これらのいずれかがステージングされたファイルに現れると、コミットがブロックされます。
コンテナ分離(最終手段)
最大限のセキュリティを確保するには、.env ファイルが文字通り存在しないコンテナ内で Claude Code を実行します:
1# Mount /dev/null over .env so Claude can't see it2docker run -v /dev/null:/app/.env:ro your-dev-container
Claude から見ると、.env は空のファイルです。シークレットがコンテナのファイルシステムに入ることは決してありません。これはほとんどのプロジェクトでは過剰ですが、本番環境の認証情報を扱うクライアント作業には不可欠です。
完全なセキュリティ設定(コピペ準備完了)
すべてのセキュリティ保護を含む完全な ~/.claude/settings.json:
1{2 "permissions": {3 "allow": [4 "Read",5 "Glob",6 "Grep",7 "LS",8 "Edit",9 "MultiEdit",10 "Write(src/**)",11 "Write(tests/**)",12 "Bash(npm run *)",13 "Bash(npm test *)",14 "Bash(npx tsc *)",15 "Bash(git status)",16 "Bash(git diff *)",17 "Bash(git log *)",18 "Bash(git add *)",19 "Bash(git commit *)"20 ],21 "deny": [22 "Read(**/.env*)",23 "Read(**/.dev.vars*)",24 "Read(**/*.pem)",25 "Read(**/*.key)",26 "Read(**/secrets/**)",27 "Read(**/credentials/**)",28 "Read(**/.aws/**)",29 "Read(**/.ssh/**)",30 "Read(**/config/database.yml)",31 "Read(**/config/credentials.json)",32 "Read(**/.npmrc)",33 "Read(**/.pypirc)",34 "Write(**/.env*)",35 "Write(**/secrets/**)",36 "Write(**/.ssh/**)",37 "Write(.github/workflows/*)",38 "Bash(rm -rf *)",39 "Bash(sudo *)",40 "Bash(git push *)",41 "Bash(npm publish *)",42 "Bash(curl * | sh)",43 "Bash(wget *)",44 "Bash(chmod *)"45 ],46 "defaultMode": "acceptEdits"47 }48}
これは以前の記事の settings.json に、今回のすべてのセキュリティルールを追加したものです。日常のワークフロー用の許可ルール、シークレットと危険な操作用の拒否ルール。1 つのファイルで完全な保護を実現します。
チェックリスト
次の Claude Code セッションの前に:
- settings.json に .env ファイル用の拒否ルールがありますか?
- テストではダミー値の .env.test を使用していますか?
- シークレットパターンをスキャンする pre-commit フックがありますか?
- 本番環境の認証情報はプレーンテキストファイルではなく、ボールトに保存されていますか?
- .env は .gitignore に含まれていますか?
- 安全性を高めるために .env ファイルはプロジェクトディレクトリの外にありますか?
6 つすべてにチェックが入った場合、シークレットは可能な限り保護されています。0 の場合、あいまいな Claude プロンプト 1 つで、API キーが Anthropic のサーバー上の会話ログに表示される可能性があります。
私は Telegram チャンネルで AI、金融、バイブコーディングに関する日々のメモを共有しています:**https://t.me/zodchixquant**
お読みいただきありがとうございます🙏🏼



