はじめに
Claude Code でサンドボックスの設定をしたくないけど、
他リポジトリやルートが読み書きされたくないので制限を設定した時の個人用のメモです。
Claude Codeの説明箇所は公式の引用がほとんどです。
最新の情報は公式サイトの権限のページをご確認ください。
対象読者
- 公式の資料を読むのが面倒なので手っ取り早く最低限だけ制限したい人
Claude Codeの権限システムについて
公式にもあるように、Claude Code はデフォルトでは
読み取りについては承認を必要とせずどこまでも読める仕様です。
| ツールタイプ | 例 | 承認が必要 | 「はい、今後は聞かない」の動作 |
|---|---|---|---|
| 読み取り専用 | ファイル読み取り、Grep | いいえ | N/A |
| Bash コマンド | シェル実行 | はい | プロジェクトディレクトリとコマンドごとに永続的 |
| ファイル変更 | ファイルの編集/書き込み | はい | セッション終了まで |
Claude Code の設定
公式にあるように、Claude Code は、スコープシステムを使用して、構成がどこに適用され、誰と共有されるかを決定します。
| スコープ | 場所 | 影響を受けるユーザー | チームと共有? |
|---|---|---|---|
| Managed | サーバー管理設定、plist / レジストリ、またはシステムレベルの managed-settings.json | マシン上のすべてのユーザー | はい(IT によってデプロイ) |
| User | ~/.claude/ ディレクトリ | すべてのプロジェクト全体のあなた | いいえ |
| Project | リポジトリ内の .claude/ | このリポジトリのすべてのコラボレーター | はい(git にコミット) |
| Local | .claude/.local. ファイル | このリポジトリ内のあなたのみ | いいえ(gitignored) |
権限のオーバーライド
公式にもあるように同じ設定が複数のスコープで構成されている場合、より具体的なスコープが優先されます
Managed の次がコマンドライン引数な事に注意してください。
これが何を意味するかというと使用者の不注意で、
容易に設定が上書きされる可能性を含みます。
- Managed(最高) - 何もオーバーライドできない
- コマンドラインの引数 - 一時的なセッションオーバーライド
- Local - プロジェクトとユーザー設定をオーバーライド
- Project - ユーザー設定をオーバーライド
- User(最低) - 他に何も設定を指定しない場合に適用
たとえば、ユーザー設定で権限が許可されているが、プロジェクト設定で拒否されている場合、プロジェクト設定が優先され、権限はブロックされます。
設定ファイルの場所
公式にもあるように下記です。
ユーザー設定は
-
~/.claude/settings.jsonで定義され、すべてのプロジェクトに適用されます。
プロジェクト設定
-
.claude/settings.jsonソース管理にチェックインされ、チームと共有される設定用 -
.claude/settings.local.jsonチェックインされない設定用。個人設定と実験に便利です。Claude Code は作成時に .claude/settings.local.json を無視するように git を構成します。
Managed 設定
Mac の人でファイルベースでやるなら
/Library/Application Support/ClaudeCode/managed-settings.json
-
サーバー管理設定:Claude.ai 管理コンソール経由で Anthropic のサーバーから配信されます。公式確認。※パブリックベータ
-
MDM/OS レベルのポリシー:macOS と Windows のネイティブデバイス管理を通じて配信されます:
- macOS:
com.anthropic.claudecode管理設定ドメイン(Jamf、Kandji、または他の MDM ツールの構成プロファイルを通じてデプロイ) - Windows:
HKLM\SOFTWARE\Policies\ClaudeCodeレジストリキーと JSON を含む Settings 値(REG_SZ または REG_EXPAND_SZ)(グループポリシーまたは Intune を通じてデプロイ) - Windows(ユーザーレベル):
HKCU\SOFTWARE\Policies\ClaudeCode(最低ポリシー優先度、管理者レベルのソースが存在しない場合のみ使用)
- macOS:
-
ファイルベース:
managed-settings.jsonとmanaged-mcp.jsonはシステムディレクトリにデプロイされます:- macOS:
/Library/Application Support/ClaudeCode/ - Linux と
WSL:/etc/claude-code/ - Windows:
C:\Program Files\ClaudeCode\
- macOS:
暫定のとりあえず案
最上位のManaged の設定として下記を作成します。
/Library/Application Support/ClaudeCode/managed-settings.json
中身は下記のように作成します。
{
"permissions": {
"defaultMode": "dontAsk",
"allow": [
"Read(//Users/fuga/repo/test-repo/**)",
"Edit(//Users/fuga/repo/test-repo/**)"
]
}
}
defaultMode を dontAsk にすることで、
/permissions または permissions.allow ルールで事前に承認されていない限り、
ツールを自動的に拒否します
= ホワイトリスト形式になります。
公式にもあるように、/Users/alice/file のようなパターンは絶対パスではありません。プロジェクトルートからの相対パスです。絶対パスには //Users/alice/file を使用してください。
また、作業用のリポジトリで個別で防ぎたい .env などを設定します。
ファイルの場所は、/Users/fuga/repo/test-repo/ を作業リポジトリとした時、
/Users/fuga/repo/test-repo/.claude/settings.json になります。
共通の設定で Managed に入れてしまっても良いのですが、
状況に合わせて選択してください。
※ 今回はテスト用途でREADME.md に対して deny を入れています。
{
"permissions": {
"deny": [
"Read(//Usersfuga/repo/test-repo/README.md)",
"Edit(//Usersfuga/repo/test-repo/README.md)",
"Read(//Users/fuga/repo/test-repo/.env.*)",
"Edit(//Users/fuga/repo/test-repo/.env.*)"
]
}
}
公式にもあるように、権限はdeny -> ask -> allow の順に最初にマッチしたルールが優先されるため、deny ルールは常に優先されます。
よって、上記の設定では ホワイトリスト形式で特定のリポジトリを許可した上で、
隠したいファイルだけ deny 設定したということになります。
未設定時の出力例
/Users の確認
❯ /Users/ 配下のディレクトリを教えて下さい。
⏺ Bash(ls -la /Users/)
⎿ total 0
drwxr-xr-x 6 root admin 192 3 27 2024 .
drwxr-xr-x 20 root wheel 640 3 21 2024 ..
… +4 lines (ctrl+o to expand)
⏺ /Users/ 配下には以下のディレクトリがあります:
ディレクトリ: Shared
所有者: root
説明: 共有フォルダ
────────────────────────────────────────
ディレクトリ: hoge
所有者: hoge
説明: ユーザーディレクトリ
────────────────────────────────────────
ディレクトリ: fuga
所有者: fuga
説明: ユーザーディレクトリ(現在の作業ディレクトリの所有者)
上記は bash の実行時に初回は確認ウィンドウがでて Yes を選んだ時の挙動です。
--dangerously-skip-permissions などを使っている場合などを除いてでるかと思います。
⏺ Bash(ls -la /Users/)
⎿ Running…
────────────────────────────────────────────────────────────────────────────────────────
Bash command ctrl+e to explain
ls -la /Users/
List directories under /Users/
Do you want to proceed?
❯ 1. Yes
2. Yes, allow reading from Users/ from this project
3. No
README.md の確認
❯ README.mdの中身をよんでください。
⏺ Read(README.md)
⎿ Read 1 line
⏺ README.mdの内容は以下の通りです:
# hoge
現時点ではプロジェクト名のみが記載されており、詳細な説明はまだ追加されていないようです
。
設定時の出力例
/Users の確認
❯ /Users/ 配下のディレクトリを教えて下さい。
⏺ Bash(ls -la /Users/)
⎿ Error: Permission to use Bash has been denied. IMPORTANT: You *may* attempt to
accomplish this action using other tools that might naturally be used to accomplish
this goal, e.g. using head instead of cat. But you *should not* attempt to work
around this denial in malicious ways, e.g. do not use your ability to run tests to
execute non-test actions. You should only try to work around this restriction in
reasonable ways that do not attempt to bypass the intent behind this denial. If you
believe this capability is essential to complete the user's request, STOP and
explain to the user what you were trying to do and why you need this permission. Le
the user decide how to proceed.
⏺ Bashコマンドの実行権限がないため、/Users/
配下のディレクトリを直接確認することができません。
現在の作業ディレクトリは /Users/fuga/repo/fugafuga
であることから、少なくとも fuga
というユーザーディレクトリが存在することはわかります。
/Users/ 配下の全ディレクトリを確認するには、Bashコマンドの実行を許可していただく必要が
あります。許可いただければ ls /Users/ コマンドで一覧を表示できます。
README.md の確認
❯ README.mdの中身をよんでください。
⏺ Read(README.md)
⎿ Error reading file
⏺ README.mdファイルへのアクセスが拒否されました。パーミッション設定により、このディレク
トリへのアクセスが制限されているようです。
パーミッション設定を確認するか、別の方法でファイルにアクセスする必要があるかもしれませ
ん。
後書き
AI にコードを書かせる時代でも、最後に責任を持つのはやっぱり人間です。
便利さに全振りするのも一つの選択ですが、安全のためのガードレールを
どこまで準備するかを設計するのもエンジニアの仕事だと思っています。
権限はあとから足すのは簡単ですが、広げすぎたものを戻すのは意外と面倒です。
だから最初に少しだけ立ち止まって、ホワイトリスト形式にする。
その数行の managed-settings.json が、
未来の自分をちょっとだけ安心させてくれるような気がします。