AI Agent 正在从”聊天助手”演变为”自主执行者”——它们读写文件、调用 API、操作数据库。但一个能执行 shell 命令的 Agent,谁来监控它发出的每一个 LLM 请求?
问题:Agent 的盲区
在 OpenClaw 这样的 Agent 平台中,Agent 与 LLM 之间的通信是一个黑箱。Agent 发送的 prompt 可能包含用户的 API key、数据库密码、信用卡号,而这些内容会直接传给云端 LLM 提供商。
更隐蔽的问题是 tool call:Agent 调用的工具可能触发危险操作——删除文件、发送邮件、修改配置——而平台本身缺乏细粒度的安全审计。
方案:Bastion 作为 Agent 的安全层
Bastion 是一个本地运行的 HTTPS 代理,部署在 Agent 和 LLM 提供商之间。所有请求经过 Bastion 时,会自动进行:
- DLP 扫描。 检测 prompt 和 response 中的敏感信息(API key、密码、PII),支持 pass/warn/redact/block 四种策略。
- Tool Guard 监控。 审计 Agent 的 tool call,识别高风险操作,按规则告警或拦截。
- 审计日志。 记录每一次 LLM 交互的完整元数据——provider、model、token 用量、延迟。
- 零云依赖。 所有处理在本地完成,敏感数据不会发送到任何第三方服务。
集成:4 步完成
我们将 Bastion 封装为 OpenClaw skill,整个安装过程只需 4 步:
- 复制 skill 文件到
~/.openclaw/skills/bastion/ - 在
openclaw.json中添加"alsoAllow": ["exec", "read"]开启 Agent 权限 - 运行
docker-setup.sh在容器内安装 Bastion - 重启 OpenClaw,开新会话验证
安装完成后,Agent 可以直接查询 DLP 发现、查看使用统计、调整安全策略——全部通过自然语言。
踩过的坑
Docker 环境带来了一系列工程挑战:
ESM 模块解析。 skill 脚本运行在 ~/.openclaw/ 目录,而 @aion0/bastion 安装在 /app/node_modules/。Node.js ESM 按脚本路径解析依赖,NODE_PATH 对 ESM 无效。最终方案是读取 package.json 的 exports 字段,用 pathToFileURL() 动态导入。
原生模块编译。 better-sqlite3 需要 native binding,pnpm add 默认跳过编译。setup 脚本中加入了 prebuild-install fallback。
容器生命周期。 docker compose down/up 会销毁所有运行时安装的包。我们用一键脚本解决重装问题,并建议用 restart 替代 down/up。
权限模型。 OpenClaw 的 tool profile 系统默认给 messaging 场景的 Agent 只分配消息相关工具。通过 alsoAllow 机制追加 exec 和 read,不需要切换到 coding profile。
安全即基础设施
在传统软件中,安全是防火墙和 WAF 的事。在 Agent 时代,安全需要嵌入到 Agent 的通信链路中——它不是事后审计,而是实时拦截。
Bastion 的定位就是这个”嵌入层”:它不改变 Agent 的行为,只是让每一次 LLM 交互变得可见、可审计、可控制。