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,按天租用无合同锁定。