当 AI Agent 调用危险工具时:用开源的 Enforra 实现精准管控
AI 编码 Agent 的强大之处在于它们能调用各种工具——读写文件、执行命令、调用 API、操作数据库。但等等——你确定你的 Agent 不会因为一句误读的 prompt,就跑去执行 rm -rf / 或者给所有用户发退款邮件吗?
现实中,很多团队对 Agent 的控制全靠系统提示词(System Prompt)。但正如 Enforra 项目所说:System prompts are not a security boundary。prompt 可以被覆盖、被注入、被遗忘,真正需要的是在工具调用执行前的硬性控制层。
Enforra 是什么
Enforra 是一个开源的 Action Governance SDK,专门用于 AI Agent 工具调用的审批控制。它在你自己的工具回调函数执行之前介入,返回四种决策之一:
- allow — 允许执行
- block — 直接阻止
- require_approval — 需要人工审批
- log_only — 允许但记录详细日志
关键的特性是:Enforra 纯本地运行,不做任何网络调用,不收集遥测数据,不会替你去执行工具。你拥有全部控制权。
快速上手
Enforra 是基于 Node.js(20+)的 SDK,安装非常简单:
npm install @enforra/sdk-node
然后在代码中初始化客户端并包裹你的工具调用:
import { createEnforraClient } from "@enforra/sdk-node";
const enforra = await createEnforraClient({
policyPath: "./policies/starter/support-agent.yaml",
auditPath: ".enforra/audit.jsonl",
});
const result = await enforra.enforceToolCall({
agent: "coding-agent",
tool: "terminal.run",
args: { command: "npm install express" },
context: { environment: "development" },
execute: async () => {
// 只有 allow 或 log_only 时才会执行到这里
return { exitCode: 0, output: "installed" };
},
});
console.log(result.decision); // "require_approval"
编写安全策略
策略用 YAML 文件定义,支持丰富的匹配条件和运算操作。来看几个实际场景。
场景 1:阻止读取 .env 文件
AI Agent 不应该能随意读取包含密钥的环境变量文件:
version: 1
defaults:
decision: block
policies:
- id: block-env-file-access
match:
tool: filesystem.read
conditions:
- field: args.path
operator: contains
value: ".env"
decision: block
场景 2:npm install 需要审批
安装依赖是一个高风险操作——你不想 Agent 未经确认就安装一个有已知漏洞的包:
- id: approve-package-install
match:
tool: terminal.run
conditions:
- field: args.command
operator: contains
value: "npm install"
decision: require_approval
场景 3:大额退款直接阻止
在客服场景中,限定 Agent 的退款额度:
- id: block-large-refunds
match:
tool: stripe.refund
conditions:
- field: args.amount
operator: gt
value: 500
decision: block
支持的操作符包括:eq、neq、gt、gte、lt、lte、contains、not_contains。条件可以组合使用 all 和 any 逻辑,策略也可以设置 priority 来控制评估顺序。
Observe Mode:先观察再执行
对于已有 Agent 工作流的团队,直接在新环境上设置 block 策略可能过于激进。Enforra 提供了观察模式:
version: 1
mode: observe
defaults:
decision: block
policies:
- id: block-large-refunds
match:
tool: stripe.refund
conditions:
- field: args.amount
operator: gt
value: 500
decision: block
在观察模式下,所有工具调用仍然正常执行,但审计日志会记录「应该被阻止的决策」和「实际执行的决策」。这样你可以在生产环境里安全地验证策略的正确性,确认没有误伤后再切换到强制执行模式。
用 CLI 初始化并测试策略
Enforra 还提供了 CLI 工具,帮助你从零开始搭建策略体系:
npx @enforra/cli init # 创建 starter 策略和测试用例 npx @enforra/cli test # 在本地验证策略决策
策略测试可以在 CI 中运行,防止策略回归导致意外的工具调用放行或阻止。
和其他方案的对比
- System Prompt:最脆弱——prompt 可以被覆盖、被注入,没有硬性约束
- 模型防火墙:在输入输出层面过滤,但无法感知工具调用的上下文和参数语义
- MCP 代理:在 MCP 协议层面拦截,但仅限于 MCP 生态的工具
- Enforra:直接在工具回调执行前拦截,与框架无关,支持任意自定义逻辑
Enforra 的定位最接近「应用层策略引擎」——不关心 Agent 用哪种框架(Claude Code、OpenAI、LangChain 都可以),只关心工具调用即将发生时的参数和环境上下文。
生产实践建议
- 先用观察模式上线:在生产环境跑 24 小时,收集所有工具调用的审计日志
- 从高风险工具开始:优先给
terminal.run、文件写入、数据库操作、支付接口设置策略 - 设置合理的默认行为:
defaults: block是推荐的安全基线,白名单放行 - 审计日志定期检查:
audit.jsonl包含每次决策的完整记录,可以用于合规审计 - 在 CI 中测试策略:防止政策变更意外放行危险操作
总结
Enforra 解决了 AI Agent 工具调用中的一个关键缺口:在工具执行前加一道可控的安全闸门。它的设计非常务实——纯本地运行、不依赖外部服务、配置灵活、支持观察模式渐进式上线。对于在生产环境中使用 AI Agent 的团队来说,这几乎是必备的基础设施。
项目的 GitHub 仓库包含了完整的文档、示例和 CLI 工具,完全开源(Apache-2.0),非常值得一试。