Claude Code に .env を読ませない設定と、その限界(Windows で確認)
結論
.claude/settings.jsonの deny にRead(./.env)を書くと、Claude の読み取りツールとcat .envは止まりました(Windows 11 で確認)。- 一方で、Python スクリプトの中で
.envを開く読み方は止まりませんでした。これは不具合ではなく、公式ドキュメントに書かれている仕様です。 - deny は「うっかり読む」を防ぐ網として使い、本物の API キーなどは作業フォルダに置かない運用と組み合わせます。
なぜ .env が気になるのか
.env は、API キーや接続先のパスワードなどを書いておくファイルとして、多くのプロジェクトで使われています。Claude Code(Anthropic 社が提供する、ターミナルで動く AI コーディングエージェント)は作業フォルダのファイルを読みながら作業するので、そのフォルダに .env があると、内容が会話に入る可能性があります。
Claude Code には、設定ファイル settings.json の権限ルールで特定の操作を止める仕組みがあります。CLAUDE.md(起動時に読まれる説明書きのファイル)に「読まないこと」と書くのは AI へのお願いですが、権限ルールは Claude Code 本体が操作を止めます。ただし、止まる範囲には限りがあります。そこを確かめるために、手元の Windows で試しました。
設定の書き方
作業フォルダの .claude/settings.json に、次の禁止ルール(deny)を書きます。このファイルはプロジェクト用の設定で、Git で共有すれば同じフォルダで作業する全員に同じルールがかかります。
{
"permissions": {
"deny": [
"Read(./.env)",
"Bash(curl *)",
"Bash(git push *)"
]
}
}
公式ドキュメントでは、Read(./.env) は今のフォルダの .env を対象にする例として載っています。下の階層にある .env もまとめて対象にしたい場合は、Read(**/.env) の形が案内されています。また、執筆時点では .claudeignore というファイルを置いても効果はなく、読ませたくないものは Read の deny に書くよう説明されています。
Windows では、パスは /c/Users/… のような形に直してから照合されます。ドライブ全体の .env を対象にする場合は //c/**/.env のように書くと公式ドキュメントにあります。
Windows で試した方法
中小DXラボで、次の環境を使って試しました(2026年10月13日)。
- Windows 11、Git for Windows(Git Bash)
- Claude Code 2.1.296
claude -p(画面を開かずに1回だけ頼むモード)で、--allowedTools "Read,Bash"を付けて読み取りとコマンドの実行を許可したうえで、上の deny を効かせる
作業用のフォルダに、テスト用の値だけを書いたダミーの .env と、その .env を開いて表示するだけの Python スクリプトを置きました。本物のキーは使っていません。そのうえで、4つの操作を頼みました。
確認結果
| 頼んだこと | 結果 |
|---|---|
Claude の読み取りツールで .env を読む | 止まった(権限設定で拒否された、と返ってきた) |
cat .env を実行する | 止まった |
curl で外部にアクセスする | 止まった |
Python スクリプトの中で .env を開いて表示する | 読めてしまった(ダミーの値がそのまま表示された) |
確認したのは上の環境と4つの操作だけです。PowerShell で実行される場合や、ほかのバージョンでの動きは個別には試していません。
止まらない読み方と、その理由
執筆時点の公式ドキュメントでは、Read と Edit の deny が効く範囲が次のように説明されています(要約)。
- Claude の組み込みのファイルツールには効く
cat、head、tailなど、Claude Code がファイルを読むコマンドと認識できるものには効く- Python や Node のスクリプトが自分でファイルを開くような、間接的な読み書きには効かない
- ファイル名を書かずに読むコマンド(そのフォルダで
grep -rを実行する、など)にも効かない
コマンドのルールも同じ考え方です。Bash(curl *) は curl https://… という書き方は止めますが、/usr/bin/curl のようにパスで呼ぶ書き方や、sh -c '…' で包む書き方には当たらないとされています。
つまり deny は「どんな方法でも読ませない壁」ではなく、ふつうの操作を止める網です。社内で説明するときも、この違いを先に伝えておくと、あとで「設定したのに読めた」と問題になるのを防げます。
Windows で押さえておきたいこと
- Git for Windows の有無で実行のされ方が変わる: 公式ドキュメントでは、Git for Windows がない場合、コマンドは PowerShell で実行されるとされています。PowerShell 向けには
PowerShell(Remove-Item *)のような形のルールがあり、Bash のルールと同じ書き方です。PowerShell で使う場合は、そちらの形のルールも合わせて検討してください。 - OS のレベルで止める仕組み(サンドボックス)は Windows ネイティブでは使えない: 執筆時点の公式ドキュメントでは、サンドボックスは macOS・Linux・WSL 2 で動き、Windows で使うには WSL 2 の中で Claude Code を動かすと説明されています。
社内で使うときの考え方
- 本物の秘密情報を作業フォルダに置かない: API キーなどは Claude Code を起動するフォルダの外で管理し、必要なときだけ環境変数として渡します。置かなければ、読まれる心配もありません。
- deny は網として共有する:
.env、秘密情報のフォルダ、外部送信のコマンドを deny に入れ、プロジェクトの.claude/settings.jsonとして配ります。ふだんの操作でうっかり読む・送るのを防ぐ効果はあります。 - 組織で統一するなら管理用の設定を検討する: 公式ドキュメントでは、利用者が上書きできない管理用の設定(managed settings)で deny を配る方法が案内されています。
- 配る前にダミーで確かめる: テスト用の値だけを入れた
.envを置き、止まること・止まらないことを手元で一度確かめてから配ります。
よくある質問
.gitignore に .env を書いていれば、読まれませんか
.gitignore は Git の管理から外す設定で、Claude Code に読ませない設定とは別です。コミットしたくないものは .gitignore に、読ませたくないものは deny に、それぞれ書きます。
Python 経由でも止めたい場合はどうすればよいですか
deny では止まりません。公式ドキュメントでは、すべてのプロセスからのアクセスを OS のレベルで止める方法としてサンドボックスが案内されています。Windows では WSL 2 の中で使う形になります。いちばん手軽なのは、本物の値を作業フォルダに置かないことです。
deny を書いたのに効いていないように見えます
置き場所やパスの書き方が違っていることがあります。Claude Code の中で /permissions を実行してルールが読み込まれているかを見て、つまずき早見表 で症状から原因を探してみてください。
deny のルールをチェックだけで作る
この記事のルールは、Claude Code 権限設定(settings.json)ジェネレーター で、チェックを付けるだけで出力できます。実機で止まると確かめたルールには印を付けています。設定したのに思ったとおりに動かないときは、つまずき早見表 も使えます。
参考(公式ドキュメント・執筆時点)
- Configure permissions(Read のルールの書き方、効かない範囲、PowerShell のルール)
- Sandboxing(対応している環境)
- Set up Claude Code(Windows で Git for Windows がない場合の動き)
- Claude Code settings(設定ファイルの置き場所、管理用の設定)
仕様は変わることがあります。社内に配る前に、公式ドキュメントで最新の情報を確認し、手元でも動きを確かめてください。