blockReadsOutsideWorkingDirectoriesで作業ディレクトリ外の読み取りを止める
Claude Codeのpermissions.blockReadsOutsideWorkingDirectoriesは、作業ディレクトリ外の読み取りを一括で塞ぐBoolean設定です。denyReadとの使い分けも示します。
Claude Codeにはpermissions.blockReadsOutsideWorkingDirectoriesという設定があります。有効にすると、Read・Grep・Glob・LSPの各ツールは作業ディレクトリの外を一切読めなくなります。denyReadやallowReadでパスを1本ずつ書く手間もいりません。1つのBooleanを立てるだけで、ホームディレクトリやマウントされたボリュームへの読み取りを一括で塞げます。
permissions.blockReadsOutsideWorkingDirectoriesとは
permissions.blockReadsOutsideWorkingDirectoriesは、セッションの作業ディレクトリの外にあるパスを、Read・Grep・Glob・LSPの4ツールに読ませなくするBoolean設定です。bypassPermissionsモードを含む、すべての権限モードで適用されます。Claude Code v2.1.257以降が必要です。
ここでいう「作業ディレクトリ」は、Claude Codeを起動したディレクトリ(プライマリ作業ディレクトリ)が基本です。これに--add-dir・/add-dir・permissions.additionalDirectoriesで追加したディレクトリが加わります。/cdでセッションを別のディレクトリへ移動すると、プライマリ作業ディレクトリ自体もそちらに切り替わります。この範囲の外を指すパスすべてが、このブロックの対象になります。/cdの移動先そのものは、Cd権限ルールで絞れます。
v2.1.287のclaude --helpでは、--add-dir <directories...>が「Additional directories to allow tool access to」と表示されます。
ただし、追加したディレクトリのすべてが「作業ディレクトリ」として数えられるわけではありません。.claude/settings.jsonのadditionalDirectoriesは、ブロックの判定では数えられません。.claude/settings.local.jsonも、gitが未追跡と報告するときを除いて同じ扱いです。git管理外のディレクトリでは、settings.local.jsonもリポジトリ設定として扱われます。読ませたいディレクトリは、ユーザー設定か--add-dir・/add-dirで足します。
Bashコマンドも対象です。Claude Codeは次のコマンドを、組み込みの読み取り専用コマンドとして認識しています。ls・cat・echo・pwd・head・tail・grep・find・wc・which・diff・stat・du・cdと、読み取り専用のgitサブコマンドです。これらは通常どのモードでもプロンプトなしで実行されますが、塞がれたパスを実際に読もうとすると、auto modeやbypassPermissionsモードでも確認プロンプトが出ます。シェルのパーサーが構造を追いきれないコマンド(cdを2回連続で行う、サブシェルを使う、など)も同様にプロンプトが出ます。この場合は、コマンドが作業ディレクトリ外のパスを名指ししていなくてもプロンプトが表示されます。ただしサンドボックス側がこのブロックを担っているときは、この確認は出ません。
設定方法 — settings.jsonに1行足すだけ
設定はsettings.jsonに次の1行を足すだけです。
{
"permissions": {
"blockReadsOutsideWorkingDirectories": true
}
}このキーのスコープは「どの設定ファイルからでも」です。ユーザー設定・プロジェクト設定・ローカル設定・managed settingsのいずれかでtrueが1つでも立っていれば、ブロックは有効になります。リポジトリにチェックインした設定ファイルは、プロジェクトに対してブロックを新たに立てられますが、他のスコープが立てたブロックを外すことはできません。既定値は未設定で、その場合は通常どおり権限モードとルールに従って読み取りが判断されます。
サンドボックスと併用する場合は、同じ設定ファイルに両方のキーをまとめられます。
{
"sandbox": {
"enabled": true
},
"permissions": {
"blockReadsOutsideWorkingDirectories": true
}
}この構成では、サンドボックス化されたBashコマンドの書き込みは作業ディレクトリ・追加ディレクトリ・一時ディレクトリに限られます。読み取りは、ホームディレクトリと/Users・/homeなどユーザーのファイルを置くルートが塞がれます。Claude自身のRead・Grep・Glob・LSPは作業ディレクトリ外を全面的に拒否するので、両者の範囲は同じではありません。差は次節の表と、後述の3条件が示しています。
ブロックが有効でも、Claude Code自身が動作に必要とするファイルは読み取れます。~/.claude/配下のスキル・プラグイン・ルール・サブエージェント・カスタムコマンド、そしてCLAUDE.mdメモリファイルです。/add-dirによる追加そのものを監査したい場合は、DirectoryAddedフックで/add-dir追加後のディレクトリを監査して取り消すが参考になります。
効果が及ぶ範囲 — ツールとサンドボックスへの影響
permissions.blockReadsOutsideWorkingDirectoriesが塞ぐ範囲は、ツールの種類によって扱いが変わります。
| 対象 | 扱い | 補足 |
|---|---|---|
| Read / Grep / Glob / LSP | 扱い作業ディレクトリ外を常に拒否 | 補足bypassPermissionsモードでも適用 |
cat等の読み取り専用Bashコマンド | 扱い塞がれたパスを読むなら常にプロンプト | 補足auto modeでも自動承認されない |
| パーサーが追えないBashコマンド | 扱い常にプロンプト | 補足外部パスを指定していなくても発生 |
| サンドボックス化コマンドのホーム・マウントボリューム読み取り | 扱いサンドボックス有効時に追加で拒否 | 補足~/.gitconfig等のグローバルgit設定は開け直される |
この設定がサンドボックスと組み合うと意味が大きくなります。サンドボックス化されたBashコマンドの既定の読み取り範囲は、いくつかの拒否ディレクトリを除いてコンピューター全体に及びます。~/.aws/credentialsや~/.ssh/のような認証情報ファイルも、既定ではこの広い読み取り範囲に含まれます。書き込みは作業ディレクトリ・追加ディレクトリ・一時ディレクトリに限られる一方、読み取りだけは既定でほぼ無制限に開いている、という非対称な構成です。permissions.blockReadsOutsideWorkingDirectoriesを有効にすると、サンドボックス側にも読み取り拒否が加わります。拒否されるのは、作業ディレクトリ外にあるホームのほか/Users・/home・/root・/Volumes・/mnt・/media・/run/media・/srvといった、ユーザーのファイルを置くルートです。そのうえで、作業ディレクトリ、Claude Codeが作るworktree、セッションの一時ディレクトリ、~/.claudeのうちスキルやプラグインなどコマンドが必要とする部分を開け直します。作業ディレクトリがリンクされたgit worktreeのときは、リポジトリ共通の.gitディレクトリもサンドボックス化コマンドから読み書きできます。リポジトリ設定のallowReadとallowWriteの項目は、ブロック中は数えられません。
gitの動作に必要なグローバル設定は例外で、開け直されます。対象は~/.gitconfigと、$XDG_CONFIG_HOME/git(既定は~/.config/git)のconfig・ignore・attributesです。[include]・[includeIf]・core.excludesFile・core.attributesFileで名指しされたファイルも含まれます。サンドボックス化コマンドが書き込める場所にあるファイルは、シンボリックリンク経由を含めて開け直されません。個別のツールがどうしても必要とする場合は、sandbox.filesystem.allowReadでそのパスだけ再度開けます。サンドボックスとの組み合わせ方はClaude Codeの制限モード(--restricted)の使い方でも扱っています。
サンドボックスが対応していないコマンドは、dangerouslyDisableSandboxを使ってサンドボックス外で再試行されることがあります。再試行はサンドボックスを経由しないため、通常の権限フローに戻ります。permissions.blockReadsOutsideWorkingDirectoriesが有効なときは、承認が要る再試行がauto modeの分類器評価に回らず、確認プロンプトに切り替わります。allowルール(例: Bash(curl *))に一致する再試行は、プロンプトなしでサンドボックス外で実行されます。承認が要る再試行に限って、作業ディレクトリ外の読み取りがサンドボックスの外に出た瞬間だけ無審査で通る抜け道を塞ぎます。
denyRead/allowReadで個別に書く場合との使い分け
止める場所が違う2つの設定
denyRead / allowRead
OSのサンドボックス境界で動きます。サンドボックス化されたコマンドが起動するkubectlやterraformのようなサブプロセスの読み取り範囲を、パスの配列で細かく制御します。
blockReadsOutsideWorkingDirectories
Claude自身のファイル読み取りツールを直接止めます。サンドボックスが有効かどうかに関係なく効き、サンドボックスが有効なときはサンドボックス化されたコマンドの読み取りも塞ぎます。
| 用途 | おすすめ | 理由 |
|---|---|---|
| 作業ディレクトリの内外を単純に2分割したい | おすすめ◎ blockReadsOutsideWorkingDirectories | 理由Boolean1つで完結し、パスの列挙が要らない |
| 業務ディレクトリごとに例外を分けたい | おすすめ◎ denyRead/allowRead | 理由パスを個別に足し引きできる |
| 組織の許可パスだけに固定したい | おすすめ◎ allowManagedReadPathsOnlyを併用 | 理由開発者側のallowRead追記を無視できる |
パスごとの例外を管理設定に固定する構成は、Claude CodeのallowManagedReadPathsOnlyで読み取り再許可を管理設定に限定するで扱っています。単純な内外分離だけで足りるなら、permissions.blockReadsOutsideWorkingDirectoriesのほうが設定は少なく済みます。
自動モードの初回プロンプトから有効化する
permissions.blockReadsOutsideWorkingDirectoriesをオフのまま使っていても、auto modeでは作業ディレクトリ外への最初の読み取りで一度だけプロンプトが出ます。ClaudeがRead・Grep・Globのいずれかを作業ディレクトリ外のパスに初めて使ったタイミングです。
選択肢は4つで、保存されるかどうかが違います。
初回プロンプトの4つの選択肢
Yes, and keep allowing any reads outside the working directories
読み取りは実行されます。以降も作業ディレクトリ外の読み取りは従来どおり動き、答えが記録されるのでプロンプトは二度と出ません。
No, and block reads outside the working directories from now on
読み取りは拒否され、ユーザー設定に
permissions.blockReadsOutsideWorkingDirectoriesがtrueで書き込まれます。以降のすべてのセッション・すべての権限モードで、ファイルツールが同じ読み取りを拒否します。No, and ask again next time
読み取りは拒否されますが、何も保存されません。次に作業ディレクトリ外を読もうとすると、また同じプロンプトが出ます。
Yes, but ask again next time
読み取りは実行されますが、何も保存されません。次の作業ディレクトリ外の読み取りで、また確認されます。
このプロンプトは、非対話の-p実行とバックグラウンドセッションでは出ず、読み取りはそのまま実行されます。あとで特定のパスを読ませたくなったら、/add-dirでそのディレクトリを追加するか、設定自体を削除します。
バージョンごとの挙動の変化
permissions.blockReadsOutsideWorkingDirectoriesは追加後もいくつかの修正を経ています。
| バージョン | 日付 | 変更点 |
|---|---|---|
| v2.1.257 | 日付2026年9月1日 | 変更点追加。auto modeの初回プロンプトとブロックの選択肢 |
| v2.1.260 | 日付2026年9月3日 | 変更点修正。macOSでサンドボックス化gitがユーザーのgit設定とworktree分離サブエージェント自身のcheckoutを見失っていた不具合 |
| v2.1.271 | 日付2026年9月14日 | 変更点修正。cdを2回連続で行う・サブシェルを使う・cdとgitを連鎖させる、といったBashコマンドがbypassモードとauto modeでプロンプトを飛ばしていた不具合 |
| v2.1.273 | 日付2026年9月15日 | 変更点修正。パーサーが解析しきれないBashコマンドがプロンプトを飛ばす不具合、リポジトリ設定由来のメモリディレクトリがブロック下でも読み込まれていた不具合 |
| v2.1.281 | 日付2026年9月23日 | 変更点追加。Claude Desktop向けgatewayのdesktopポリシーブロックがこのキーを認識するように |
読めない・読めてしまうときの切り分け
症状ごとに、原因として公式に書かれているものを並べます。
ファイルツールとサンドボックスで効き方が分かれる条件
Claudeのファイルツールには効く
サンドボックスの設定にかかわらず、Read・Grep・Glob・LSPは作業ディレクトリ外を拒否し続けます。次の3条件はいずれも、サンドボックス化されたコマンド側にだけ影響します。
サンドボックス側には効かない
sandbox.filesystem.disabledでファイルシステム分離を切っている場合。allowManagedReadPathsOnlyを設定している場合。または起動したディレクトリのパスに*・?・[といったglob文字が含まれる場合です。
ほかにも、症状別に次の挙動があります。
- サンドボックス内のgitがトークンまで読んでしまう:
~/.gitconfigなどは開け直されます。http.extraHeaderのトークンのようなシークレットが入っていると、サンドボックス化されたコマンドにも見えます。その場合はsandbox.filesystem.denyReadにそのパスを足します。denyReadの項目は、開け直しより常に優先されます。 - 自動メモリが動かない:
autoMemoryDirectoryの値がプロジェクトの.claude/settings.json由来のときは、そのディレクトリから自動メモリが読み込まれず、書き込みもされません。信頼済みの.claude/settings.local.json由来のときも同じです。 - Linux・WSL2でgit設定が効かない: 設定ファイルがシンボリックリンクだと、そのパスのままでは読めないことがあり、
gitは設定なしで動きます。~/.git-credentialsと$XDG_CONFIG_HOME/git/credentialsは塞がれたままです。
外し方と、外せないケース
1つのファイルでfalseにしても外れません。組織のmanaged settingsでtrueにされている場合、開発者側で戻す手段はありません。
ブロックを外す手順
- 1
キーを持つファイルを探す
ユーザー設定・プロジェクト設定・ローカル設定・managed settingsのそれぞれで
blockReadsOutsideWorkingDirectoriesを検索します。 - 2
すべてから消す
falseにするだけでは足りません。1つでもtrueが残っていれば、ブロックは有効のままです。消し終えたら、新しいセッションを始めます。
作業ディレクトリに追加できないパスもあります。\\server\shareのようなUNC共有など、ほとんどのネットワークパスは--add-dirで追加できません。パスの存在確認自体がそのホストへの通信を発生させるためです。Windowsでは、共有をドライブレターにマップしたうえで、そのドライブを起動時の--add-dirに渡します。
まとめ
作業ディレクトリの内外を分けるだけならこの設定1つで足り、ディレクトリごとの例外が要るならdenyRead/allowReadの領分です。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。