Claude Code の blockReadsOutsideWorkingDirectories で作業ディレクトリ外の読み取りを拒否してみた

Claude Code の blockReadsOutsideWorkingDirectories で作業ディレクトリ外の読み取りを拒否してみた

2026.10.03

Claude Code v2.1.257(2026-09-01)で permissions.blockReadsOutsideWorkingDirectories という設定が追加されました。

これは作業ディレクトリ外のファイル読み取りを、権限モードによらず拒否する設定です。

Claude Code に作業ディレクトリ外のファイルを読ませたくないときに便利そうです。

今回はこの設定を検証してみました。

permissions.blockReadsOutsideWorkingDirectories とは

公式ドキュメントには次のように書かれています。

permissions.blockReadsOutsideWorkingDirectories | All settings | Claude Code Docs

Make Claude's file tools refuse reads outside your working directories in every permission mode, including bypassPermissions. Claude Code denies Read, Grep, Glob, and LSP calls on those paths and tells Claude to ask you to add the directory with /add-dir.

ポイントは以下です。

  • bypassPermissions を含むすべての権限モードで、作業ディレクトリ外の読み取りを拒否する
  • 拒否するのは Read / Grep / Glob / LSP の呼び出しで、拒否時は /add-dir でディレクトリを追加するよう Claude に伝える
設定例: .claude/settings.local.json
{
  "permissions": {
    "blockReadsOutsideWorkingDirectories": true
  }
}

組み込みツールだけでなく、Bash コマンドによる読み取りも対象です。sandbox が無効なら確認プロンプトが出て、有効なら OS が拒否します。

検証結果のまとめ

記事執筆時点の最新バージョンのClaude Code 2.1.287で検証しました。

結論、blockReadsOutsideWorkingDirectories を true にすると、Read ツールは作業ディレクトリ外のファイルを読めなくなります。Bash は sandbox を有効にすると読めなくなり、sandbox を使わない場合は確認プロンプトで承認すれば読めます。

blockReadsOutsideWorkingDirectories を true にしたときの挙動は、読み取り手段によって変わります。

各読み取り手段で作業ディレクトリ外のファイルを Claude Code が読めるか表にまとめました。

「承認の余地なし」は、確認プロンプトが出ずに読めない場合を指します。権限モードは auto で検証しました。

読み取り手段 false(未設定) true
Read ツール 読める 読めない(承認の余地なし)
Bash(sandbox 無効) 読める 承認すれば読める(確認プロンプトが出る)
Bash(sandbox 有効、allowUnsandboxedCommands: false) 読める 読めない(OS が拒否。承認の余地なし)

true のときに作業ディレクトリ外のディレクトリを読めるようにする方法と、その結果は次のとおりです。

設定する場所 Read ツール Bash(sandbox 有効)
/add-dir(そのセッションのみ) 読める 読める
user 設定の additionalDirectories 読める 読める
local 設定の additionalDirectories 読めない 読めない
user 設定の sandbox.filesystem.allowRead 読めない 読める
local 設定の sandbox.filesystem.allowRead 読めない 読めない

local 設定の additionalDirectories は、settings.local.json を git が ignored(.gitignore で除外)と判定している状態では、Read ツールでも Bash でも反映されませんでした。untracked(未追跡)と判定している状態でも、Read ツールでは反映されませんでした。/add-dir の確認画面で「Yes, and remember this directory」を選ぶと、この local 設定に保存されます。

sandbox.filesystem.allowRead は、settings.local.json を git が ignored と判定している状態でも、untracked(未追跡)と判定している状態でも、反映されませんでした。user 設定(~/.claude/settings.json)に書くと反映されました。

Read ツール経由の読み取り

作業ディレクトリ外のファイルへのReadツールの挙動を確認してみます。

テスト用に次のフォルダを作成しました。

~/blog-test/
├── project/        # 作業ディレクトリ
└── outside/        # 作業ディレクトリ外
    └── secret.txt  # 中身は hoge

