コーディングエージェントサンドボックス:エージェント生成コードを安全に実行する方法

コーディングエージェントサンドボックス:エージェント生成コードを安全に実行する方法

コーディングエージェントサンドボックスを使用すると、エージェントが生成したコマンドやコード変更を、ファイル、プロセス、ネットワークアクセス、シークレット、ログ、レビューアーティファクトを制御できるスコープ付きのワークスペースで実行できます。実際的な目標は、任意に生成されたコードが無害であるふりをすることではありません。目標は、エージェントを信頼できないコントリビューターのように扱い、使い捨ての開発マシン、明確な境界、観測可能な実行、そしてプロダクションに到達する前の人間による承認パスを用意することです。

コーディングエージェントサンドボックスが分離する必要があるもの

コーディングエージェントは、リポジトリを検査し、ファイルを編集し、テストを実行し、依存関係をインストールし、パッチを返すことができるようになると有用になります。これらのアクションこそが、環境を危険にします。プロンプトインジェクションによる依存関係のインストール、破壊的なシェルコマンド、誤って公開されたシークレットは、悪質なテキスト回答よりも大きな損害を引き起こす可能性があります。

コーディングエージェントが触れるリソースに基づいてサンドボックスを設計します:

表面 制御するもの 重要な理由
リポジトリチェックアウト ブランチ、コミットSHA、書き込み範囲、サブモジュール、生成ファイル エージェントが間違ったコードベースを変更したり、レビューパスの外で変更を隠したりするのを防ぎます。
ファイルシステム ワークスペースルート、マウントされたファイル、無視するパス、出力ディレクトリ ホストファイル、認証情報、キャッシュ、無関係なプロジェクトへの広範なアクセスを防ぎます。
シェル実行 許可されたコマンド、作業ディレクトリ、タイムアウト、出力キャプチャ、承認ゲート エージェントにビルドとテストに十分なパワーを与えつつ、高リスクアクションを制限します。
パッケージインストール レジストリポリシー、ロックファイル、固定バージョン、キャッシュ戦略、インストールログ エージェントが新しい依存関係を要求したときのサプライチェーンのあいまいさを軽減します。
ネットワークアクセス デフォルトの出力、許可リスト、DNS動作、API送信先、パッケージミラー 意図しないデータ移動を防ぎ、外部コールをレビュー可能にします。
シークレット スコープ付き認証情報、短期トークン、編集、デフォルトのプロダクションキーなし エージェントが不要な認証情報を読み取ったり漏洩したりするのを防ぎます。
アーティファクト テストレポート、ビルド出力、スクリーンショット、生成ファイル、ログ レビュー担当者にエージェントの要約だけに頼らない証拠を提供します。
ライフサイクル 一時停止、再開、スナップショット、リセット、クリーンアップ、保存ポリシー エージェントの実行を、長期にわたる謎のマシンではなく、反復可能で使い捨て可能にします。

この表を設計チェックリストとして使用してください。これは、サンドボックスがコンテナ、仮想マシン、マイクロVM、管理クラウドサンドボックス、または内部ランナーのいずれで構築されている場合でも当てはまります。正確な分離レイヤーは重要ですが、そのレイヤーを囲む運用上の制御も同様に重要です。

エージェント生成コードを実行するための参照ワークフロー

最も安全なコーディングエージェントワークフローは、チャットボットというよりも、制御されたプルリクエストパイプラインのように見えます。

  1. タスク用の新しいワークスペースを作成します。
  2. 特定のブランチまたはコミットでターゲットリポジトリをチェックアウトします。
  3. エージェントに狭いタスク、テストコマンド、ファイル範囲を与えます。
  4. エージェントにファイルを検査させ、計画を提案させます。
  5. 低リスクの読み取り専用コマンドを自動的に実行します。
  6. リスクの高いコマンドには承認またはポリシーチェックを要求します。
  7. すべてのコマンド、終了コード、stdout、stderr、ファイル書き込み、生成されたアーティファクトをキャプチャします。
  8. サンドボックス内でテスト、型チェック、リンター、ビルド、対象スクリプトを実行します。
  9. パッチ、差分、テスト出力、アーティファクトバンドルをエクスポートします。
  10. スナップショットが意図的に保存されない限り、レビュー後にワークスペースをリセットまたは破棄します。

重要な詳細は、サンドボックスはコードを実行する場所であるだけでなく、証拠記録装置でもあるということです。レビュー担当者は、どのリポジトリがチェックアウトされたか、何が変更されたか、どのコマンドが実行されたか、何が失敗したか、何が成功したか、どのファイルが生成されたか、どの外部リソースに連絡が取られたかを答えられる必要があります。

単純なエージェントの場合、これは各アクションの周りにポリシーチェックを伴うアクションのキューとして実装できます。より強力なエージェントの場合、同じ境界を維持しますが、制御プレーンをより明示的にします。エージェントが何を要求できるかを決定するコンポーネント、承認されたアクションを実行するコンポーネント、実行を記録するコンポーネントが1つずつあります。

