Agent 和人類使用者的權限需求有根本區別
給人類開 SSH 登入權限,人需要什麼資源自己心裡有數;給 AI Agent 同等權限,情況截然不同。
Agent 框架(LangGraph、AutoGen、Cursor Background Agent 等)在執行工具呼叫時,預設繼承當前作業系統使用者的全部權限。
一個被要求"在儲存庫裡找所有 TODO 註釋並整理成 Markdown 表格"的 Agent,完成任務只需要讀 /workspace 和寫一個輸出檔案,
實際上它同時能訪問 ~/Library/Keychains、讀取 SSH 私鑰目錄、或者透過 curl 往外傳資料。
Agent 不會主動做這些,但框架內建的通配 shell 工具或外部外掛可能會觸發這類呼叫——而且它發生時你不一定在螢幕前。
Apple M4 的架構讓這個問題更值得重視,而不是更值得忽視。M4 的 38 TOPS 神經引擎讓本機模型推理成本驟降, AI Agent 在 Mac 上的實際執行頻率比一年前高一個數量級——對應的風險視窗也等比例放大。 OpenClaw 的設計出發點是:Agent 不需要 Docker 隔離(那會失去完整 Xcode 工具鏈), 也不需要每次任務後重建虛擬機器(成本太高),而是在真實 macOS 上透過策略引擎在系統呼叫層攔截越權請求, 策略檔案是一份普通的 YAML,放進 Git 和程式碼一起版本化。
硬體:Mac mini M4 · 10 核 CPU · 16 GB 統一記憶體 · 256 GB NVMe SSD · 1 Gbps 獨享頻寬(VPSRox 新加坡節點)。
系統:macOS 15 Sequoia。OpenClaw CLI 0.9.x,策略格式 v2。
演示任務:在沙箱內克隆公開 GitHub 儲存庫 → 用 rg 掃描 TODO 註釋 → 寫 Markdown 報告,僅讀寫 /workspace,無出站網路權限。
全程透過 SSH 完成,不需要開啟 VNC。
開始前:四項缺一不可的前置條件
整個流程對你的本機系統沒有要求——Windows、Linux 或 macOS 筆記本,只要有 SSH 用戶端就夠。 但以下四項必須在開始前全部就緒,否則會在中間某步卡住。
M4 例項
憑據與埠
instance-token
(第四節提供模板)
M4 例項:還沒開通?進下單頁選節點與租期,付款後 1–5 分鐘例項就緒, SSH 憑據自動出現在控制台「連線資訊」欄。五個節點(新加坡、日本東京、韓國首爾、中國香港、美國東部) 硬體規格與定價一致,建議按你的目標網路延遲就近選擇。
instance-token:在控制台「安全與沙箱」頁面首次開啟 OpenClaw 時產生,頁面只顯示一次, 立即存入團隊金鑰管理工具(1Password、Bitwarden 等)。一旦離開頁面,原 token 不可再查, 只能在同一頁面觸發輪換(舊 token 立即失效)。
控制台開通 OpenClaw
OpenClaw 不是預設啟用的——每臺例項獨立控制,避免不需要稽核的場景承擔額外開銷。 控制台操作路徑很短,目標是把「已啟用」狀態確認到螢幕上再進行下一步。
-
01
進入例項詳情頁
登入 VPSRox 控制台,點選目標例項名稱進入詳情頁。 在「安全與沙箱」標籤下找到 OpenClaw 開關區域。
-
02
開啟並儲存 instance-token
點選啟用開關,頁面彈出
instance-token(格式oct-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。 在關閉彈窗前把 token 複製到金鑰庫,確認儲存後點「我已儲存,繼續」。 -
03
確認狀態為「已啟用」
彈窗關閉後,頁面 OpenClaw 區域應顯示綠色「已啟用」徽章。 若 30 秒後仍顯示「啟用中」,重新整理頁面再確認一次。 這是唯一一步需要在瀏覽器裡做的操作。
CLI 安裝與三項健康核驗
SSH 登入例項後,一行命令安裝 OpenClaw CLI。安裝指令碼會自動檢測 macOS 版本與 CPU 架構, 在 M4 上完成時間通常不超過 30 秒。
curl -fsSL https://api.vpsrox.com/openclaw/install.sh | bash
openclaw auth login --token <instance-token>
openclaw status
openclaw status 應返回三項元件的狀態,每項都必須是 healthy 才能繼續:
| 元件 | 職責 | 期望狀態 |
|---|---|---|
| Policy Engine | 解析 YAML 策略、在系統呼叫前做決策 | healthy |
| Sandbox Runtime | 管理沙箱生命週期、程式隔離與檔案對映 | healthy |
| Audit Bus | 將所有決策事件非同步寫入持久日誌,不阻塞主鏈路 | healthy |
三項全綠是必要條件,不是充分條件——Policy Engine healthy 只代表引擎程式正常,
不代表你的 YAML 語法正確。策略校驗在下一步單獨完成。
若任意一項顯示 degraded 或 unavailable,
先執行 openclaw doctor 檢視自檢報告,常見原因是核心擴充還在等待使用者批准——
在例項上開啟「系統設定 → 隱私與安全性」批准即可(SSH 無法完成此操作,需要 VNC 短暫登入)。
最小權限 YAML:策略欄位逐行解析
策略檔案決定了 Agent 在沙箱內能做什麼、不能做什麼。原則是先嚴後松:
第一份 YAML 只開放任務所需的最小路徑集合,觀察稽核日誌裡的 deny 記錄,
再按實際需要逐步放開,而不是從寬鬆的策略開始事後收緊。
下面是一份適合「克隆公開儲存庫 → 靜態掃描 → 輸出報告」場景的只讀模板,
把它儲存到 ~/policies/quickstart-readonly.yaml。
apiVersion: openclaw.vpsrox.com/v2
kind: SandboxPolicy
metadata:
name: quickstart-readonly
spec:
filesystem:
allow:
- path: /workspace
access: [read, write] # Agent writes scan report here
deny:
- path: "**/Keychains/**" # block signing certificates
- path: "**/.ssh/**" # block private keys
- path: "**/Library/Cookies/**" # block browser session data
process:
allow: [git, rg, python3, zsh, bash]
network:
egress: deny-all # no outbound in quickstart mode
幾個設計決策值得說明。filesystem.deny 優先於 allow:即使 /workspace 整目錄開放了讀寫權限,
deny 列表裡的路徑仍然被阻斷——順序不影響這個優先順序,引擎先檢查 deny 再檢查 allow。
process.allow 是程式名白名單:只有列表裡的執行檔才能被啟動,
如果 Agent 的工具鏈裡有 node 或 npm 需要同步新增,否則呼叫時會報 E_POLICY_DENY: process。
network.egress: deny-all 意味著連 DNS 查詢也會被攔截,這在首次演示中是有意為之的,
目的是讓你在稽核日誌裡看到一條 deny 記錄,確認策略引擎確實在工作。
寫好 YAML 後執行校驗,在建立沙箱之前發現語法錯誤:
openclaw policy validate -f ~/policies/quickstart-readonly.yaml
期望輸出:policy valid (0 warnings)。若有路徑衝突或欄位名拼寫錯誤,validate 會給出具體行號。
提交首個 Agent 任務:建立沙箱並執行
在正式串接 LangGraph 或自研框架之前,建議先用一個確定性的 shell 指令碼跑完整閉環。 這樣做的好處是:指令碼行為可預期,你能清楚地把「策略決策」和「Agent 邏輯」區分開來, 遇到錯誤時知道該改策略還是改 Agent 程式碼。
-
01
建立沙箱
openclaw sandbox create --name quickstart --policy ~/policies/quickstart-readonly.yaml
成功時返回沙箱 ID 和狀態ready。沙箱建立是冪等的——相同名稱重複執行會提示已存在而不會錯誤。 -
02
另開終端,開啟稽核日誌即時跟蹤
openclaw audit tail --sandbox quickstart --follow
這個視窗不要關——你需要同時觀察 Agent 執行與稽核記錄。 每條決策事件在 Agent 操作發生後通常在 50–200 ms 內出現。 -
03
在第一個終端執行 Agent 入口指令碼
先把下方範例指令碼放到
/workspace/agent-entry.sh(宿主機上建立,沙箱自動對映), 然後在沙箱內執行:
openclaw sandbox exec quickstart -- /bin/zsh /workspace/agent-entry.sh -
04
任務結束後停止沙箱
openclaw sandbox stop quickstart
停止後工作區資料保留在宿主機/workspace,下次sandbox create時自動掛載。 若要完全清理,追加--rm引數。
#!/bin/zsh
set -euo pipefail
cd /workspace
# Attempt network — will be denied by policy (intentional demo)
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
因為 network.egress: deny-all,git clone 會被網路策略攔截,指令碼輸出 "clone blocked (expected)"——
這是預期結果,目的正是讓稽核日誌產生一條 decision: deny 的 network 事件,
供你在下一節核對日誌結構。如果指令碼能到達 rg 步驟,說明 /workspace 的檔案系統權限設定正確。
我們在 M4 新加坡節點測得完整指令碼(含被攔截的 clone)執行時間約 2.3 秒,
策略引擎決策累計開銷不超過 80 ms。
稽核日誌解讀:每一行記錄的含義
稽核日誌是 OpenClaw 與其他沙箱方案的核心差異所在。它不是事後報告, 而是與策略決策同步產生的即時事件流,可以在任務進行中檢視,也可以事後匯出。 每條記錄包含固定的欄位集合,理解欄位含義才能從日誌裡發現問題。
一條典型的 allow 記錄(檔案讀取)格式如下:
ts=2026-07-24T08:03:12.481Z
sandbox=quickstart
pid=8231
syscall=open
resource=filesystem
path=/workspace/agent-entry.sh
access=read
decision=allow
policy_rule=filesystem.allow[0]
latency_us=34
latency_us 是策略引擎做出決策耗費的微秒數;policy_rule 指向觸發決策的具體 YAML 規則索引,
方便你快速定位是哪一條 allow 或 deny 在生效。
一條 deny 記錄(網路被阻斷)格式如下:
ts=2026-07-24T08:03:12.512Z
sandbox=quickstart
pid=8233
syscall=connect
resource=network
dst=140.82.113.4:443
decision=deny
policy_rule=network.egress.deny-all
latency_us=19
這條記錄對應 Agent 腳本裡被攔截的 git clone。
dst=140.82.113.4:443 是 GitHub 的 IP,你可以據此在策略裡新增精準白名單:
把 network.egress 改為 allow-list 並加入 github.com:443,
重新 validate 後在沙箱裡重建策略(openclaw sandbox update --name quickstart --policy ...),
無需銷燬重建沙箱。
常用的日誌查詢命令:
檢視最近 1 小時內所有 deny 記錄:openclaw audit query --decision deny --since 1h。
按路徑過濾:openclaw audit query --resource filesystem --path "/workspace/**"。
匯出為 JSON(供 SIEM 或自動化指令碼處理):openclaw audit export --sandbox quickstart --since 24h --format json > audit.json。
六類常見錯誤與定位思路
首次上手幾乎每個人都會遇到以下至少一條。這張表按實際發生頻率排序, 每條錯誤給出根本原因與最短修復路徑,不需要翻完整檔案。
| 錯誤現象 | 根本原因 | 最短修復 |
|---|---|---|
auth login 提示 token 無效 |
複製時前後有空格,或 token 已被輪換 | 重新在控制台「安全與沙箱」頁面複製;使用 pbpaste 驗證剪貼簿內容無多餘字元 |
openclaw status 某項顯示 unavailable |
核心擴充等待使用者批准(首次安裝) | 用 VNC 登入例項 → 系統設定 → 隱私與安全性 → 批准 OpenClaw 系統擴充 → 重啟 CLI 服務 |
policy validate 報 unknown field |
YAML 欄位名拼寫錯誤,或使用了 v1 格式的舊欄位名 | 檢查 apiVersion 是否為 openclaw.vpsrox.com/v2;參考本文第五節模板 |
E_POLICY_DENY: filesystem |
Agent 訪問了 YAML allow 列表以外的路徑 | openclaw audit query --decision deny --since 1h 找目標路徑,按需補入 filesystem.allow |
E_POLICY_DENY: process |
Agent 呼叫了 process.allow 白名單以外的執行檔 |
稽核日誌查 resource=process 的 deny 記錄,把對應程式名加入白名單 |
沙箱內 git clone 超時但沒有 deny 日誌 |
DNS 解析被攔截,但 connect 還沒到 deny 就超時了 |
加 --verbose 檢視 git 輸出;在 YAML 網路允許列表裡同時加 8.8.8.8:53 或使用域名白名單模式 |
instance-token 等效於例項的高權限憑據,不要把它寫程序式碼註釋、.env 檔案或 Git 提交裡。
生產環境多人連線時,建議在控制台為每位成員設定獨立的零信任裝置證書與最小權限角色(viewer / operator / admin),
而不是共享同一個 instance-token。
從快速試驗到穩定 Agent 工作流
五分鐘跑通只讀沙箱是驗證環境的起點,真正的生產場景遠比這複雜:
Agent 要調 xcodebuild(需要開放更多程式和臨時目錄)、訪問 npm 或 PyPI(需要精細的出站網路白名單)、
在 CI 管道裡每次 pull request 自動建立和銷燬沙箱(需要 REST API 或 GitHub Actions 整合)。
這些場景有一個共同的擴充路徑:先用稽核日誌的 deny 記錄驅動策略迭代,而不是從寬鬆策略開始猜測。
關於算力:單臺 Mac mini M4 · 16 GB 統一記憶體的實測資料是,可以穩定並行執行 2 個包含 DerivedData 快取的 xcodebuild 沙箱,
同時額外保留約 4 GB 給 OpenClaw 稽核程式與系統服務。如果 Agent 工作負載繼續增長,
VPSRox 的 Thunderbolt 5 並聯服務可以把多臺 Mac mini 組成 80 Gbps 高速叢集,
策略檔案仍然在每臺例項上獨立管理,OpenClaw 的稽核日誌也是按例項隔離儲存的。
對於還沒有專屬雲端 Mac 的團隊,常見替代方案有幾條明顯侷限值得提前知道。 本機開發機器 7×24 跑後台 Agent 會干擾日常開發,散熱問題在持續高負載下尤其明顯; 公有云 macOS 虛擬機器(如 GitHub Actions 的託管 macOS Runner)共享資源池、不內建 OpenClaw 原生整合, 且高峰期排隊延遲對互動式 Agent 工作流影響顯著;自購 Mac mini 擺在辦公室則要承擔硬體折舊、 維護人力與固定公網 IP 設定成本。
VPSRox 提供獨享物理 Mac mini M4(10 核 CPU · 16 GB 統一記憶體 · 256 GB NVMe · 38 TOPS 神經引擎), OpenClaw 隨標準例項內建無需額外設定,五個節點(新加坡、日本東京、韓國首爾、中國香港、美國東部) 各配獨立公網 IPv4 與 1 Gbps 獨享頻寬,付款後 1–5 分鐘交付,按天 $21.8 起租。 Agent 實驗階段按天開通,驗證穩定後轉按月 $109.1 長期使用,不繫結合同,任何時候都可以調整租期。
給 AI Agent 一臺內建 OpenClaw 的專屬雲端 Mac
VPSRox Mac mini M4 獨享節點,OpenClaw 隨例項內建:策略引擎 + 沙箱執行時 + 稽核匯流排, 開箱即用,無需自行部署。16 GB 統一記憶體與 38 TOPS 神經引擎讓 Agent 推理與 macOS 工具鏈並行, 全球五節點獨立 IPv4,按天租賃無合同鎖定。