素の Agent 実行とサンドボックス実行:権限面の差はどこにあるか
人間の開発者が SSH で Mac に入った場合、通常は ~/.ssh を誤削除したり Distribution 証明書をエクスポートしたりしない。AI Agent は挙動が異なる——shell・ファイル・ネットワークツールを呼び出すフレームワークは、デフォルトで現在の macOS ユーザーのフル権限を継承する。「リポジトリ内の TODO をスキャンして Markdown レポートを出力せよ」というタスクなら、理論上はプロジェクトディレクトリの読み取りと1つの出力ファイルだけで足りる。しかし実際には Keychain、ブラウザ Cookie、任意の外向き HTTP リクエストにも到達しうる。
コンテナ化はプロセスを隔離できるが、macOS 上では完全な Xcode ツールチェーンや Apple ネイティブフレームワークを犠牲にしがちだ。タスクごとに VM を再構築するのも、対話型 Agent ループには遅すぎる。OpenClaw は第三の道を取る:実 macOS 上で YAML ポリシーがシステムコール層で allow/deny を判定し、各判定を監査ストリームに書き込む。Agent は M4 の 38 TOPS Neural Engine でローカル推論を続けられる一方、ポリシー外の読み書きは即座にブロックされる。
本記事のデモタスクは意図的に絞っている:サンドボックス内で既存コードスナップショットに静的スキャン(rg で TODO/FIXME 検索)を実行し、ポリシーで拒否される git clone を1回試み、最後にレポートを /workspace に書き出す。成功基準は3つ——スクリプトが完走すること、監査ログに allow と deny の両方が現れること、各イベントから発火した YAML ルールを逆引きできること——である。
ハードウェア:JexMac 日本(東京)ノード · Mac mini M4 · 10コア CPU · 16 GB ユニファイドメモリ · 256 GB NVMe · 1 Gbps 専有帯域。OS:macOS 15 Sequoia。OpenClaw CLI 0.9.x、ポリシー形式 v2。作業は SSH で完結、カーネル拡張承認ステップのみ VNC ログインを1回必要とした。
着手前:4つの前提条件を一括確認
ローカル PC は Windows / Linux / macOS いずれでもよい——SSH クライアントがあれば足りる。ただし以下4項目のいずれかが欠けると、途中で必ず止まる。
- 納品済み JexMac インスタンス:コンソール「接続情報」に SSH アドレスとポートが表示されていること。5拠点——シンガポール、日本(東京)、韓国(ソウル)、中国香港、米国東部——は仕様・料金同一。Agent 実験は対象 API のレイテンシに合わせて近いリージョンを選ぶのが無難。
- OpenClaw instance-token:コンソール「セキュリティとサンドボックス」で初回有効化時に生成。
oct-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx形式。画面は1回限り表示のため、即座に 1Password / Bitwarden 等のシークレット管理ツールへ保存すること。 - 作業ディレクトリ
/workspace:ホスト側で事前作成。サンドボックスはこのパスを Agent の読み書き可能領域にマップする。秘密鍵や p12 をここに置かない。 - ポリシー YAML を1つ以上:第5節に読み取り専用テンプレートを示す。原則は厳しめから始め、deny ログを見ながら段階的に権限を追加する。
コンソールで OpenClaw を有効化し instance-token を保管
OpenClaw はデフォルト OFF——各物理インスタンス独立制御で、監査が不要な用途に余計なオーバーヘッドを課さない。ブラウザ側は次の3ステップだけ、以降はすべて SSH で進める。
-
01
インスタンス詳細 →「セキュリティとサンドボックス」
JexMac コンソールにログインし、対象 Mac mini インスタンスを開いて OpenClaw スイッチ領域へ。納品直後(1〜5分以内)の場合、ステータスが「稼働中」になるまで待ってから操作する。
-
02
有効化して token をコピー
有効化をクリック、ダイアログに
instance-tokenが表示される。シークレット管理ツールへの保存を確認したら「保存済み、続行」をクリック。token を Slack・チケット・Git コミットに貼らない。 -
03
バッジが「有効」であることを確認
30秒経っても「有効化中」のままならページをリロード。緑バッジが出ればブラウザを閉じ、以降 CLI で操作する。
SSH で CLI をインストールし3コンポーネントのヘルスチェック
SSH でインストール後、セットアップスクリプトは Apple Silicon アーキテクチャを自動判別し、M4 上では通常30秒以内で完了する。
curl -fsSL https://api.jexmac.com/openclaw/install.sh | bash
openclaw auth login --token <instance-token>
openclaw status
openclaw status で3項目すべて healthy であること:
| コンポーネント | 役割 | 期待状態 |
|---|---|---|
| Policy Engine | YAML を解析し、syscall 前に allow/deny を判定 | healthy |
| Sandbox Runtime | サンドボックスライフサイクル、プロセス分離、ディレクトリマップ | healthy |
| Audit Bus | 監査イベントを非同期書き込み、Agent メインパスをブロックしない | healthy |
いずれかが degraded または unavailable なら、まず openclaw doctor を実行。よくある原因は初回インストール後のシステム拡張未承認——ブラウザ VNC で接続し「システム設定 → プライバシーとセキュリティ」から許可、SSH に戻って CLI サービスを再起動する。Policy Engine が healthy でもYAML 構文が正しいとは限らない——ポリシー検証は次節で別途行う。
最小権限ポリシー:バージョン管理可能な YAML 1枚
ポリシーファイルは Agent が読めるパス、起動できるプロセス、外向き通信可否を決める。推奨ワークフロー:最初の YAML はタスクに必要な最小集合だけ開放 → タスク実行 → deny ログ確認 → 必要に応じ allow ルール追加。「全開放から事後的に締める」のではなく、deny ログ駆動で段階的に権限を広げる。
以下を ~/policies/agent-readonly.yaml として保存:
apiVersion: openclaw.jexmac.com/v2
kind: SandboxPolicy
metadata:
name: agent-readonly
spec:
filesystem:
allow:
- path: /workspace
access: [read, write]
deny:
- path: "**/Keychains/**"
- path: "**/.ssh/**"
- path: "**/Library/Cookies/**"
process:
allow: [git, rg, python3, zsh, bash]
network:
egress: deny-all
設計上の3点:deny は allow より優先——/workspace 全体が書き込み可でも deny リスト内パスはブロックされる。process.allow はプロセス名ホワイトリスト——Agent が node / npm を使うなら明示追加、さもなければ E_POLICY_DENY: process が返る。egress: deny-all は本デモで git clone を意図的に遮断し、監査ログに network deny イベントを残すため。
サンドボックス作成前に構文検証:
openclaw policy validate -f ~/policies/agent-readonly.yaml
期待出力 policy valid (0 warnings)。フィールド綴りミスや v1 旧形式は具体的な行番号付きでエラーになる。
サンドボックス作成、Agent タスク投入、結果確認
LangGraph 等のフレームワークに接続する前に、決定論的 shell スクリプトで閉ループを通すことを推奨——スクリプト挙動は予測可能で、エラー時に「ポリシー問題」と「Agent ロジック問題」を切り分けやすい。
ホスト側にエントリスクリプト /workspace/agent-entry.sh を作成:
#!/bin/zsh
set -euo pipefail
cd /workspace
git clone --depth 1 https://github.com/apple/swift-sample-code.git repo 2>/dev/null \
|| echo "clone blocked (expected)"
rg -rn "TODO|FIXME" . --glob '*.swift' > scan-report.txt 2>/dev/null || true
echo "Scan complete: $(wc -l < scan-report.txt | tr -d ' ') matches" > summary.txt
cat summary.txt
chmod +x /workspace/agent-entry.sh 後、順に実行:
-
01
サンドボックス作成
openclaw sandbox create --name agent-demo --policy ~/policies/agent-readonly.yamlステータス
readyで OK。同名サンドボックスの再 create は「既存」通知のみ、データは破壊されない。 -
02
別 SSH セッションで監査をリアルタイム追跡
openclaw audit tail --sandbox agent-demo --follow判定イベントは通常、操作後 50〜200 ms 以内にターミナルに現れる。
-
03
サンドボックス内でスクリプト実行
openclaw sandbox exec agent-demo -- /bin/zsh /workspace/agent-entry.sh期待出力に
clone blocked (expected)を含み、summary.txtにスキャン行数が書き込まれる。 -
04
サンドボックス停止
openclaw sandbox stop agent-demo/workspaceデータはホストに残る。完全削除は--rmを付与。
外向き通信が deny のため git clone は成功しない——これは network deny を1件残すための意図的設計。rg ステップが正常完了すれば filesystem allow は正しい。東京ノードでの計測ではスクリプト全体約 2.6 秒、ポリシーオーバーヘッドは無視できるレベルだった。
監査ログフィールド:allow から deny までの読み方
監査は事後 PDF ではなく、ポリシー判定と同期するイベントストリーム。典型的な allow 記録(エントリスクリプト読み取り):
ts=2026-07-28T09:03:12.481Z
sandbox=agent-demo
syscall=open
resource=filesystem
path=/workspace/agent-entry.sh
access=read
decision=allow
policy_rule=filesystem.allow[0]
latency_us=34
policy_rule は発火した YAML ルールのインデックス。latency_us は判定のマイクロ秒コスト。対応する network deny(遮断された clone):
ts=2026-07-28T09:03:12.512Z
sandbox=agent-demo
syscall=connect
resource=network
dst=140.82.113.4:443
decision=deny
policy_rule=network.egress.deny-all
latency_us=19
本番タスクで GitHub から pull が必要なら network.egress を allow-list に変更し github.com:443 を追加。validate 後 openclaw sandbox update --name agent-demo --policy ~/policies/agent-readonly.yaml でサンドボックス再作成不要。
よく使うクエリ:
- 直近1時間の deny:
openclaw audit query --decision deny --since 1h - パスでフィルタ:
openclaw audit query --resource filesystem --path "/workspace/**" - SIEM 向け JSON エクスポート:
openclaw audit export --sandbox agent-demo --since 24h --format json > audit.json
6つの頻出エラーと最短修正パス
| エラー現象 | 根本原因 | 対処方法 |
|---|---|---|
auth login token 無効 |
コピー時に空白混入、または token ローテーション済み | コンソールから再コピー;macOS では pbpaste | xxd で先頭末尾文字を確認 |
status が unavailable |
システム拡張未承認 | VNC → システム設定 → プライバシーとセキュリティ → OpenClaw を許可 → サービス再起動 |
policy validate unknown field |
YAML フィールド名誤りまたは v1 形式 | apiVersion: openclaw.jexmac.com/v2 を確認 |
E_POLICY_DENY: filesystem |
allow リスト外パスへアクセス | audit query --decision deny でパス確認、filesystem.allow に追加 |
E_POLICY_DENY: process |
ホワイトリスト外プロセス起動 | resource=process の deny を確認、process.allow にプロセス名追加 |
git clone タイムアウト、deny ログなし |
DNS 遮断、connect 未到達 | ネットワークポリシーを allow-list に変更、8.8.8.8:53 またはドメインルールも許可 |
instance-token はインスタンス高権限クレデンシャルに相当し、.env や Git への書き込み禁止。本番ではメンバーごとにゼロトラストデバイス証明書とロール(viewer / operator / admin)を設定し、同一 token を共有しない。
PoC 通過後:Agent をどの Mac で長期稼働させるか
読み取り専用サンドボックスでの検証は起点に過ぎない。実運用では Agent が xcodebuild を呼び、npm/PyPI から pull し、CI 上で PR ごとにサンドボックスを作成・破棄する——拡張パスは常にdeny ログ駆動のポリシー反復であり、権限を推測で広げることではない。
計算性能面、Mac mini M4 · 16 GB では DerivedData を含むビルドサンドボックスを2つ並行、残り約 4 GB を OpenClaw 監査とシステムサービスに割り当て可能だった。さらに負荷が増す場合、JexMac の Thunderbolt 5 並列サービスで複数 Mac mini を 80 Gbps クラスタに構成でき、各インスタンスのポリシーと監査ログは独立保存される。
専用クラウド Mac がまだないチーム向けに、代替案それぞれの弱点を整理する。ローカル MacBook を 7×24 Agent ホストにすると日常開発と干渉し、常時高負荷で熱対策も厳しい。GitHub ホスト macOS Runner は共有プールで OpenClaw ネイティブ統合がなく、ピーク時キュー待ちは対話型 Agent に不向き。自社 Mac mini 調達は購入サイクル、データセンター托管、証明書ローテ時の現場メンテが必要になる。
JexMac は専有物理 Mac mini M4(10コア · 16 GB · 256 GB NVMe · 38 TOPS)を提供し、OpenClaw は標準インスタンスに内蔵。5拠点それぞれ独立 IPv4 と 1 Gbps 帯域、支払い後 1〜5 分納品、日額 $21.5 〜・月額 $107.3、契約縛りなし。Agent 実験期は日額、ポリシー安定後に月額へ切り替えればよい。
隔離 macOS で最初の Agent を動かす
記事内コマンドは JexMac Mac mini M4 物理ノードで検証済み。インスタンス開通 → OpenClaw 有効化 → 本記事のポリシーでタスク投入、1時間以内に初回監査記録を確認できる。日額レンタル、PoC 終了後いつでも解放可能。