Claude Code によるシークレット漏洩を防ぐ .env 設定(完全構成ガイド)

Claude Code によるシークレット漏洩を防ぐ .env 設定(完全構成ガイド)

@zodchiii
英語2 週間前 · 2026年4月30日

AI features

1.7M
1.3K
149
30
5.9K

TL;DR

settings.json の拒否ルール設定、ダミーテスト環境の利用、およびプリコミットフックの実装を通じて、機密情報の漏洩を防止し Claude Code を安全に運用する方法を解説します。

Claude Code はプロジェクトを開いた瞬間に .env ファイルを読み取ります。

API キー、データベースのパスワード、Stripe トークンなど、.env ファイル内のすべてがメモリに読み込まれ、Anthropic のサーバーに送信される会話ログに含まれる可能性があります。

実際にアクセスをブロックできるのは settings.json の 1 行だけですが、ほとんどの人はその設定を持っておらず、その存在すら知りません。

完全なセキュリティ設定はこちら 👇

本題に入る前に、私は Telegram チャンネルで AI とバイブコーディングに関する日々のメモを共有しています:**https://t.me/zodchixquant**🧠

darkzodchi on X — cover

CLAUDE.md のルールがあなたを守れない理由

ほとんどの人は CLAUDE.md に「.env ファイルを読み取らない」と追加して安全だと思い込んでいます(実際はそうではありません)

CLAUDE.md は提案に過ぎません。Claude はほとんどの場合それに従いますが、プレッシャーがかかると(複雑なタスク、長いコンテキスト、曖昧な指示)、アドバイザリールールを無視することがあり、実際に無視します。

2026 年 4 月の GitHub の issue で確認されたこと:CLAUDE.md で明示的に禁止されていても、Claude は .env の内容を読み取り、会話に反映します。

唯一信頼できる保護は settings.json の拒否ルールです。拒否ルールは Claude がファイルを見る前にシステムレベルで適用されます。

「これを読まないでください」と「これを物理的に読むことはできません」の違いです。

darkzodchi - inline image

シークレットが漏洩する 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 に追加すると、すべてのプロジェクトでグローバルに保護されます:

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 ファイルを使用します:

text
1# .env.test — safe to read, safe to leak
2STRIPE_SECRET_KEY=sk_test_not_a_real_key
3DATABASE_URL=postgres://test:test@localhost:5432/testdb
4OPENAI_API_KEY=sk-test-dummy-key-for-mocking
5AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
6AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

テストフレームワークが .env ではなく .env.test を指すようにします。これで Claude がテストを実行して出力をキャプチャしても、表示されるキーはダミーのみになります。

すべてをキャッチする pre-commit フック

拒否ルールがあってもミスは起こります。コミットがリポジトリに到達する前にシークレットをスキャンする git pre-commit フックを追加しましょう:

bash
1#!/bin/bash
2# .git/hooks/pre-commit — blocks commits containing secrets
3
4PATTERNS=(
5 'sk-ant-' # Anthropic API keys
6 'sk-live-' # Stripe live keys
7 'sk_live_' # Stripe live keys (alt format)
8 'ghp_' # GitHub personal tokens
9 'gho_' # GitHub OAuth tokens
10 'AKIA' # AWS access keys
11 'xox[bpors]-' # Slack tokens
12 'SG\.' # SendGrid keys
13 'eyJ' # JWTs
14 'BEGIN.*PRIVATE KEY' # Private key material
15)
16
17BLOCKED_FILES=('.env' 'credentials.json' 'id_rsa' '*.pem' '*.key')
18
19for pattern in "${PATTERNS[@]}"; do
20 if git diff --cached --diff-filter=ACM | grep -qE "$pattern"; then
21 echo "BLOCKED: Found potential secret matching '$pattern'"
22 echo "Remove the secret and try again."
23 exit 1
24 fi
25done
26
27for file in "${BLOCKED_FILES[@]}"; do
28 if git diff --cached --name-only | grep -q "$file"; then
29 echo "BLOCKED: Attempted to commit sensitive file: $file"
30 exit 1
31 fi
32done
33
34echo "Pre-commit security check passed."
35exit 0

実行可能にします:chmod +x .git/hooks/pre-commit

これにより、Anthropic API キー、Stripe キー、GitHub トークン、AWS キー、Slack トークン、SendGrid キー、JWT、秘密鍵素材がキャッチされます。これらのいずれかがステージングされたファイルに現れると、コミットがブロックされます。

コンテナ分離(最終手段)

最大限のセキュリティを確保するには、.env ファイルが文字通り存在しないコンテナ内で Claude Code を実行します:

bash
1# Mount /dev/null over .env so Claude can't see it
2docker run -v /dev/null:/app/.env:ro your-dev-container

Claude から見ると、.env は空のファイルです。シークレットがコンテナのファイルシステムに入ることは決してありません。これはほとんどのプロジェクトでは過剰ですが、本番環境の認証情報を扱うクライアント作業には不可欠です。

完全なセキュリティ設定(コピペ準備完了)

すべてのセキュリティ保護を含む完全な ~/.claude/settings.json

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 セッションの前に:

  1. settings.json に .env ファイル用の拒否ルールがありますか?
  2. テストではダミー値の .env.test を使用していますか?
  3. シークレットパターンをスキャンする pre-commit フックがありますか?
  4. 本番環境の認証情報はプレーンテキストファイルではなく、ボールトに保存されていますか?
  5. .env は .gitignore に含まれていますか?
  6. 安全性を高めるために .env ファイルはプロジェクトディレクトリの外にありますか?

6 つすべてにチェックが入った場合、シークレットは可能な限り保護されています。0 の場合、あいまいな Claude プロンプト 1 つで、API キーが Anthropic のサーバー上の会話ログに表示される可能性があります。

私は Telegram チャンネルで AI、金融、バイブコーディングに関する日々のメモを共有しています:**https://t.me/zodchixquant**

お読みいただきありがとうございます🙏🏼

darkzodchi - inline image

More patterns to decode

Recent viral articles

Explore more viral articles

クリエイターのために。

𝕏 のバズ記事から企画の種を見つけ、伸びた理由を分解し、次のコンテンツ案に変えましょう。