Box Mountは現在、プライベートプレビュー段階です。一般公開はされておらず、本番環境向けのSLAの対象外です。また、正式リリースまでに機能が変更される可能性があります。Boxはプレビュー参加者にバイナリと設定ガイダンスを提供しています。アクセス権限をリクエストするには、Box Mountプライベートプレビューの利用申請フォームに必要事項を入力してください。
Box Mountの仕組み
Box Mountは、バックグラウンドで同期プロセス (デーモン) を実行し、自社製品がプロビジョニングしたサンドボックス内のローカルディレクトリにBoxフォルダをマッピングします。Daytona、Docker、E2B、Vercel Sandboxなどのサポート対象Linuxサンドボックスで利用でき、特定ベンダーに依存しません。- コンテンツはBoxに保持されます。エージェントはローカルパスを対象に操作を実行し、すべての操作はBox APIを介して実行されます。
- ガバナンスはコンテンツに追従します。すべての操作は、Box Mountが認証したIDとして実行されます。そのため、Box Shieldの分類ベースのセキュリティポリシーとともに、そのIDの権限、リテンション、リーガルホールド、情報バリア、監査証跡がエージェントに適用されます。OAuthモードでは、IDはアプリを承認したユーザーです。そのため、ユーザーがアクセスできないコンテンツにエージェントがアクセスすることはできません。JWTモードでは、IDはサービスアカウントです。そのため、そのアカウントのスコープをエージェントが必要とするコンテンツに設定します。
- 同期は双方向で実行されます。エージェントがマウント上で行った変更はBoxにアップロードされ、ユーザーや他のエージェントによる更新はマウントに反映されます。
- 競合は上書きされずに保持されます。ユーザーやエージェントが同じファイルを同時に変更した場合、Box Mountはアップロード時に競合を検出し、両方の結果を新しいBoxバージョンまたは別個の競合コピーとして保持します。そのため、レビュー担当者は変更内容をマージしたり、Boxのバージョン履歴を利用してロールバックしたりできます。
Box Mountの実際の動作を確認する
このデモでは、契約書レビューエージェントを構築します。このエージェントは、BoxフォルダをE2Bサンドボックス内にマウントし、そのワークスペース上でエージェントを実行し、完了したレビュー結果をBoxに同期して、ユーザーがレビューできるようにします。
このデモで利用しているアーキテクチャやその他のワークフローパターンについては、BoxブログのMeet Box Mount: A Box workspace for sandboxed AI agentsを参照してください。
始める前に
以下が必要です。- Box Mountのバイナリを含む、Box Mountプライベートプレビューへのアクセス権限。アクセス権限をリクエストするには、Box Mountプライベートプレビューの利用申請フォームに必要事項を入力してください。
- 開発者コンソールのBoxアプリ。OAuth 2.0またはJWT認証のいずれかに構成しておきます。
- マウントするBoxフォルダのID。これは、BoxのフォルダURLの末尾の数値です。
サポート対象プラットフォーム
Box Mountは、x86_64およびARM64アーキテクチャ上で動作するLinux実行環境をサポートしています。macOSはサポートしていません。コマンド
最初のセッションは次のようになります。
/mnt/boxを対象に動作するようになります。
資格情報の構成
Box Mountは、--data-pathに渡したパスまたは~/.box-mount/にあるbox-config.jsonファイルからBox資格情報を読み取ります。
configコマンドは、対話形式による構成を1ステップで処理し、~/.box-mount/box-config.jsonに書き込みます。
oauthまたはjwtを入力します。資格情報の保護で説明されているとおり、構成ファイルおよびその構成ファイルが参照するJWTの秘密キーJSONを制限します。
OAuthの手動構成
~/.box-mount/box-config.jsonを作成し、Boxアプリの資格情報を入力します。
OAuth構成には、OAuthがデフォルトのモードであるため、
auth_typeフィールドはありません。auth_typeはJWTに切り替える場合にのみ設定します。
JWTの手動構成
JWTサービスアカウントを使用する場合、構成に必要なのは以下の2つのフィールドだけです。jwt_config_pathには、開発者コンソールによって生成されたJSONファイルのパスを指定する必要があります。このJSONファイルを作成するには、アプリの [構成] タブを開き、[アプリの設定] セクションで [公開/秘密キーペアを生成] を選択します。JWT認証では、SDKが自動的に有効期間の短いアクセストークンを取得するため、access_tokenおよびrefresh_tokenは不要です。
環境変数の使用
資格情報の各フィールドは、JSONファイルの代わりに環境変数で指定できます。環境変数は、JSONファイルの値より優先されます。また、この方法ですべての必須フィールドを指定する場合、JSONファイルは省略可能です。開発者トークンの使用
開発者トークンは、開発者コンソールで生成する有効期間の短いトークンです。60分間有効で、更新できません。OAuthフロー全体を実装せずにすばやくテストする場合に便利です。~/.box-mount/box-config.jsonにaccess_tokenを設定し、refresh_tokenは空のままにします。
access_tokenを更新するか、環境変数を再エクスポートしてください。
トークンのライフサイクル
OAuthモードの場合:- アクセストークンは約60分後に期限切れになり、SDKによって自動的に更新されます。
- 更新のたびに更新トークンがローテーションされ、古い更新トークンは即座に無効になります。
- ローテーションされたトークンは
~/.box-mount/box-config.jsonに書き戻されます。 - 更新トークンは60日間使用されないと期限切れとなります。
box-mount configをもう一度実行すると、OAuthフローが繰り返されます。
- SDKはJWTアサーションに署名し、それを有効期間の短いアクセストークンと交換して、そのトークンを自動的に更新します。トークンはメモリにのみ保持されるため、
box-config.jsonには何も書き込まれません。 - JWTの構成JSONと秘密キーが有効であれば、認証にユーザーの操作は必要ありません。
資格情報の保護
Box資格情報はBox APIのIDであり、そのIDの権限スコープは通常、マウントしたフォルダよりも広くなります。これは、box-config.jsonのOAuthクライアントのシークレットとトークン、BOX_*環境変数、およびディスク上のJWTの秘密キーJSONに当てはまります。それらを読み取る権限があれば、マウント内のファイルを読み取るだけでなく、そのアプリやユーザーとしてBox APIを呼び出すことができます。
box-mount mountが起動するデーモンはそれらの資格情報を必要としますが、他のプロセスと共有する必要があるのはマウントディレクトリのみです。構成、データベース、プロセスID、ログを保持する~/.box-mount/には、Box Mountを実行するアカウント以外がアクセスできないようにします。
エージェントサンドボックスでの推奨設定
LLMエージェントをBox Mountと同じマシン上で実行する場合、デーモンと同じUnixユーザーとしてエージェントを実行しないでください。以下の2つのユーザーを使用します。-
2つのユーザーを作成します。ユーザーAとして
box-mount configを実行し、~/.box-mount/がユーザーAのホームディレクトリ内に作成されるようにします。まだマウントしないでください。ブートストラップ処理によってツリー構造が生成され、先に共有権限を空のマウントディレクトリに設定する必要があるからです。 -
資格情報に対するアクセスを、ユーザーAのみが読み取ることができるように制限します。その後、
ls -lを使用して所有権を確認します。モード644(全ユーザーが読み取り可能) は、これらのファイルには適切ではありません。 -
共有グループ、setgid、およびデフォルトのPOSIX ACLを使用して、マウントディレクトリのみをユーザーBと共有します。setgidは、グループ所有権を新しいinodeにコピーします。また、デフォルトのACLはグループの書き込みアクセス権限を継承します。この設定を空のディレクトリに適用してから、マウントします。
setfaclコマンドはaclパッケージに含まれています。ユーザーBには、ユーザーAのホームディレクトリ、--data-path、およびJWTファイルに対する読み取りアクセス権限を持たせないようにする必要があります。また、ユーザーBはマウントより上位にあるすべてのディレクトリをトラバースできる必要があるため、この例ではマウントをホームディレクトリの外に配置しています。マウントを代わりにユーザーAのホームディレクトリ内に配置しても、ホームディレクトリが750に設定されていると、マウントディレクトリ自体が2770であっても、ユーザーBはブロックされます。 -
ユーザーBとしてエージェントを起動します。エージェントのシェル、systemdユニット、またはコンテナ仕様には、
BOX_CLIENT_ID、BOX_CLIENT_SECRET、BOX_ACCESS_TOKEN、BOX_REFRESH_TOKEN、BOX_JWT_CONFIG_PATHをエクスポートしないでください。エクスポートすると、これらの値がプロセス環境から参照可能になります。これらの値は、ユーザーAのデーモンプロセスのみが保持するようにします。 - JWTモードでは、企業の管理者のキーペアではなく、エージェントが必要とするコンテンツにスコープが設定されたサービスアカウントを使用します。
$HOMEにSSHキーを保存するのと同じモデルに従います。もう一方のプロセスが信頼できないエージェントである場合、この構成は適切ではありません。
データおよびログの場所
デフォルトでは、--data-pathは~/.box-mount/を指しており、Box Mountはそれを基準にして他のすべてのパスを導出します。
このツリーは、デーモン専用として扱ってください。資格情報の保護を参照してください。