Claude Codeの設定がデフォルトの状態で、作業ディレクトリ project でClaude Codeを開いて以下のプロンプトを実行しました。

プロンプト
~/blog-test/outside/secret.txt を Read ツールで読んで

以下の通り応答があり問題なく読み込めました。

~/blog-test/outside/secret.txt の内容です。

hoge

1行のみのファイルです。

blockReadsOutsideWorkingDirectories: true にして同じプロンプトを実行してみます。

作業ディレクトリ project 配下に、Claude Code の設定ファイルを配置します。

~/blog-test/
├── project/
│   └── .claude/
│       └── settings.local.json  # 設定ファイル
└── outside/
    └── secret.txt
.claude/settings.local.json
{
  "permissions": {
    "blockReadsOutsideWorkingDirectories": true
  }
}

作業ディレクトリ project でClaude Codeを開いて先ほどと同様のプロンプトを実行しました。

以下の通り、ファイルの読み込みを拒否されました。

~/blog-test/outside/secret.txt は読めませんでした。作業ディレクトリ(<PROJECT_PATH>)の外にあり、permissions.blockReadsOutsideWorkingDirectories の設定で読み取りがブロックされています。

次のどちらかで読めるようになります。
- /add-dir <OUTSIDE_PATH> でそのディレクトリを作業対象に追加する
- 設定 permissions.blockReadsOutsideWorkingDirectories を外す

どちらかを済ませたら、もう一度 Read で読みます。

権限モード auto , plan , manual , accept edits どれで試しても同じく拒否されました。私の環境では検証できませんでしたが、ドキュメントには bypassPermissions モードでも拒否されるとあります。

ドキュメントには、スキルやプラグイン、~/.claude/ 配下の CLAUDE.md など Claude Code 自身が必要とするファイルは読めると書かれています。

permissions.blockReadsOutsideWorkingDirectories | All settings | Claude Code Docs

Files Claude Code itself needs stay readable, such as your skills, plugins, rules, agents, commands, and the CLAUDE.md memory file under ~/.claude/.

blockReadsOutsideWorkingDirectories: true の状態で今の作業ディレクトリ~/blog-test/projectから~/.claude/を読み込めるか確認してみます。

プロンプト
~/.claude/CLAUDE.md の先頭5行を Read ツールで読んで。
その後、~/.claude/settings.json の先頭5行も Read ツールで読んで。

CLAUDE.md は読めましたが、settings.json は拒否されました。

~/.claude/CLAUDE.md の先頭5行は読めました。
(中略)
~/.claude/settings.json は読めませんでした。permissions.blockReadsOutsideWorkingDirectories の設定により、作業ディレクトリ(<PROJECT_PATH>)の外にあるファイルの読み取りがブロックされています。

読むには、次のどちらかが必要です。
- /add-dir ~/.claude で ~/.claude を作業ディレクトリに追加する
- permissions.blockReadsOutsideWorkingDirectories の設定を外す

~/.claude配下でもsettings.json のように、ドキュメントの例に挙がっていないファイルは拒否されました。

add-dir と additionalDirectories で追加する

拒否メッセージの案内どおり、/add-dir で作業ディレクトリ外のディレクトリを作業ディレクトリに追加してみます。

プロンプト
/add-dir <OUTSIDE_PATH>

確認画面で選べるのは次の3つです。

    1. Yes, for this session:今のセッションだけ追加する
    1. Yes, and remember this directory:追加して、次回以降も覚える
    1. No:追加しない

7x53787uvjDY_png__2562×470_.png

まず1を選んで、読み込みを試します。想定どおり読めました。

プロンプト
~/blog-test/outside/secret.txt を Read ツールで読んで
~/blog-test/outside/secret.txt の内容です。

hoge

1行のみのファイルです。

