Agent Firewall 在 AI Agent 与工具调用之间插入授权层,fail-closed 默认拒绝无匹配规则请求,并通过逆向测试持续扩展攻击面覆盖至 1600+ 用例。
AI 智能体正在变得越来越善于使用工具。
它们可以调用 API、访问数据库、执行代码、与 MCP 服务器交互、发送 HTTP 请求,甚至可能执行具有现实世界影响的操作。
这就引出了一个问题:
到底是什么在 AI 智能体和危险的工具调用之间建立起防线?
我决定自己构建这一层防护。
我把它叫做 Agent Firewall(智能体防火墙)。
Agent Firewall 是一个授权与安全层,位于 AI 智能体和他们想要使用的工具之间。
AI Agent --> Agent Firewall --> Allow/Deny/Require Approval --> Tool / API / MCP Server
不同于仅仅因为智能体已通过身份验证就信任它,防火墙会评估该具体操作是否获得授权。
这个项目最初是一个相对简单的策略引擎,后来变得相当庞大。
第一个版本聚焦于基本授权。
一个工具请求可能产生三种结果:
防火墙被设计为fail closed(闭门失败)。如果没有适用的规则,请求不会神奇地放行。
我还开始测试那些不应该工作的场景,而不仅仅是测试正常路径。这成为贯穿整个项目的反复主题。
安全边界需要比普通应用程序更加关注当有人试图突破它时会发生什么。
下一个版本让策略系统更具表达力且更加防御性。
策略获得了以下能力:
测试套件达到了 73 个测试。
此时我开始不再把防火墙当作一个功能,而是当作一条安全边界来对待。
这个区别很重要。
普通应用程序有时可以从意外输入中恢复,而授权层应该坚决说:
未知即拒绝。
一个工具不应该只问:
这个操作允许吗?
而应该问:
这个智能体的这个操作允许吗?
所以 Agent Firewall 变得身份感知。
新增内容:
测试套件达到了 145 个测试。
架构开始变得比一堆 if 语句有趣得多。
智能体名称不是身份。
如果请求只是说:
agent = finance-agent
那么任何能声称这个字符串的人都有可能伪装成该智能体。
所以下一步是加密身份。
Agent Firewall 新增:
测试套件达到了 264 个测试。
这是项目真正开始感觉像安全基础设施而非普通授权库的时刻之一。
身份回答了"智能体是谁"。
但我还需要回答:
智能体实际上被允许做什么?
这引出了基于能力的授权。
能力成为一等公民权限。
finance-agent
+-- payments.send
+-- payments.read
新增内容:
测试套件达到了 390 个测试。
现在智能体可以通过它拥有的权限被识别和约束。
这是一个更大的跨越。
能力本身变成了加密签名的权限。
一个能力可以包含:
Agent | Capability | Issuer | Constraints | Expiration | Signature
我添加了明确的能力命名空间:
payments.send --> payments.* ✅
payments.refund --> payments.* ✅
accounts.read --> payments.* ❌
然后是衰减(attenuation)。
payments.* amount_max = 1000
可以收窄为:
payments.* amount_max = 100
但不能突然变成:
payments.* amount_max = 100000
这自然引入了委托。
一个智能体可以向另一个智能体委托权限,但被委托的权限不能超过原始权限。
还引入了使用 nonce 和能力指纹的重放保护。
测试套件达到了 737 个测试。
此时我有了一个相当严肃的授权模型。
但还有另一个问题。
如果安全系统只保护你应用程序内部的一个函数,那它并没有多大用处。
真实的智能体与外部系统交互。
所以 v0.7 将能力模型推过了实际的协议边界。
Agent Firewall 新增:
POST /payments
--> http.POST.payments
--> Capability verification
--> Authorization
--> Handler
同一安全模型现在可以应用于智能体调用工具的各种不同方式。
然后我遇到了另一个问题。
一个能力不仅仅是一个布尔值,它的生命周期包括:
ISSUED --> DELEGATED --> ATTENUATED --> USED --> REPLAYED --> REVOKED --> EXPIRED
所以 v0.8 引入了明确的能力生命周期追踪。
更重要的是,生命周期和撤销状态变成了持久化的。
我添加了 SQLite 后端存储,使安全状态可以跨越进程重启存活。
这意味着系统可以记住:
v0.8 里程碑达到了 1,438 个通过测试。
如果开发者讨厌集成它,安全基础设施就没多大用。
所以 v0.9 专注于开发者体验。
不再强制开发者手动构造每个授权调用,他们可以使用:
from firewall.protect import protect
@protect(
sdk=sdk,
capability=capability,
)
def send_payment(amount):
return amount
重要的不变式仍然成立:
authorize()
--> ALLOW --> handler()
handler()
--> oops, authorization failed
被拒绝的操作不会到达 handler。
我还添加了可复用的受保护工具:
from firewall.tools import ProtectedTool
tool = ProtectedTool(
sdk=sdk,
capability=capability,
handler=send_payment,
)
v0.9 还引入了厂商中立和厂商专属工具适配器。
项目现在支持以下适配器:
适配器转换提供商特定格式,但不创造权限。授权始终保持在防火墙内部。
厂商中立的请求可以在到达授权层之前被规范化为通用表示。这意味着安全模型不需要在智能体框架每次更改其工具调用格式时都跟着改变。
v0.9 的另一个新增功能是只读解释层。
不创建另一个授权引擎,解释系统读取生命周期历史并回答问题:
这使得调查授权决策变得更加容易,而不会引入第二个事实来源。
v0.9 还引入了 CLI:
firewall --help
firewall init --path firewall.yaml
firewall validate firewall.yaml
firewall inspect-token
firewall explain lifecycle.db
CLI 使用与 SDK 相同的底层 Python API。
一个授权引擎,多种接口。
我还开始将 Hypothesis 与现有的对抗性测试一起使用。
不再只写:
test_input_1
test_input_2
test_input_3
而是描述系统应该维护的属性,让生成的输入探索边界。
属性测试覆盖以下领域:
属性测试不是一张安全证书。
它是另一种发现手动编写的测试可能会错过的奇怪组合的方式。
v1.0 发布版深入加密密钥基础设施。
主要新增之一是通过 SQLite 实现持久化密钥管理。
此前密钥状态只能存在于内存中。
现在密钥管理器可以持久化:
密钥轮换因此可以跨越进程重启存活。
模型大致是:
Active Key
|
+-- rotate --> Retired Key
|
+-- New Key --> Active Key
实现还会检查无效的持久化状态,例如多个活跃密钥。
这很重要,因为加密基础设施不应该悄悄接受损坏或矛盾的安全状态。
系统已经从最初的架构演进了很多:
Agent --> Firewall --> Tool
安全路径现在更接近:
AI AGENT
--> Provider Adapter
--> Tool Normalization
--> Agent Identity
--> Signed Capability
--> Namespace Check
--> Constraints
--> Validity Check
--> Replay Protection
--> Policy
--> Rate Limit / Budget
--> Approval
--> Authorization
|
+-- DENY
|
+-- ALLOW --> Tool Handler --> Real Tool
Persistent Security State
+-- Revocations
+-- Lifecycle
+-- Keys
+-- Audit
工具永远不应该在安全边界授权之前执行。
我真正想要的一个特性是让测试套件与攻击面一起增长。
演进大致如下:
| 版本 | 测试数 |
|---|---|
| v0.2 | 73 |
| v0.3 | 145 |
| v0.4 | 264 |
| v0.5 | 390 |
| v0.6 | 737 |
| v0.8 | 1,438 |
| v0.9 | 1,602 |
测试覆盖以下领域:
测试数量本身不是安全保证。
但看着测试套件与架构一起增长是有用的。
经过所有这些迭代,Agent Firewall v1.0 现已发布。
这个项目最初只是一个小型策略防火墙,后来演变成一个具有以下特性的授权层:
项目现已跨越 1,600+ 测试,涵盖开发版本的所有方面。
但 v1.0 不是终点线。
安全基础设施需要持续测试、加固、审查和审视。
目标是构建一个系统,让 AI 智能体保持强大,而不赋予它们无限权限。
智能体应该强大。他们的权限应该是明确的、有界的、可执行的。
pip install agent-firewall
或者:
git clone https://github.com/Shubhbhangoo/agent-firewall.git
cd agent-firewall
pip install -e ".[dev]"
使用示例:
from firewall.protect import protect
@protect(
sdk=sdk,
capability=capability,
)
def send_payment(amount):
return amount
项目是开源的:
如果你正在从事 AI 智能体、MCP 工具、自动化工作流或安全基础设施方面的工作,我很有兴趣了解你如何处理授权和工具安全。
Agent Firewall v1.0 已发布。🔐