裸跑 Agent 与沙箱跑 Agent:权限面差在哪里
人类开发者登录 SSH 后,通常清楚自己不会误删 ~/.ssh 或导出 Distribution 证书;AI Agent 则不同——框架在调用 shell、文件、网络工具时,默认继承当前 macOS 用户的完整权限。一个任务描述为「扫描仓库 TODO 并输出 Markdown 报告」的 Agent,理论上只需要读项目目录和写一个输出文件,实际上却能触达钥匙串、浏览器 Cookie、任意出站 HTTP 请求。
容器化能隔离进程,但在 macOS 上会牺牲完整 Xcode 工具链与 Apple 原生框架;每次任务重建虚拟机又太慢。OpenClaw 走第三条路:在真实 macOS 上,用 YAML 策略在系统调用层做 allow/deny 决策,同时把每条决策写入审计流。Agent 仍可使用 M4 的 38 TOPS 神经引擎做本地推理,但越权读写会被即时拦截。
本文演示任务很具体:在沙箱内对已有代码快照做静态扫描(rg 搜 TODO/FIXME),尝试一次会被策略拒绝的 git clone,最后把报告写到 /workspace。验收标准是:脚本跑完、审计日志里同时出现 allow 与 deny 事件、你能从日志字段反查到触发的 YAML 规则。
硬件:JexMac 日本(东京)节点 · Mac mini M4 · 10 核 CPU · 16 GB 统一内存 · 256 GB NVMe · 1 Gbps 独享带宽。系统:macOS 15 Sequoia。OpenClaw CLI 0.9.x,策略格式 v2。全程通过 SSH 完成,内核扩展批准步骤需短暂 VNC 登录一次。
动手前:四项前置条件一次性核对
本地笔记本可以是 Windows、Linux 或 macOS,只要有 SSH 客户端即可;但以下四项缺任意一项,流程会在中途卡住。
- 已交付的 JexMac 实例:控制台「接入信息」里能看到 SSH 地址与端口。五处节点——新加坡、日本(东京)、韩国(首尔)、中国香港、美国东部——规格与定价一致,Agent 实验建议按目标 API 延迟就近选区。
- OpenClaw instance-token:在控制台「安全与沙箱」首次启用时生成,格式类似
oct-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,页面只显示一次,须立即存入 1Password / Bitwarden 等密钥库。 - 工作目录
/workspace:宿主机上预先创建,沙箱会把该路径映射为 Agent 的可读写区。不要把私钥或 p12 放进此目录。 - 至少一份策略 YAML:第四节提供只读模板;原则是先严后松,用 deny 日志驱动后续放权。
控制台开通 OpenClaw 并保管 instance-token
OpenClaw 并非默认开启——每台物理实例独立控制,避免不需要审计的场景承担额外开销。浏览器里只需完成下面三步,其余全部在 SSH 里进行。
-
01
进入实例详情 →「安全与沙箱」
登录 JexMac 控制台,打开目标 Mac mini 实例,找到 OpenClaw 开关区域。若实例刚交付(1–5 分钟内),等待状态变为「运行中」再操作。
-
02
启用并复制 token
点击启用,弹窗展示
instance-token。确认已写入密钥库后,点「我已保存,继续」。切勿把 token 贴进 Slack、工单或 Git 提交。 -
03
确认徽章为「已启用」
若 30 秒内仍显示「启用中」,刷新页面。绿色徽章出现即可关闭浏览器,后续用 CLI 操作。
SSH 安装 CLI 与三项组件健康检查
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 必须三项均为 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
策略文件决定 Agent 能读哪些路径、能启动哪些进程、能否访问外网。推荐工作流:第一份 YAML 只开放任务必需的最小集合 → 跑任务 → 查 deny 日志 → 按需追加 allow 规则,而不是从「全开放」事后收紧。
将下面内容保存为 ~/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
三个设计要点: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即可。同名沙箱重复 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。若 rg 步骤正常完成,说明文件系统 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,把 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/**" - 导出 JSON 供 SIEM:
openclaw audit export --sandbox agent-demo --since 24h --format json > audit.json
六类高频报错与最短修复路径
| 报错现象 | 根本原因 | 处理办法 |
|---|---|---|
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、在 CI 里按 PR 自动创建销毁沙箱——扩展路径始终是用 deny 日志驱动策略迭代,而不是猜测权限。
算力方面,单台 Mac mini M4 · 16 GB 实测可并行 2 个含 DerivedData 的构建沙箱,另留约 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 随标准实例内置,五节点各配独立公网 IPv4 与 1 Gbps 带宽,付款后 1–5 分钟交付,按天 $21.5 起租、按月 $107.3,无合同锁定。Agent 实验阶段按天开通,策略稳定后转按月即可。
在隔离 macOS 里跑你的第一个 Agent
文中命令已在 JexMac Mac mini M4 物理节点验证。开通实例 → 启用 OpenClaw → 按本文策略提交任务,一小时内可看到首条审计记录。按天起租,PoC 结束随时释放。