AI Agent 跑在 macOS 上,为什么必须加沙箱
过去一年,Cursor、Windsurf 等 AI 编程工具把「让模型改代码」变成了日常操作。
但当 Agent 从 IDE 插件扩展到自主执行 shell、读写密钥、调用系统 API时,
风险模型完全不同:它不再只是建议 diff,而是会以你的用户身份在机器上真实落盘。
我们在内部测试中发现,未加约束的 Agent 在一次多文件重构任务里曾尝试写入
~/.ssh/id_ed25519 同级目录、并调用 security find-identity 枚举钥匙串——
这些操作对开发者本地机也许可接受,对承载 CI 签名密钥的云端 Mac 却是红线。
传统做法是用 Docker 或虚拟机做隔离,但 macOS 上的容器方案要么无法访问完整 Xcode 工具链, 要么与 Apple 签名体系不兼容。另一条路是给 Agent 一台专用物理机, 再通过策略引擎把文件系统、网络、进程三个维度锁死在白名单内——这正是 OpenClaw 的设计出发点。 它运行在 PixVPS 独享 Mac mini M4 节点上,与宿主系统共享 Apple Silicon 算力, 却在操作层提供独立审计与权限边界,让 Agent 能干活、又碰不到不该碰的资源。
硬件:Mac mini M4 · 10 核 CPU · 16 GB 统一内存 · 256 GB NVMe · 1 Gbps 独享带宽(PixVPS 新加坡节点)。
系统:macOS 15 Sequoia。OpenClaw CLI 0.9.4,策略格式 v2。
Agent 运行时:自研编排脚本 + LangGraph 0.2;对照任务为「扫描仓库 → 生成补丁 → 跑单元测试」。
接入:SSH 零信任令牌 + 控制台 VNC 旁路观察。
OpenClaw 架构:三层隔离模型
可以把 OpenClaw 理解成叠在 macOS 之上、Agent 之下的策略与审计中间层,由三个组件协同工作:
- 策略引擎(Policy Engine):读取 YAML 声明式规则,在 Agent 每次系统调用前做 allow/deny 判定;拒绝时返回结构化错误码,供编排层重试或降级。
- 沙箱运行时(Sandbox Runtime):为每个 Agent 会话挂载独立的可写工作区,默认只暴露
/workspace与显式白名单路径;对~/Library/Keychains、/etc等敏感区一律拦截。 - 审计总线(Audit Bus):把所有文件读写、子进程启动、网络出站记录为 JSON 行日志,支持按会话 ID、策略版本、时间窗口检索,保留期默认 90 天。
与「整机重装」或「换用户账号」相比,OpenClaw 的优势在于策略可版本化、可回滚:
同一台 M4 节点上可以并行跑「只读代码分析 Agent」和「可写 /workspace 的构建 Agent」,
各自绑定不同 YAML,互不干扰。M4 的 38 TOPS Neural Engine 算力仍由宿主独占,沙箱层几乎不增加推理延迟——
我们在 200 次连续工具调用压测中,策略判定平均开销 1.8 ms,可忽略。
控制台开通与环境准备
OpenClaw 随 PixVPS 标准 Mac mini M4 实例一并提供,无需单独购买附加项。 若你尚未有云端节点,先在下单页选择区域与租期—— 付款后 1–5 分钟内 SSH 凭据会出现在工作台。以下步骤假设你已能 SSH 登录实例。
-
01
在工作台启用 OpenClaw
进入实例详情 →「安全与沙箱」→ 打开 OpenClaw 开关。首次启用会生成实例级
instance-token,仅显示一次,请立即保存到团队密钥库。 -
02
安装 CLI 并绑定实例
SSH 登录后执行下方命令。CLI 通过 PixVPS 软件源分发,与系统 Python / Homebrew 无冲突。
-
03
验证守护进程与健康检查
运行
openclaw status,确认 Policy Engine、Sandbox Runtime、Audit Bus 三项均为healthy。
在实例 SSH 会话中执行:
curl -fsSL https://api.pixvps.com/openclaw/install.sh | bash
openclaw auth login --token <instance-token>
openclaw status
建议把 instance-token 存入 1Password / Bitwarden 等项目密钥库,而非明文写在仓库里。
若 token 泄露,可在控制台「轮换实例令牌」使旧 token 立即失效,不影响已运行的沙箱会话,但新会话须用新 token 鉴权。
CLI 命令与首个沙箱任务
OpenClaw CLI 的设计目标是「运维人员能在 SSH 里完成 90% 操作」,图形界面仅用于审计检索与紧急旁路。 下面是一套最小可运行流程:创建沙箱 → 绑定策略 → 在沙箱内执行 Agent 脚本。
openclaw sandbox create --name dev-agent --policy ./policies/readonly.yaml
openclaw sandbox exec dev-agent -- /bin/zsh -lc 'ls -la /workspace'
openclaw sandbox list
openclaw sandbox stop dev-agent
sandbox create 会在 /var/openclaw/sandboxes/<id>/ 下分配独立工作区,
并把策略文件哈希写入审计日志,便于事后追溯「当时允许了哪些路径」。
sandbox exec 是调试利器:在接入完整 Agent 编排之前,先用它验证策略是否过严或过松。
我们在首个任务里让 Agent 克隆私有 Git 仓库并跑测试。踩坑点:默认策略禁止访问 ~/.gitconfig,
导致 HTTPS 凭据读取失败。解法是在策略里为 ~/.gitconfig 增加只读白名单,或改用 SSH deploy key 并单独授权 ~/.ssh/deploy_key。
权限 YAML:从只读到可写构建
策略文件采用声明式 YAML,版本字段 apiVersion: openclaw.pixvps.com/v2。
核心结构分 filesystem、process、network 三块;
每块支持 allow 列表与 deny 列表,deny 优先于 allow。
apiVersion: openclaw.pixvps.com/v2
kind: SandboxPolicy
metadata:
name: readonly-analyzer
spec:
filesystem:
allow:
- path: /workspace
access: [read]
deny:
- path: "**/Keychains/**"
- path: "**/.ssh/**"
process:
allow: [git, rg, python3]
network:
egress: deny-all
构建类 Agent 需要写 /workspace、调用 xcodebuild 并访问 npm registry。
此时把 filesystem.allow 中 /workspace 的 access 改为 [read, write],
在 process.allow 加入 xcodebuild、swift、npm,
并把 network.egress 改为 allow-list 并列出 registry.npmjs.org:443、github.com:443 等域名。
| Agent 场景 | 文件系统 | 进程白名单 | 网络 |
|---|---|---|---|
| 静态代码审查 | /workspace 只读 |
git, rg, python3 | 禁止出站 |
| iOS 构建 Agent | /workspace 读写;钥匙串路径 deny |
xcodebuild, codesign, fastlane | Apple / GitHub 域名白名单 |
| 文档抓取 Agent | /workspace 读写 |
curl, python3 | 指定文档站 HTTPS |
| 运维巡检 Agent | 只读系统日志路径 | log, df, top | 禁止出站 |
策略变更用 openclaw policy apply -f ./policies/build.yaml --sandbox dev-agent 热更新;
引擎会校验 YAML 语法与路径冲突,拒绝「同时 allow 和 deny 同一路径」的配置。
建议把策略文件纳入 Git 仓库,在 PR 里做 code review——权限扩张与业务代码变更同等重要。
多用户零信任接入
生产环境里往往不止一位工程师需要观察或调试 Agent,但又不应共享同一个 SSH 私钥。 OpenClaw 与 PixVPS 零信任网关集成:每位用户在控制台「团队成员」页面领取个人设备证书, 经 MFA 验证后获得时效性 SSH 证书(默认 8 小时),而非长期密码。
角色分三级:viewer 只能读审计日志;operator 可创建/停止沙箱、执行 sandbox exec;
admin 可修改策略与轮换令牌。角色绑定在控制台完成,CLI 侧用 openclaw auth whoami 可查看当前身份。
切勿把 instance-token 写入 GitHub Actions 明文 secret 并触发 fork PR 工作流——
与 CI Runner 令牌同理,应在仓库设置中限制 workflow 触发范围,或使用 PixVPS 提供的短期 OIDC 联合令牌。
离职成员务必在控制台立即吊销其设备证书,审计日志会保留该用户历史操作记录。
CI/CD 与自动化流水线集成
当 Agent 任务从「人工触发」变为「每次 push 自动跑」,需要把 OpenClaw 会话纳入流水线编排。
典型架构:GitHub Actions self-hosted Runner 跑在同一台 PixVPS M4 节点上,
workflow 步骤里先 openclaw sandbox create,再在里面执行 Agent 入口脚本,最后 sandbox stop 并上传审计摘要。
- name: Run Agent in OpenClaw sandbox
run: |
openclaw sandbox create --name ci-${{ github.run_id }} \
--policy ./ops/openclaw/ci-build.yaml
openclaw sandbox exec ci-${{ github.run_id }} -- \
./scripts/agent-entry.sh
openclaw audit export --sandbox ci-${{ github.run_id }} \
--format jsonl -o ./audit-${{ github.run_id }}.jsonl
openclaw sandbox stop ci-${{ github.run_id }}
Jenkins 侧可封装为共享 Pipeline 库函数,在 post { always { ... } } 块强制导出审计,
避免 Agent 失败后仍遗留僵尸沙箱占用磁盘。我们实测单沙箱工作区峰值约 2.4 GB(含 DerivedData),
16 GB 统一内存的 M4 节点可同时跑 2 个构建沙箱而不触发 swap;更多并行请考虑 TB5 多机并联或拆分 Runner。
审计日志检索与常见故障排查
审计是 OpenClaw 的生产价值核心。每次拦截与放行都会写入 Audit Bus,字段包括
timestamp、sandbox_id、policy_hash、action、target、decision、actor。
CLI 检索示例:
openclaw audit tail --sandbox dev-agent --follow 实时跟踪;
openclaw audit query --since 24h --decision deny 查看近 24 小时被拒绝的操作;
openclaw audit export --format jsonl -o audit.jsonl 导出做法务或 SOC2 证据链。
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
openclaw status 显示 Audit Bus unhealthy |
磁盘占用超过 85%,日志轮转失败 | 执行 openclaw audit vacuum --before 30d 或扩容 SSD 附加项 |
Agent 报 E_POLICY_DENY: filesystem |
策略未白名单目标路径 | audit query --decision deny 确认路径后更新 YAML |
sandbox create 超时 |
并发沙箱数达到实例上限(默认 5) | sandbox list 清理僵尸会话,或调控制台配额 |
| 网络请求被拦但域名已加入白名单 | 未写端口或 CDN CNAME 未覆盖 | 用 *:443 模式或抓包核对真实连接目标 |
| SSH 证书登录失败 | 设备证书过期或 MFA 未续期 | 控制台重新签发;检查本机系统时间 |
若策略引擎本身异常,控制台提供「安全旁路」开关——仅限 admin 角色、且每次启用最长 15 分钟,
所有旁路操作会以最高级别写入审计。生产环境除非 P0 事故,不建议开启。
上生产:在云端 Mac 按节奏部署 Agent 沙箱
回到最初的问题:Agent 需要 macOS,但又不该在裸机上乱跑—— 自建办公室 Mac 要承担电费与运维,公有云 macOS 实例往往虚拟化且缺少 OpenClaw 这类操作级审计。 PixVPS 的方案是独享物理 Mac mini M4 + 原生 OpenClaw 集成: 付款后 1–5 分钟交付,SSH / VNC 接入,五节点(新加坡、日本东京、韩国首尔、中国香港、美国东部)按延迟选择, 按天 $21.1 起租,Agent 实验期用完即释,稳定后再转按月 $105.7 常驻。
推荐落地路径:先在单节点用只读策略跑通 Agent 逻辑 → 逐步放开 /workspace 写权限与网络白名单 →
将策略 YAML 纳入 Git 并接入 CI → 为团队成员配置零信任证书分级授权。
需要跑本地模型推理时,M4 的 38 TOPS Neural Engine 可在沙箱外做端侧加速,与沙箱策略正交、互不干扰。
更短的五分钟入门可参考同系列的OpenClaw 沙箱快速上手一文。
-
01
选择节点并开通实例
在下单页选定区域与租期,付款后于工作台启用 OpenClaw 并保存 instance-token。
-
02
安装 CLI、提交首份只读策略
用
sandbox exec验证 Agent 入口脚本在约束下可运行,再逐步放开写权限。 -
03
接入 CI 与团队零信任
workflow 中强制导出审计;为成员分配 viewer / operator / admin 角色,定期轮换令牌。
AI Agent 上生产的门槛,不在于模型多强,而在于每一次系统调用是否可预期、可追溯、可回滚。 OpenClaw 把这件事拆成了可版本化的 YAML 与可检索的审计日志; PixVPS 则提供不被虚拟化稀释的 Apple Silicon 算力与分钟级交付。 两者组合,是在 macOS 上跑自动化 Agent 时,兼顾效率与合规的一条务实路径。
给 AI Agent 一台带 OpenClaw 沙箱的云端 Mac
PixVPS Mac mini M4 独享节点内置 OpenClaw:操作级隔离、零信任接入、90 天审计保留, 16 GB 统一内存与 38 TOPS 端侧推理,按天 $21.1 起,全球五节点可选。