毎回 /add-dir するのは手間なので、2を選んで永続化も試しました。保存先は local 設定(.claude/settings.local.json)で、additionalDirectories が追加されました。

.claude/settings.local.json
 {
   "permissions": {
     "blockReadsOutsideWorkingDirectories": true,
+    "additionalDirectories": [
+      "<OUTSIDE_PATH>"
     ]
   }
 }

ところが、この状態で Read を試すと拒否されました。

~/blog-test/outside/secret.txt は読めませんでした。permissions.blockReadsOutsideWorkingDirectories の設定で、作業ディレクトリ(<PROJECT_PATH>)の外にあるファイルの読み取りがブロックされています。

次のどちらかで読めるようになります。

- /add-dir <OUTSIDE_PATH> を実行して、ディレクトリを追加する
- 設定から permissions.blockReadsOutsideWorkingDirectories を外す

この設定を回避するために、Bash の cat などで代わりに読むことはしません。対応したら、もう一度お知らせください。

ドキュメントには、次のように書かれています。

permissions.blockReadsOutsideWorkingDirectories | All settings | Claude Code Docs

Directories you add with --add-dir, /add-dir, or additionalDirectories in your user or managed settings count as working directories for the block. Directories added only in repository settings don't count: those in .claude/settings.json, and those in .claude/settings.local.json unless git reports that file as untracked.

blockReadsOutsideWorkingDirectories が有効なときに作業ディレクトリとして扱われる追加ディレクトリは、次のものです。

  • --add-dir や /add-dir で追加したもの
  • user 設定か管理設定の additionalDirectories に書いたもの

プロジェクトの設定(.claude/settings.json)に書いたものは、作業ディレクトリとして扱われません。.claude/settings.local.json も、git が untracked と判定している場合を除き、同じ扱いです。

手元の settings.local.json は、全体の gitignore で除外されており、untracked ではなく ignored の状態でした。そこで、.gitignore で除外を打ち消して git status が untracked(??)になる状態にして、同じプロンプトを実行しました。

結果は同じで、Read ツールで読めませんでした。ドキュメントの記載では untracked なら作業ディレクトリとして扱われますが、手元では local 設定の additionalDirectories は反映されませんでした。

そこで、user 設定(~/.claude/settings.json)の additionalDirectories に追加しました。

~/.claude/settings.json
 {
   "permissions": {
+    "additionalDirectories": [
+      "<OUTSIDE_PATH>"
+    ]
   }
 }

この状態で、先ほどと同じプロンプトで Read を試すと、今度は読めました。

~/blog-test/outside/secret.txt の中身は次の1行です。

hoge

Bash 経由の読み取り(sandbox 無効)

Bash コマンドで読む場合も試します。まず sandbox を使わない状態で確認します。

まず設定なし(blockReadsOutsideWorkingDirectories を未設定)、権限モード auto で、Bash の cat を試しました。

プロンプト
Bash で cat ~/blog-test/outside/secret.txt を実行して。Read ツールは使わないで。
cat ~/blog-test/outside/secret.txt の出力は次のとおりです。

hoge

確認プロンプトは出ず、そのまま読めました。ドキュメントにも、blockReadsOutsideWorkingDirectories が無効な auto モードでは、作業ディレクトリ外の読み取りが確認なしで実行されるとあります。

Choose a permission mode | Claude Code Docs

While permissions.blockReadsOutsideWorkingDirectories is off, file reads run without a prompt in auto mode, including reads outside the working directories.

blockReadsOutsideWorkingDirectories: true にして、同じプロンプトを実行しました。

今度は確認プロンプトが出ました。画面には次のメッセージと、Yes / No の選択肢が表示されています。

確認プロンプトの画面

Reads outside the working directories are blocked (permissions.blockReadsOutsideWorkingDirectories). Add the directory with /add-dir, or remove that setting.

Do you want to proceed?

