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 を動かすと説明されています。

社内で使うときの考え方

  1. 本物の秘密情報を作業フォルダに置かない: API キーなどは Claude Code を起動するフォルダの外で管理し、必要なときだけ環境変数として渡します。置かなければ、読まれる心配もありません。
  2. deny は網として共有する: .env、秘密情報のフォルダ、外部送信のコマンドを deny に入れ、プロジェクトの .claude/settings.json として配ります。ふだんの操作でうっかり読む・送るのを防ぐ効果はあります。
  3. 組織で統一するなら管理用の設定を検討する: 公式ドキュメントでは、利用者が上書きできない管理用の設定(managed settings)で deny を配る方法が案内されています。
  4. 配る前にダミーで確かめる: テスト用の値だけを入れた .env を置き、止まること・止まらないことを手元で一度確かめてから配ります。

よくある質問

.gitignore に .env を書いていれば、読まれませんか

.gitignore は Git の管理から外す設定で、Claude Code に読ませない設定とは別です。コミットしたくないものは .gitignore に、読ませたくないものは deny に、それぞれ書きます。

Python 経由でも止めたい場合はどうすればよいですか

deny では止まりません。公式ドキュメントでは、すべてのプロセスからのアクセスを OS のレベルで止める方法としてサンドボックスが案内されています。Windows では WSL 2 の中で使う形になります。いちばん手軽なのは、本物の値を作業フォルダに置かないことです。

deny を書いたのに効いていないように見えます

置き場所やパスの書き方が違っていることがあります。Claude Code の中で /permissions を実行してルールが読み込まれているかを見て、つまずき早見表 で症状から原因を探してみてください。

deny のルールをチェックだけで作る

この記事のルールは、Claude Code 権限設定(settings.json)ジェネレーター で、チェックを付けるだけで出力できます。実機で止まると確かめたルールには印を付けています。設定したのに思ったとおりに動かないときは、つまずき早見表 も使えます。

参考(公式ドキュメント・執筆時点)

仕様は変わることがあります。社内に配る前に、公式ドキュメントで最新の情報を確認し、手元でも動きを確かめてください。