ユーザータスク
  -> エージェントがファイルの読み取り、編集、コマンドを提案
  -> ポリシーレイヤーが各アクションを分類
  -> サンドボックスが承認されたアクションを実行
  -> ログ、差分、アーティファクトがキャプチャされる
  -> 人間がマージまたはデプロイ前にパッチをレビュー

この分離により、モデルが危険な操作に対するプランナーであり最終権限でもあることを防ぎます。

コマンド実行前のセキュリティチェックポイント

生成されたコマンドが間違っていたり、過剰に広範囲であったり、リポジトリのコンテンツの影響を受けていたりする可能性があるという前提から始めてください。コーディングエージェントは、テストフィクスチャ、README、イシューボディ、パッケージスクリプト、またはWebページから悪意のある指示を読む可能性があります。サンドボックスは、それらの障害を可視化し、封じ込める必要があります。

シェル実行の前に、コマンドクラスを定義します:

コマンドクラス デフォルトポリシー
読み取り専用検査 pwd, ls, git status, rg, cat package.json 通常は許可してログに記録。
ローカル検証 npm test, pytest, go test, cargo test タイムアウトと出力キャプチャ付きで許可。
ビルドまたは生成 npm run build、コード生成、ドキュメント生成 出力パスが想定内の場合に許可。
依存関係の変更 パッケージマネージャーインストール、ロックファイル更新 ポリシーチェックまたは承認を要求。
ネットワークコマンド URLの取得、APIの呼び出し、追加リポジトリのクローン 送信先ポリシーとログ記録を要求。
破壊的コマンド 削除、強制リセット、ディスククリーンアップ、広範なchmod/chown ブロックするか、明示的な人間の承認を要求。
シークレットアクセス envファイルの読み取り、認証情報ストア、デプロイ設定 タスク固有かつスコープ付きでなければブロック。

これは完璧な静的アナライザーを必要としません。単純な制御でも役立ちます。作業ディレクトリの制限、明示的な拒否パターン、コマンドのタイムアウト、出力サイズ制限、依存関係を変更したり、認証情報に触れたり、外部ホストに接続したりするコマンドに対する承認プロンプトなどです。

ファイルシステムの境界も同様に具体的にすべきです。リポジトリとエージェントが必要とする一時ディレクトリのみをマウントします。オペレーターのホームディレクトリ、SSHキー、クラウド設定、パッケージマネージャーの認証情報、ブラウザプロファイル、プロダクション環境ファイルをマウントしないでください。速度のためにキャッシュが必要な場合は、読み取り専用またはタスクスコープのキャッシュを明確な保存期間で優先します。

パッケージインストールとネットワークアクセスの処理方法

パッケージインストールは、コーディングエージェントサンドボックスの中で最も難しい部分の1つです。これは有用であると同時にリスクがあるからです。エージェントはビルドを再現し、テストを実行する必要がありますが、インストールスクリプトはコードを実行し、推移的な依存関係をプルし、外部インフラストラクチャに接続する可能性があります。

パッケージ作業にはより厳格なポリシーを使用します:

  • 自由形式の依存関係解決よりもロックファイルベースのインストールを優先します。
  • パッケージマネージャーのコマンド、レジストリURL、パッケージ名、バージョン、ロックファイルの変更をログに記録します。
  • 可能な場合は、依存関係のダウンロードを承認されたレジストリまたはミラー経由でルーティングします。
  • 新しい依存関係の追加は、レビューを必要とするコード変更として扱います。
  • プロジェクトが明示的に必要としない限り、高リスクワークフローではインストールスクリプトをブロックします。
  • 依存関係キャッシュをシークレットや無関係なリポジトリから分離します。

ネットワーク出力にも同様の扱いが必要です。コーディングエージェントは、パッケージレジストリ、APIドキュメント、ブラウザチェック、統合テストのためにインターネットアクセスを必要とする場合があります。だからといって、無制限の送信アクセスが必要というわけではありません。

少なくとも、デフォルトを定義します:

ネットワークの質問 より安全なデフォルト
サンドボックスはインターネットに到達できますか? タスクで必要な場合を除き、いいえ。
任意のDNS名を解決できますか? DNSと送信先ホストを制限またはログ記録。
プロダクションAPIを呼び出せますか? デフォルトではステージングエンドポイントまたはモックサービスを使用。
パッケージ依存関係を取得できますか? 承認されたレジストリ、ミラー、ロックファイルを使用。
ファイルやログをアップロードできますか? 送信先が想定内でレビュー済みでない限りブロック。

これらの制御を、データ流出や依存関係の侵害が絶対に起こらないという保証として説明しないでください。現実的な主張はより限定的です。ポリシー、分離、ログ記録、レビューによって、爆発範囲を縮小し、パッチが信頼される前に危険な動作を検出しやすくするということです。

人間のレビューのための差分、アーティファクト、ログ

人間のレビューは、サンドボックスが長いチャットのトランスクリプトではなく、コンパクトなレビューパッケージを生成するときに最も効果的です。

