AI Agent に操作レベルのサンドボックスが必要な理由
LLM 駆動の Agent は、数行の補完を超えてファイルの読み書き、ターミナル実行、依存関係の取得、外部 API 呼び出しまで行う。 macOS 上では Xcode、コード署名、Apple Neural Engine によるオンデバイス推論が依然として必要だが、 Linux コンテナではそのスタックを再現できない。一方、日常使いの MacBook 上で Agent を裸で動かすと、 SSH 鍵、Keychain、IDE のグローバルストレージと同じ権限平面を共有することになる。
OpenClaw は、ZovCloud 専用 Mac mini M4 ハードウェア上で動作するサンドボックス層だ。 各タスクに設定可能・追跡可能・停止可能な境界を与えながら、ネイティブ macOS の能力はそのまま使える。 マシン全体を渡すのではなく、サンドボックスセッションごとに独立したポリシーと監査ストリームが付く—— Owner はいつでもトークンを失効させ、アクティブなジョブを終了できる。
本記事は個人の初回セッションから「チーム + CI 本番」までを扱う。 読了後には、ノードのプロビジョニング → OpenClaw 初期化 → policy YAML 作成 → ロール割り当て → GitHub Actions で隔離レビューセッション起動 → 監査ログの照会・エクスポート、まで一通り実行できるはずだ。
OpenClaw 1.4.2 / macOS Sequoia 15.3 を前提に執筆。シンガポールノードの Mac mini M4(10 コア · 16 GB · 256 GB SSD)で検証済み。 コンソール UI はリリースごとに変わることがあるが、CLI の意味論と YAML フィールド構造は安定している。
前提条件:ノード、ネットワーク、権限の見込み
OpenClaw は ZovCloud 専用ベアメタル上で動作する——単体ソフトウェアのライセンス販売ではない。 まず Mac mini M4 ノードの開通が必要だ。 注文ページで 5 リージョン(シンガポール、日本(東京)、韓国(ソウル)、中国香港、米国東部)のいずれかを選択。 基本プランは $19.8/日から、支払い後 1–5 分で開通し、SSH と VNC の認証情報がメールで届く。
初回初期化では macOS の Endpoint Security 認可(ファイル・プロセス監査)と ネットワークフィルタ拡張の許可が求められる。 社内ネットワークでアウトバウンドプロキシを使う場合は、Agent が叩く API ドメインが到達可能か確認するか、 ポリシー YAML で事前に許可リストを入れておく。 チーム運用では、複数人が同時に ES プロンプトを踏む混乱を避けるため、Owner が初期化を完了してから Operator や Auditor を招待するのが望ましい。
コンソール初期化:インスタンスから初回 claw status まで
-
01
コンソールにログインし、インスタンス詳細を開く
マイインスタンスから対象の Mac mini M4 を選び、稼働中であることを確認。新規ノードは先に SSH でディスクとネットワーク接続を検証しておく。
-
02
OpenClaw タブを開き、ゼロトラスト初期化を実行
初回アクセスで Ed25519 鍵ペアが生成され、
com.zovcloud.openclaw.daemonサービスがインストールされ、監査用に/var/log/openclaw/が作成される。画面の指示に従い ES とネットワーク拡張を承認する。 -
03
メンバーとアクセスポリシーを設定
アクセス制御で協業者を追加し、Owner / Operator / Auditor ロールを割り当てる。Operator はサンドボックスセッションを起動でき、Auditor は監査ログの閲覧のみ——ポリシー編集は不可。
-
04
CLI バンドルとトークンを取得し、動作確認
コンソールにワンラインインストールスクリプトが表示される。ノードに SSH して
claw statusを実行——daemon: runningとauth: validが出れば OK。出ない場合は先にclaw doctorを実行する。
初期化後、ダッシュボードではアクティブセッション数、セッションごとの CPU/RAM 使用率、過去 24 時間の BLOCK イベントを確認でき、 セキュリティレビュー用の PDF コンプライアンスサマリーもエクスポート可能だ。 BLOCK の急増にアラートを設定しておけば、緩いポリシーが放置されにくくなる。
CLI コマンド群と日常運用のリズム
日常業務は claw を中心に回る。責務ごとにグループ化するとスクリプト化しやすい:
# ヘルスチェック
claw status
claw doctor
# セッションライフサイクル
claw run --config policy.yaml
claw run --template ci-review --detach
claw attach <session-id>
claw stop <session-id>
claw list
# ポリシーテンプレート
claw template list
claw template export agent > policy.yaml
claw template save my-ci-policy
# 監査とネットワーク疎通
claw audit tail <session> --follow
claw audit query --since 24h --action BLOCK
claw audit export <session> --format json
claw net test --domain api.openai.com
定期チェックに claw doctor を入れる:デーモン健全性、Endpoint Security 認可、監査ディレクトリの書き込み可否、トークン有効期限。
サンドボックス起動が曖昧なエラーで失敗するときは、まず診断——よくある原因は ES 承認の期限切れか、コンソールパスの欠落だ。
本番では CI 用と人間タスク用でテンプレートを分ける:ci-review は読み取り寄りでネットワーク許可リストを狭く、
agent-dev はコンソールと DerivedData への書き込みを許可するが、~/.ssh と Keychain パスは常に拒否する。
本番向け policy.yaml:フィールドの意味と落とし穴
ポリシーファイルはサンドボックス境界の単一の真実の源(single source of truth)だ。 以下は本番 Agent でよく使うフル設定の例と、各セクションの注意点:
version: "1"
session:
name: "prod-agent"
auto_cleanup: false
max_duration: "4h"
idle_timeout: "30m"
filesystem:
workspace: "~/agent-workspace"
readonly_mounts:
- /Applications
- /usr/local/bin
- /Library/Developer
deny:
- ~/.ssh
- ~/Library/Keychains
- ~/Library/Application Support/Cursor/User/globalStorage
syscalls:
preset: "agent"
deny: [ptrace, setuid, mount]
network:
allow_domains:
- "api.openai.com"
- "api.anthropic.com"
- "*.github.com"
- "registry.npmjs.org"
- "pypi.org"
block_all_others: true
log_blocked: true
session ブロックはライフサイクルを制御する:max_duration で放置ジョブが 16 GB RAM を握り続けるのを防ぎ、
idle_timeout で Agent 非活動後にリソースを回収する。auto_cleanup: false はコード生成タスクで成果物を残したい場合に向く。
filesystem では deny が readonly_mounts より優先される。
OpenClaw はシンボリックリンクの実体を解決する——Homebrew ツールが Cellar を指している場合、Cellar を readonly_mounts に入れないと
git や python3 呼び出しが静かに失敗することがある。
network では block_all_others: true を維持し、log_blocked: true を有効にする:
未許可の外向き通信はドロップされるが、監査ストリームには未知ドメインへの試行が記録される。
/Applications/Xcode.app に加え、/Library/Developer をマウントし、
~/Library/Developer/Xcode/DerivedData を書き込み可能なコンソールサブパスにする。
DerivedData が書けないとフルリビルドが強制され、コンパイルが 3–5 倍遅くなる事例がある。
キャッシュを Agent が消して 18 分のクリーンビルドに至ったケースも確認済みだ。
マルチユーザーゼロトラスト:ロール、トークン、協業境界
チーム運用では最小権限の原則で 3 ロールを割り当てる。各ロールは専用 CLI トークンで認証(デフォルト TTL 24 時間)し、 Owner はトークン失効と、該当セッションの強制終了ができる。 外部コンサルタントには期限付き Guest トークンを発行——マスターポリシーファイルを触らずに失効する。
| ロール | サンドボックス起動 | 監査閲覧 | ポリシー編集 | 想定ユーザー |
|---|---|---|---|---|
| Owner | 可 | 可 | 可 | テックリード / DevOps |
| Operator | 可 | 可 | 不可 | 日常開発者 |
| Auditor | 不可 | 可 | 不可 | セキュリティ / コンプライアンス |
ここでのゼロトラストとは、すべての CLI 呼び出しが短命トークンを伴うこと、ポリシー変更や高リスク操作(ネットワーク許可リストの拡大など)は Owner 限定であること、
すべての ALLOW/BLOCK イベントが改ざん検知可能な監査ストリームに入ることを意味する。
Owner トークンを CI のシークレットストアに入れない——パイプライン用には ci-review テンプレートに紐づく Operator トークンを発行する。
GitHub Actions 統合:PR ごとに 1 サンドボックスセッション
ZovCloud M4 をセルフホスト Runner として登録したあと、PR パイプラインで AI コードレビューごとに隔離サンドボックスを起動できる。 パターンは固定:セッション開始 → サンドボックス内で Agent 実行 → 成否に関わらず監査をエクスポート → セッション停止。
# .github/workflows/ai-review.yml
name: AI Code Review (Sandboxed)
on: [pull_request]
jobs:
review:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- name: Start OpenClaw sandbox
run: |
claw run --template ci-review --detach
SESSION=$(claw list --json | jq -r '.[0].id')
echo "SESSION_ID=$SESSION" >> $GITHUB_ENV
- name: Run AI review agent
run: |
claw attach $SESSION_ID --exec \
"claude -p 'Review this PR for security issues'"
- name: Export audit log
if: always()
run: |
claw audit export $SESSION_ID \
--format json \
--output audit-${{ github.run_id }}.json
- name: Stop sandbox
if: always()
run: claw stop $SESSION_ID
ci-review テンプレートの YAML はリポジトリの .openclaw/ に置き、ワークフローと一緒にバージョン管理する——
ポリシー変更は Code Review を通し、セキュリティチームが有効な境界を検査できる。
複数プロジェクトが 1 ノードを共有する場合、リポジトリごとに異なる Runner ラベルを登録するか、
OpenClaw でセッションごとのファイルシステム範囲を絞り、他プロジェクトのソースツリーを Agent が読めないようにする。
監査ログ、アラート、よくあるトラブルシューティング
異常調査では、監査ストリームを時間と種別でフィルタする:
claw audit query --since 7d --action BLOCK --type network --format table
claw audit query --since 24h --action BLOCK --type write --format json \
| jq '.[] | select(.target | contains("/etc"))'
コンプライアンスエクスポートは JSON、CSV、PDF に対応。PDF にはセッションサマリー、ALLOW/BLOCK 統計、ポリシースナップショット、タイムラインが含まれ、監査人向けにそのまま渡せる。
コンソールでは「1 セッションで 1 時間あたり BLOCK > 50 件」や「~/.ssh 読み取り試行」などのルールでアラートを設定し、Owner にメールまたは Webhook 通知できる。
| 症状 | 想定原因 | 対処 |
|---|---|---|
| git / python 呼び出し失敗 | ツールパス未マウント | シンボリックリンクを確認;Cellar を readonly_mounts に追加 |
| Xcode ビルドが極端に遅い | DerivedData が書けない | 書き込み可能なコンソールサブパスを追加 |
claw run がタイムアウト |
ES 認可の期限切れ | claw doctor の指示で再承認 |
| ネットワークがすべて BLOCK | ドメイン未許可 | claw net test で確認 |
| 監査ディスク使用量が増大 | 高頻度ジョブのログ増加 | ログローテーションまたはフィルタ閾値の調整 |
フル監査は M4 10 コアで CPU 約 3% のオーバーヘッド——多くのワークロードでは無視できる。
レイテンシ敏感なエッジケースでは細粒度の syscall 監査を外し、ファイル/ネットワーク層のみにすることもできるが、本番ではフル監査を推奨する。
本番投入前チェックリスト:タスクごとに 1 セッション;ポリシー YAML を Git 管理しレビュー;
~/.ssh、Keychain、IDE グローバルストレージは常に拒否;ネットワークはデフォルト拒否 + 明示的許可リスト;
max_duration と idle_timeout を設定;CI では if: always() で監査をエクスポート;BLOCK アラートを設定。
ローカルではなくクラウド専用 Mac で OpenClaw を動かす判断
MacBook 上で Agent を裸で動かすと、日常マシンと同じ権限平面になり、操作レベルの監査がない。 8 GB 機では長時間ジョブで swap が発生しやすく、CI を 7×24 で回すのも難しい。 パブリッククラウドの macOS インスタンスは仮想化が多く、Neural Engine のパススルーや組み込みサンドボックスが欠けることがある。 最低利用期間や従量課金では、柔軟な日単位の物理専用機の方が安くつく場合もある。 GitHub Actions の macOS Runner は分単位の高額課金、共有環境、ポリシー制御の乏しさ、ピーク時のキュー待ちが課題だ。
ZovCloud は専用 Mac mini M4($19.8/日、$53.5/週、$99.1/月〜)、組み込み OpenClaw、 5 リージョン・1–5 分開通、7×24 有人サポートを提供——本ガイドの協業・CI・監査フローはこのスタックを前提にしている。 手元のノート PC が逼迫しているなら、シンガポールや日本(東京)で日単位レンタルし、同じリポジトリと Agent タスクを流して監査の完全性と完了時間を比較し、 本番レビューパイプラインをクラウドに置くか判断するとよい。
レンタル終了や解約時、ZovCloud は安全なディスク消去を自動実行する。
ノード解放前に claw audit export で監査ログをオブジェクトストレージへアーカイブし、
コンプライアンス証跡がインスタンスと一緒に消えないようにする。
まずは軽く試すなら5 分クイックスタートから。チームと CI のシナリオは本ガイドで拡張できる。
OpenClaw サンドボックスを本番パイプラインへ
ZovCloud Mac mini M4 専用ノード:ゼロトラスト協業、フル監査ログ、 16 GB 統合メモリと 38 TOPS AI 算力——$19.8/日〜、契約縛りなし。