結論:許可領域と秘密ファイルdenyを重ねる

Claude Code 2.1.236のmacOS sandboxでは、**/.envのようなwildcard read-denyがallowed read region内でも優先され、matching directoryの内容を含め、renameによる回避も防ぐよう修正されました。repository全体を作業対象にしながら、secret、credential、production設定だけをdenyする多層防御に使えます。ただしsecret manager、権限分離、漏えい時のrotationは別に必要です。

読者の具体的な困りごとは、Claude Codeへrepositoryを許可すると、sourceと同じtreeにある.envや秘密設定まで読める可能性を判断しにくいことです。この記事を読むと、deny pattern、適用scope、回帰test、HOLD条件を決め、安全な作業領域を設定できます。

次の行動:一つのtest repositoryで秘密ファイル候補を列挙し、.env、subdirectory、rename後の三ケースを読取拒否testへ追加してください。

公式仕様と対象範囲を確認する

公式Claude Code changelog 2.1.236はmacOS sandboxの修正として、wildcard read-deny ruleがallowed read region内で優先されること、matching directoryのcontentsも覆うこと、deny対象fileのrenameで回避できないことを明記しています。これはmacOSの変更です。Linux、WSL2、native Windowsへ同じ挙動を推測で広げず、各platformの公式sandbox文書と実機testを正本にします。

公式sandboxing文書では、sandboxがfilesystemとnetworkの境界をOS levelで実施し、macOSではbuilt-in Seatbeltを使うと説明しています。LinuxとWSL2はbubblewrapとsocatが必要で、native Windowsは非対応です。sandboxが利用できない場合に通常実行へ戻る既定動作もあるため、企業の必須gateではsandbox.failIfUnavailableを検討します。

公式settings文書の例には、Read(./.env)Read(./.env.*)Read(./secrets/**)のdeny ruleが示されています。Managed、User、Project、Localのscopeと優先順位も確認できます。秘密情報を守るruleは個人任せにせず、Managed scopeで配布し、project側が上書きできない構成を基本にします。

deny patternを四つの軸で比較する

  1. 正確なpath:Read(./.env)は明確ですが、subdirectoryや別名を取りこぼします。小さなrepositoryの最小構成に向きます。
  2. 拡張pattern:Read(./.env.*)は環境別fileを覆えますが、nested directoryを別に考える必要があります。
  3. wildcard:Read(**/.env)やsecret directory patternは深いtreeを覆えます。広すぎるdenyで必要fileまで止めないようtestします。
  4. directory deny:Read(./secrets/**)は配置規則と合わせやすく、秘密情報を専用directoryへ集約できる組織に向きます。

比較軸はcoverage、誤遮断、変更耐性、監査性です。patternを増やすだけでは、別名のcredential、certificate、SSH key、cloud設定を見落とします。まず秘密情報inventoryを作り、file名、directory、生成元、owner、rotation手順を整理します。その後、deny patternとsecret scannerを対応付けます。

denyは「読ませない」境界であり、repositoryへsecretをcommitしてよい理由にはなりません。可能ならsecret managerやruntime injectionへ移し、local fileはdummy値のexampleに置き換えます。やむを得ずlocal fileを置く場合はgitignore、filesystem permission、sandbox deny、log redactionを重ねます。

macOSで検証する7手順

  1. Claude Codeを2.1.236以降へ更新し、macOSのtest端末でversionを記録します。
  2. /sandboxを開き、sandboxが有効でresolved settingsが想定scopeから来ているか確認します。
  3. test repositoryへdummy値だけの.env、nested .envsecrets/を用意します。
  4. settingsのdenyへ正確なpath、wildcard、secret directory patternを追加します。
  5. allowed read region内から通常fileが読め、秘密fileだけ拒否されることを確認します。
  6. deny対象fileを別名へrenameする操作をtestし、内容を読めないことを確認します。
  7. 結果、version、settings scope、失敗時の挙動を監査記録へ残し、Managed配布を判断します。

testには実際のcredentialを使いません。「DUMMY_SECRET_DO_NOT_USE」のような識別可能な偽値を置き、transcript、tool output、debug logへ現れないことを確認します。拒否message自体がpathや値を過剰に表示しないかも見ます。test後はdummy fileを削除するか、fixtureとして明確に隔離します。

設定を広げる前に、通常業務への影響を測ります。build toolが.envを必要とする場合、Claude Codeに読ませるのではなく、許可されたwrapperが必要最小限の値をprocessへ渡す設計を検討します。denyを解除して解決すると、多層防御が一番必要なproduction作業で例外が常態化します。

企業チェックリストとHOLD条件

  • 2.1.236以降である
  • macOS対象と確認した
  • sandboxが有効である
  • failIfUnavailableを判断した
  • 秘密情報inventoryがある
  • dummy値でtestする
  • root .envを拒否できる
  • nested .envを拒否できる
  • directory内容を拒否できる
  • rename回避を拒否できる
  • 通常sourceは読める
  • Managed scopeを検討した
  • logへの露出を確認した
  • rotation手順がある
  • platform差を記録した

HOLD条件は、sandboxが起動していない、unsupported platform、denyの配布scopeが不明、実secretでしかtestできない、通常fileと秘密fileを分離できない、失敗時にunsandboxed実行へ進む可能性を制御できない場合です。拒否testが一つでも失敗した端末は、secretへ触れる業務に使いません。

incident時はdeny設定の修正だけで終了せず、値が読まれた可能性を評価し、credentialをrotationします。transcript、debug log、shell history、CI artifact、外部送信先を確認し、露出範囲を記録します。設定は将来の読取を防ぎますが、過去に露出したsecretを無効化する機能ではありません。

よくある質問と次の行動

permission denyだけで十分ですか?

重要な境界ですが単独では十分ではありません。secret manager、repositoryからの除外、OS権限、rotation、監査を併用します。

allowed read regionを狭める方が安全ですか?

基本は最小権限です。そのうえで作業領域内に混在する秘密fileをwildcard denyで遮断し、二層にします。

Linuxでも同じpatternを使えますか?

設定表現が似ていても、この修正はmacOS明記です。Linux sandboxの依存とresolved settingsを実機で確認してください。

修正内容は公式Claude Code changelog、隔離の仕組みは公式sandboxing、denyとscopeは公式settingsで公開直前に確認してください。

credential maskingは秘密情報を見せない設定ガイド、workspace trustは信頼判断ガイド、MCP診断のredactionはMCP秘密情報ガイドへつなげます。Miraigentの無料診断では、秘密情報inventory、sandbox scope、deny test、incident対応を整理します。