実行ごとに、以下をキャプチャします:

  • チェックアウトに使用されたリポジトリURL、ブランチ、コミットSHA。
  • タスクプロンプトまたはイシューサマリー。
  • 読み取られたファイルと書き込まれたファイル。
  • すべてのコマンド、作業ディレクトリ、開始時刻、終了時刻、終了コード、stdout、stderr。
  • 依存関係インストールコマンドとロックファイルの変更。
  • テスト、リンター、型チェック、ビルドの結果。
  • スクリーンショット、レポート、カバレッジ、バイナリ、プレビューURLなどの生成されたアーティファクト。
  • 標準的なパッチまたはプルリクエスト形式の最終差分。

レビュー担当者はまず差分を検査し、次にログとアーティファクトを使用して対象を絞った質問に答えます。テストは本当に実行されましたか?エージェントは要求された範囲外のファイルを変更しましたか?依存関係を追加しましたか?生成されたファイルを書き換えましたか?ネットワークサービスを呼び出しましたか?大規模または機密性の高いアーティファクトを残しましたか?

プロダクションチームの場合、レビューゲートを明示的にします:

  • エージェントはパッチを提案できます。
  • サンドボックスは検証を実行できます。
  • システムはプルリクエストを開くことができます。
  • 人間または承認されたポリシーが、マージ、デプロイ、またはより広い権限を付与するかどうかを決定する必要があります。

この境界は、インフラストラクチャ、課金、認証、デプロイメント、または顧客データパスを含むリポジトリにとって特に重要です。

Novita Agent Sandbox が適合する場所

Novita Agent Sandbox は、エージェントがコードを実行し、依存関係をインストールし、ファイルにアクセスし、ブラウザワークフローを使用し、セッション間で実行状態を保持できる、分離されたステートフルな実行環境向けに設計されています。Agent Sandbox の概要 では、3つのコアビルディングブロックについて説明しています。つまり、分離されたタスク実行のためのサンドボックス、準備された環境のためのテンプレート、設定済みの状態を再利用するためのスナップショットです。

コーディングエージェントのワークフローでは、これらのプリミティブは制御された開発ワークスペースに自然にマッピングされます:

コーディングエージェントのニーズ サンドボックスパターン
既知の環境から開始する 想定されるランタイムとツールを含むテンプレートを使用します。
ホストから離れてコマンドとテストを実行する サンドボックス固有のファイルシステムとランタイム環境内で実行します。
準備済みの設定を再利用する 承認された依存関係またはプロジェクトツールをインストールした後、スナップショットを保存します。
長時間実行されるエージェント作業をデバッグする ワークフローが継続性を必要とする場合、セッション間で状態を保持します。
レビュー後にクリーンアップする 保存ポリシーに従って、サンドボックスをリセット、停止、または破棄します。

製品の使用とセキュリティポリシーは分けて考えてください。Novita Agent Sandbox は、コードを実行するエージェントに分離された実行環境を提供できますが、アプリケーションは依然としてリポジトリアクセス、コマンドポリシー、シークレット範囲、ネットワークルール、アーティファクト保存、人間による承認ゲートを定義する必要があります。これらの選択肢は脅威モデルに依存し、公開プロダクションで使用する前に、エンジニアリングおよびセキュリティ責任者によるレビューが必要です。

ハンズオンの例を希望する開発者は、Build a Remote Code Execution MCP Server with Novita Sandbox and mcp-use Library というNovitaガイドも参照できます。製品ドキュメントについては、Novita Agent Sandbox ドキュメントSDK/CLIインストールガイド から始めてください。

FAQ

コーディングエージェントサンドボックスだけで、生成されたコードを安全にできますか?

いいえ。サンドボックスは1つの制御レイヤーです。スコープ付きのリポジトリアクセス、コマンドポリシー、依存関係制御、ネットワーク制限、シークレット処理、ログ、アーティファクトレビュー、マージまたはデプロイ前の人間による承認が依然として必要です。

コーディングエージェントはインターネットアクセスを持つべきですか?

タスクで必要な場合に限ります。多くのコードレビュー、リファクタリング、テストワークフローは、依存関係が準備された後、一般的なインターネットアクセスなしで実行できます。インターネットアクセスが必要な場合は、送信先をログに記録し、許可リストに登録されたパッケージレジストリ、ドキュメントサイト、ステージングAPI、またはモックを優先します。

エージェントはプロダクションシークレットを受け取るべきですか?

デフォルトでは、プロダクションシークレットをコーディングエージェントに与えないでください。特定のタスク用にスコープ付きの短期認証情報を使用し、ステージングサービスを優先し、ログを編集し、レビュー済みの理由がない限り、リポジトリワークスペースからシークレットアクセスを遠ざけてください。

エージェントのパッチを信頼する前に何をレビューすべきですか?

差分、変更された依存関係、生成されたファイル、コマンドログ、テスト結果、ネットワークアクティビティ、アーティファクトをレビューします。認証、承認、デプロイ、課金、インフラストラクチャ、データアクセス、パッケージ管理の変更には特に注意してください。

いつサンドボックスをリセットすべきですか?

スナップショットを意図的に保存しない限り、タスクごとにワークスペースをリセットまたは破棄します。永続的な状態は長時間実行されるワークフローには便利ですが、所有権、保存、クリーンアップルールの伴う意図的な選択であるべきです。

おすすめ記事