3つの中で最も安全なのは?
ドキュメントは順位付けをしていない。手放すもので見ると、範囲が最小なのは--no-sandbox(ブラウザ自身の分離のみ)、最大なのはallowNestedUserNamespaces(警告ボックスで、コードがサンドボックス外で動きうると述べる)。この順位は私の判断だ。
excludedCommandsにplaywrightを入れたのに効きません。なぜ?
多くはパターンの問題だ。ドキュメントによれば、パターンは *で終え、呼び出し内の全コマンドが一致し、照合は呼び出しテキストで行われる。npm testの内部で呼ばれるplaywrightは対象外だ。Claudeが実際に実行するコマンドに一致させる。
チーム共有のためにプロジェクトのsettings.jsonへ書ける?
allowNestedUserNamespacesは不可で、ドキュメントはユーザー設定に置くこと、リポジトリからは有効にできないことを述べている。excludedCommandsも、サンドボックスがadmin-requiredの間はプロジェクトファイルの項目が無視される。
エンジニアではありません。これは私に関係ありますか?
テストを動かすためだけにこれらのどれかを有効にすると、セキュリティに穴が開く。3つの選択肢とそれぞれの代償を知っておけば、レビューで適切な質問ができる。
LinuxまたはWSL2のClaude Codeサンドボックス内でChromium、Playwright、rootless Podmanを動かすと、No usable sandbox!で止まることが多い。公式のサンドボックスページは3つの対処法を示しており、それぞれ手放すものが違う。本稿はその3つを並べて比較する。事実は公式のサンドボックスページとchangelogからの引用で、3つの方法を自分のマシンで検証してはいない。取捨選択の記述はドキュメントの説明に私の整理を加えたものだ。
ドキュメントによれば、LinuxとWSL2ではサンドボックス内のコマンドは既定でuser namespaceを作れず、それに依存するツールが失敗する。挙げられている症状は、ChromiumがNo usable sandbox!で終了する、unshare -U trueがOperation not permittedを出す、rootless Podmanがcannot clone: Operation not permittedを出す(またはそれ以前に自身のフォルダでread-only file systemとなって止まる)、というものだ。
ChromiumやElectronには--no-sandboxを付ける。Claude Codeのサンドボックスはそのままで、代償はブラウザが自身のサンドボックスなしでWebコンテンツを実行する点だ。自分で管理するローカルページだけを開くテストなら代償は小さく、外部URLを開くならリスクはブラウザ層にある。これは私の判断で、ドキュメントはブラウザ自身の分離を手放すとだけ述べている。
sandbox.excludedCommandsにコマンドパターンを入れると、一致したコマンドはあなたの全権限でサンドボックス外で実行される:
{
"sandbox": {
"enabled": true,
"excludedCommands": ["npx playwright test *"]
}
}
ドキュメントが挙げる、つまずきやすい規則:
*で終える。ワイルドカードのないパターンは完全一致で、dockerは引数なしのdockerにしか一致しない。npm ci && docker compose buildは、別の項目がnpm ciをカバーしない限りサンドボックス内に残る。makeターゲットが内部で呼ぶツールは対象外で、/usr/local/bin/dockerも一致しない。ブラウザの場合はブラウザではなくテストコマンドに一致させる。cd、$(...)があると、呼び出し全体がサンドボックス内に残る。ドキュメントはさらに警告している。Claudeは作業ディレクトリ内のスクリプトを編集してから実行できるが、除外されたコマンドはあなたの全権限を持つ。そのためスクリプトを走らせるコマンドを除外すると、そのスクリプトの中身もサンドボックスの外に出る。除外コマンドも通常の権限フローを通り、auto modeでは分類器が審査し、bypassPermissionsモードではaskルールが一致しない限り確認なしで実行される。
v2.1.305で追加:
{
"sandbox": {
"allowNestedUserNamespaces": true
}
}
ドキュメントは、プロジェクトの.claude/settings.jsonではなく~/.claude/settings.jsonに設定すること、リポジトリ側からは有効にできないことを述べている。利点はChromiumやElectronが自身のサンドボックスを保てることと、入れ子のbubblewrapやunshareを動かせることだ。代償は警告ボックスに書かれている。セキュリティ境界を1つ無効にすることになり、サンドボックス化されたコマンドのコードが結局サンドボックスの外で動く可能性がある。保護パスやcredentials.filesを含め、サンドボックスのどの制限にも悪意あるコマンドを止めることを期待してはいけない。auto-allowモードではそのコマンドが確認なしで実行されうる。ページはまた、unshareで始まるコマンドはexcludedCommandsの記述に関係なくサンドボックス内に残ること、この設定だけではrootless PodmanやBuildahには足りないこと(サンドボックスが他の方法でも止めるため)も述べている。
excludedCommandsを示し、それらのコマンドが全権限を持つことを受け入れる前提だ。CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1を設定している場合:ドキュメントによれば全コマンドがサンドボックス内で実行され、これらの設定は効かない。ChromiumやElectronは--no-sandboxを使い、他のツールはClaude Codeの外で自分で実行する。この順序(まず最小の範囲、次に除外、最後にnamespace)は、ドキュメントの各選択肢の説明に基づく私の推奨で、3つを比較テストした結果ではない。