Read ツールは承認の余地なく拒否されましたが、Bash の cat は確認プロンプトになります。ドキュメントにも、blockReadsOutsideWorkingDirectories が有効なとき、ファイルを読む Bash コマンドは auto や bypassPermissions でも確認プロンプトの対象になるとあります。

Choose a permission mode | Claude Code Docs

Reads outside the working directories while permissions.blockReadsOutsideWorkingDirectories is on: recognized file-reading Bash commands prompt even in auto mode and bypassPermissions mode, and so does any unsandboxed retry that needs approval to run outside the sandbox.

Yes を選ぶと cat が実行され、secret.txt の中身が表示されました。

cat ~/blog-test/outside/secret.txt の出力は次の1行でした。

hoge

Bash の cat では、blockReadsOutsideWorkingDirectories は読み取りを禁止するのではなく、承認を求める設定になります。承認すれば作業ディレクトリ外のファイルも読めます。

Bash 経由の読み取り(sandbox 有効)

sandbox を有効にして試します。まず blockReadsOutsideWorkingDirectories を false のまま、.claude/settings.local.json に sandbox を追記しました。

.claude/settings.local.json
 {
   "permissions": {
     "blockReadsOutsideWorkingDirectories": false
-  }
+  },
+  "sandbox": {
+    "enabled": true,
+    "allowUnsandboxedCommands": false
+  }
 }

enabled で sandbox を有効にします。allowUnsandboxedCommands を false にすると、sandbox でコマンドが失敗したときに、Claude が sandbox の外で再実行することを許可しません。

新しいセッションで /sandbox を実行すると、モードが Sandbox BashTool, with auto-allow になっていて、有効になっていることを確認できました。

/sandbox の実行結果

設定なし・sandbox 有効の状態で、作業ディレクトリ外のファイルを cat で読むプロンプトを実行します。

プロンプト
Bash で cat ~/blog-test/outside/secret.txt を実行して。Read ツールは使わないで。
cat ~/blog-test/outside/secret.txt を実行した結果、出力は hoge でした。

確認プロンプトは出ず、作業ディレクトリ外のファイルが読めました。sandbox は書き込みを作業ディレクトリ配下などに絞りますが、既定では読み取りを制限しません。

次に blockReadsOutsideWorkingDirectories を true に変えて、同じプロンプトを実行します。

.claude/settings.local.json
 {
   "permissions": {
-    "blockReadsOutsideWorkingDirectories": false
+    "blockReadsOutsideWorkingDirectories": true
   },
   "sandbox": {
     "enabled": true,
     "allowUnsandboxedCommands": false
   }
 }
cat ~/blog-test/outside/secret.txt は実行しましたが、サンドボックスに拒否されました(Operation not permitted)。

このセッションのサンドボックスは /Users/<USER> 配下の読み取りを拒否しています。例外は作業ディレクトリ <PROJECT_PATH> などの許可済みパスだけで、~/blog-test/outside/ はそこに含まれません。dangerouslyDisableSandbox もこのセッションでは無効です。回避する方法は取っていません。

sandbox 無効のときは確認プロンプトが出ましたが、今回は出ずに、OS が読み取りを拒否しました。確認プロンプトで Yes を選べば読めた sandbox 無効の場合と違い、承認を求められることもありません。

ドキュメントには、sandbox 内のコマンドについて次のように書かれています。

permissions.blockReadsOutsideWorkingDirectories | All settings | Claude Code Docs

When sandboxing is on, the block also covers sandboxed commands. Claude Code denies them read access to your home directory and to the other roots that hold user files: /Users, /home, ...

blockReadsOutsideWorkingDirectories が有効なとき、sandbox 内のコマンドはホームディレクトリなどの読み取り権限を失います。今回の cat は、この権限がないために OS に拒否されたと考えられます。

sandbox 内で読めるディレクトリを追加する

以下の3つの方法で読み取りディレクトリを追加できることを確認しました。

  • /add-dir
  • ユーザー設定(~/.claude/settings.json)にpermissions.additionalDirectories 追加
  • ユーザー設定(~/.claude/settings.json)にsandbox.filesystem.allowRead 追加

