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 时,会自动进行:

  1. DLP 扫描。 检测 prompt 和 response 中的敏感信息(API key、密码、PII),支持 pass/warn/redact/block 四种策略。
  2. Tool Guard 监控。 审计 Agent 的 tool call,识别高风险操作,按规则告警或拦截。
  3. 审计日志。 记录每一次 LLM 交互的完整元数据——provider、model、token 用量、延迟。
  4. 零云依赖。 所有处理在本地完成,敏感数据不会发送到任何第三方服务。

集成:4 步完成

我们将 Bastion 封装为 OpenClaw skill,整个安装过程只需 4 步:

  1. 复制 skill 文件到 ~/.openclaw/skills/bastion/
  2. openclaw.json 中添加 "alsoAllow": ["exec", "read"] 开启 Agent 权限
  3. 运行 docker-setup.sh 在容器内安装 Bastion
  4. 重启 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 机制追加 execread,不需要切换到 coding profile。

安全即基础设施

在传统软件中,安全是防火墙和 WAF 的事。在 Agent 时代,安全需要嵌入到 Agent 的通信链路中——它不是事后审计,而是实时拦截。

Bastion 的定位就是这个”嵌入层”:它不改变 Agent 的行为,只是让每一次 LLM 交互变得可见、可审计、可控制。

开源地址:github.com/aiwatching/bastion-skills