AppArmorが原因かを最速で確認するには?
sysctl kernel.apparmor_restrict_unprivileged_usernsを実行する。1が返ったときだけAppArmorプロファイルが必要で、0やキーが存在しない場合は不要。これは公式ドキュメントの確認方法で、私は実行していない。
そのAppArmorプロファイルを追加すると、サンドボックス内のコマンドの権限が増えますか?
公式ドキュメントによれば増えない。プロファイルはbwrap自体にのみ適用され、サンドボックス内で実行するコマンドには適用されない。ただしシステム上のbwrapにuser namespaceの能力を与えるものなので、自分の環境のポリシーに照らして判断する。
サンドボックスが起動しないのにClaudeはコマンドを実行できる。正常ですか?
ドキュメントによれば、それが既定の挙動だ。依存関係の不足やプラットフォーム非対応のとき、Claude Codeはサンドボックスなしでコマンドを実行する。代わりに終了させるにはsandbox.failIfUnavailable: trueを設定する。
エンジニアではありません。一言でいうと?
サンドボックスは間仕切りのある部屋で、Ubuntuのセキュリティポリシーは既定では間仕切りを作ることを許さない。先に「間仕切りを作る道具」に許可を出して初めて部屋が建つ。
Ubuntu 24.04以降でbubblewrapとsocatを入れても、Claude Codeのサンドボックスが起動しないことがある。よくある原因は、AppArmorの既定ポリシーがbubblewrapに必要なuser namespaceの作成を妨げることだ。公式のサンドボックスドキュメントには専用の節があり、v2.1.310では/sandboxと起動時の警告がこの制限を名指しするようになった。本稿は公式ドキュメントに沿って確認と修正の手順を整理する。コマンドはUbuntuマシンで実行していないので、自分の環境で確認してほしい。
ドキュメントの確認方法(WSL2でも有効):
sysctl kernel.apparmor_restrict_unprivileged_userns
0が返る:この手順は不要。No such file or directoryが出る:キーが存在しないので、これも不要。1が返る:bwrapにこの権限を与えるAppArmorプロファイルを追加する。別途、/sandboxのDependenciesタブには、不足しているripgrep、bubblewrap、socat、seccompフィルターが一覧される。依存関係の確認は起動時に行われるので、パッケージを入れたらClaude Codeを再起動する。タブが見えなければ依存関係はすべて揃っている。
sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
abi <abi/4.0>,
include <tunables/global>
profile bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
include if exists <local/bwrap>
}
EOF
sudo systemctl reload apparmor
ドキュメントは、このプロファイルがbwrap自体にのみ適用され、サンドボックス内で実行するコマンドには適用されないと強調している。許可するのはサンドボックスを作る行為であり、内部のプログラムへの規則の緩和ではない。これは先に取り上げたsandbox.allowNestedUserNamespacesとは別の層だ。後者はサンドボックス内のコマンドにもuser namespaceの作成を許し、ドキュメントはセキュリティ境界を1つ無効にすると警告している。AppArmorの手順はサンドボックスを起動できるようにするだけだ。
ドキュメントによれば、既定では依存関係の不足やプラットフォーム非対応でサンドボックスが起動できない場合、Claude Codeはサンドボックスなしでコマンドを実行する。代わりに起動時に終了させるにはsandbox.failIfUnavailableをtrueにする。ドキュメントが挙げるのは依存関係の不足とプラットフォーム非対応で、AppArmorによる阻害がこれに含まれるかは明記されておらず、含まれると見なすのは私の推論だ。サンドボックスに頼るなら、AppArmorを直し、必要に応じてfailIfUnavailableを有効にし、管理者の展開ではallowUnsandboxedCommands: falseも併用することを私は勧める。またドキュメントは、ネイティブWindowsではサンドボックスが動かず、failIfUnavailableを設定するとそれらのマシンでClaude Codeが起動時に終了すると警告している。
ドキュメントのプローブの1つ:touch ~/sandbox-probeはLinuxとWSL2でRead-only file systemで失敗するはずだ(macOSではOperation not permitted)。curl --noproxy '*' https://example.comは、サンドボックスのプロキシを迂回する経路がないためCould not resolve hostで失敗するはずだ。ドキュメントはまた、失敗したコマンドをサンドボックス外で再試行しようとClaudeが提案してきたら断るよう述べる。touchが成功し、ホームディレクトリがサンドボックスの書き込み許可先でないなら、~/sandbox-probeを削除して/sandboxで確認する。
/procをマウントできず、サンドボックス内のコマンドはCan't mount proc on /newroot/proc: Operation not permittedのようなbwrapエラーで失敗する。ドキュメントの解決策はenableWeakerNestedSandbox: trueで、外側のコンテナが必要な分離をすでに提供している場合に限って使うよう警告している。新しい/procのマウントなら隠れるプロセス情報が見えてしまうためだ。Sandboxing requires WSL2と出たら、ディストリビューションがWSL1で動いている。WSL2へ更新するか、サンドボックスなしでClaude Codeを使う。wsl -l -vで確認する。これは私の整理であり公式の助言ではない。サンドボックスが起動しないときは、まず/sandboxの案内に従う。Ubuntu 24.04以降ではそのsysctlを確認する。コンテナとWSL1は別の経路なので、解決策を混ぜない。特に、サンドボックスを正常に見せるためだけにallowNestedUserNamespacesを有効にしてはいけない。それは別の問題を解く設定だ。