まず、/add-dir で追加した場合を試します。1(今のセッションだけ)を選びました。

プロンプト
/add-dir <OUTSIDE_PATH>
Added <OUTSIDE_PATH> as a working directory for this session · /permissions to manage

同じセッションで、cat のプロンプトを実行すると、読めました。

プロンプト
Bash で cat ~/blog-test/outside/secret.txt を実行して。Read ツールは使わないで。
cat ~/blog-test/outside/secret.txt の出力は hoge でした。

次に、user 設定(~/.claude/settings.json)の additionalDirectories に追加します。

~/.claude/settings.json
 {
   "permissions": {
+    "additionalDirectories": [
+      "<OUTSIDE_PATH>"
+    ]
   }
 }

新しいセッションで、同じプロンプトを実行します。

プロンプト
Bash で cat ~/blog-test/outside/secret.txt を実行して。Read ツールは使わないで。
cat ~/blog-test/outside/secret.txt の出力は次の通りです。

hoge

読めました。additionalDirectories に追加したディレクトリは、sandbox 内のコマンドからも読めます。

次に、additionalDirectories を外して、sandbox.filesystem.allowRead に追加します。

~/.claude/settings.json
 {
-  "permissions": {
-    "additionalDirectories": [
-      "<OUTSIDE_PATH>"
-    ]
-  }
+  "sandbox": {
+    "filesystem": {
+      "allowRead": [
+        "<OUTSIDE_PATH>"
+      ]
+    }
+  }
 }

もう一度、新しいセッションで同じプロンプトを実行します。

プロンプト
Bash で cat ~/blog-test/outside/secret.txt を実行して。Read ツールは使わないで。
cat ~/blog-test/outside/secret.txt を Bash で実行しました。出力は次のとおりです。

hoge

sandbox.filesystem.allowRead だけでも読めました。

同じ設定で、Read ツールでも読めるかを試しました。

プロンプト
~/blog-test/outside/secret.txt を Read ツールで読んで
Read ツールでは読めませんでした。~/blog-test/outside/secret.txt は作業ディレクトリ(<PROJECT_PATH>)の外にあります。そのため、permissions.blockReadsOutsideWorkingDirectories の設定でブロックされました。

sandbox.filesystem.allowRead は、sandbox 内のコマンドの読み取りだけを開きます。Read ツールには効きません。

sandbox.filesystem.allowRead を local 設定(.claude/settings.local.json)に書いた場合も試しました。settings.local.json が全体の gitignore で除外された状態(ignored)でも、.gitignore で除外を打ち消して git status が untracked(??)になる状態でも、cat は Operation not permitted で拒否されました。allowRead のパスを ~/ 始まりではなく絶対パスで書いても、同じ結果でした。

cat ~/blog-test/outside/secret.txt は実行できませんでした。サンドボックスに拒否され、Operation not permitted で終了コード 1 になりました。

ドキュメントには、blockReadsOutsideWorkingDirectories が有効な間、リポジトリ設定の sandbox.filesystem.allowRead は反映されないとあります。

sandbox.filesystem.allowRead | All settings | Claude Code Docs

Claude Code merges entries across every settings file the session loads unless allowManagedReadPathsOnly is set, and leaves out entries from repository settings while permissions.blockReadsOutsideWorkingDirectories is on.

project 設定(.claude/settings.json)に書いた場合も拒否されました。今回の検証では、local 設定が反映されなかった理由をドキュメントから説明できていません。確実に反映されたのは user 設定です。

おわりに

Read ツールの読み取りを止めるだけなら、true にするだけで済みました。Bash も止めたい場合は sandbox の併用が必要です。

読ませたいディレクトリは、今回の検証で確実に反映された user 設定に書く形が良さそうです。


Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AI白書

関連記事