はるさめ.dev

Claude Code の Sandbox 機能を有効化

に公開

※ 本記事の執筆、修正、校閲に AI を使用しています。

背景

現職では元々 AI 活用の一環として Cursor を導入していましたが、コーディングエージェントはメンバーによってツールがバラバラでした。 そのため、チームで特定のコーディングエージェントについて設定の議論などをしていませんでした。

チームの「開発スピード向上」、「開発工数を削減」を目的として、コーディングエージェントの統一を推進し、 共通のツールとして Claude Code を導入していくことにしたため、今回「セキュリティの担保」をした上で「開発効率の維持・向上」のために Claude Code の Sandbox を有効化する提案をしました。

Claude Code Sandbox とは

Claude Code Sandbox は隔離した環境で Bash ツールを実行する仕組みです。想定外のファイルへのアクセスやネットワークアクセスを防ぎ、意図しないファイルの削除や悪意のあるサイトへのアクセスなどを防止することでセキュリティの向上を図れます。

また、Sandbox が有効な状態では Bash ツール実行時の承認が不要になるため、以下の課題を解決できます。

  • 承認疲れの防止:繰り返しの「承認」クリックによって、承認内容への注意が低下するリスクを回避できます
  • 生産性の向上:承認による継続的な中断がなくなり、開発ワークフローがスムーズになります
  • 自律的な動作の実現:Claude Code が承認待ちで停止せず、効率的に動作できるようになります

ref: サンドボックス化 - サンドボックス化が重要な理由 | Claude Code Docs

Sandbox の有効化により承認プロンプトが 84% 削減されたとのことです。

代替の選択肢

本提案は Claude Code のネイティブ機能を使ったサンドボックス化です。

この方法には以下のデメリットがあります。

  • 他のツールを並行利用する場合や乗り換える場合に、ツールごとに設定を行う必要がある

代替の選択肢としては以下のものが考えられます。

  • VS Code の DevContainer でコンテナ化する
  • GitHub Codespaces などのクラウド VM で開発を行う

上記の選択肢はツールに依存しない形でサンドボックス化できるため、複数のツールを使用したり、定期的に乗り換えたりする場合には良い選択肢です。

DevContainer について

DevContainer はチームで共通利用するツールなども含められるため、サンドボックス化以上の価値がありそうです。
しかし、以下の理由から今回は採用を見送りました。

  • macOS 特有の Docker の I/O パフォーマンス低下による開発体験の低下が懸念される
  • 現在の PC スペックの問題でメモリ使用量に懸念がある
  • 検討事項が多く、導入に時間がかかる

メリットも多いため、引き続き検討を進めたいと考えています。

クラウド VM について

環境の整備に加えて追加の費用が発生するため、今回は見送りました。
クラウドコーディングエージェントとして活用の幅が広がる可能性があるため、こちらについても引き続き検討は進めたいです。

設定内容

以下は今回設定した sandbox に関する設定内容です。
記事用にコメントをつけていますが、 json はコメントを記載できないため、コピペされる場合はコメントの削除が必要なことにご注意ください。

動作確認環境: Claude Code v2.1.34 / macOS

.claude/settings.json
{
  "sandbox": {
    // サンドボックスを有効にするか
    "enabled": true,

    // サンドボックス環境で Bash ツールを自動で承認するか(デフォルト: true)
    "autoAllowBashIfSandboxed": true,

    // サンドボックス外で実行するコマンド
    //
    // 公式ドキュメントでは "docker" のような指定になっていますが、
    // これだと完全一致のみで、引数付きのコマンド実行時にマッチしません。
    // ":*" のワイルドカードを付与することで、引数付きのコマンドにもマッチするようになります。
    //
    // ":*" は permissions ではレガシー構文として非推奨("*" への移行が推奨)ですが、
    // excludedCommands では ":*" 構文でないと有効になりません(v2.1.34 で確認済み)。
    // ref: https://github.com/anthropics/claude-code/issues/10524
    //
    // ここで指定されたコマンドは Sandbox の保護を受けません。
    // permissions で allow や deny の指定がなければ、実行時に承認を求められます。
    "excludedCommands": ["git:*", "pnpm:*", "docker:*"],

    // excludedCommands に指定したコマンド以外をサンドボックスで実行することを許可するか
    "allowUnsandboxedCommands": false,

    "network": {
      // サンドボックス内でネットワークアクセスを許可するドメイン
      // 空の状態から始めて、必要に応じて追加していきます
      "allowedDomains": [],

      // サンドボックス内でポートのローカルバインドを許可するか
      //
      // macOS では seatbelt と呼ばれるネイティブのサンドボックス機能が使用されますが、
      // デフォルトではポートのローカルバインドが許可されていません。
      // dev server などを Claude Code 経由で実行させたい場合は true にする必要があります。
      //
      // 今回は pnpm を excludedCommands に指定しており、
      // dev server の起動は pnpm dev で行われるため false のままにしています。
      "allowLocalBinding": false
    }
  }
}

参考ドキュメント

コメント