strathon/strathon
GitHub: strathon/strathon
Strathon 是一款开源 AI agent 防火墙,通过 CEL 策略在工具调用执行前进行实时拦截和管控,帮助团队防止 agent 的危险操作并满足合规要求。
Stars: 0 | Forks: 0
Strathon 是一个**针对 AI agent 的开源防火墙**:它根据 [CEL](https://cel.dev) 策略评估每一次工具调用,并在其执行**之前**阻止危险的调用。
一个读取不可信内容的 agent,最终会被该内容指示去滥用其工具。真正关键的时刻在于工具调用:实际发送的电子邮件、实际运行的 shell 命令、实际发出的请求。大多数 agent 工具都是在事后记录哪里出了问题。而 Strathon 在工具调用边界进行进程内强制执行,此时调用仍然可以被停止。
强制执行在三个层面上运行,因此无论 agent 如何与外界通信,调用都会受到管控。**SDK** 在你的 agent 进程内评估策略(无代理跳转,无延迟开销),并且开箱即用支持 10 个框架。**MCP 网关**内置在接收器中,可审查任何指向它的 MCP 客户端。**出口代理**是一个独立的进程,你部署它来管理任何 SDK 都无法看到的原始出站 HTTP。这里有一个不变的规则:如果遇到无法完全执行策略的表面,它将执行失败关闭,即阻止并记录,绝不会默默地允许。
七种强制执行操作。10 个框架集成。1,400 多项测试。仅需一个 PostgreSQL,几分钟即可完成自托管。
## 快速开始
从零开始,观看 Strathon 阻止真实的工具调用。
### 1. 启动服务器
```
git clone https://github.com/strathon/strathon.git
cd strathon && docker compose up -d
```
Dashboard 在 `http://localhost:3000` 打开,接收器 API 在 `http://localhost:4318` 打开。注册第一个账户(它将成为项目所有者),并从 Settings → API Keys 获取 API 密钥。
### 2. 编写策略
在 dashboard(Policies → New)中,创建一个操作为 **block** 的策略:
```
attrs["gen_ai.tool.name"] == "send_email"
&& attrs["strathon.tool.args"].contains("competitor.com")
```
策略是基于调用属性(工具名称、其参数、模型、token 使用情况、agent 的身份)的 CEL 表达式。还不确定?将策略的状态设置为 **shadow**,Strathon 将记录它*原本会*阻止的每一个调用,但不实际执行任何阻止操作。
### 3. 连接你的 agent
```
pip install "strathon[langgraph]"
```
```
from strathon import Client, instrument
client = Client(
api_key="stra_...", # from dashboard → Settings → API Keys
endpoint="http://localhost:4318",
)
instrument(client, frameworks=["langgraph"])
```
你现有的 LangGraph agent 无需更改。Strathon 会对框架进行插桩,并在每次工具调用和模型请求时评估策略。
### 4. 观看调用被阻止的过程
```
from strathon import StrathonPolicyBlocked
try:
agent.invoke({"messages": [{"role": "user",
"content": "Email the Q3 numbers to sales@competitor.com"}]})
except StrathonPolicyBlocked as e:
print(f"Blocked by policy: {e.policy_name}")
```
`StrathonPolicyBlocked` 在工具调用执行**之前**被引发。函数体永远不会运行。决策连同匹配的策略、trace context 和时间戳一起进入审计追踪。
## 故障语义
当防火墙的控制平面无法访问时,其行为也是其契约的一部分,以下是 Strathon 的行为。策略在你的 agent 进程内针对本地缓存的状态进行评估,因此接收器的短暂中断不会给工具调用增加延迟。默认情况下,SDK 是**故障放行**的:如果它无法连接到接收器以刷新策略或停止状态,agent 将继续运行而不是停滞。对于安全关键的 agent,如果无法访问的接收器应该*停止*工具调用,请启用故障关闭模式:
```
client = Client(
api_key="stra_...",
endpoint="http://localhost:4318",
fail_closed=True, # block when state can't be verified
fail_closed_max_staleness_sec=60, # how stale cached state may be first
)
```
故障放行优先考虑正常运行时间,故障关闭优先考虑隔离控制。请谨慎选择。完整契约请参见 [docs/intervention](https://getstrathon.com/docs/intervention)。
## 核心功能
### 策略引擎
使用 [CEL](https://cel.dev)(通用表达式语言,Kubernetes、Firebase 和 Google Cloud IAM 使用的同一种语言)编写规则。七种强制执行操作:**block**、**steer**、**throttle**、**log**、**alert**、**require_approval**、**allow**。策略在 agent 进程内进行评估,具有亚毫秒级的开销,而不是在网络网关处。12 个 OWASP 映射模板,支持一键设置。Shadow 模式针对实时流量进行评估和记录,但从不实际执行,因此你可以在启用之前验证策略的匹配率。[了解更多 → getstrathon.com/docs/intervention](https://getstrathon.com/docs/intervention)
### 人工批准工作流
暂停 agent,直到操作员在 dashboard、Slack 或 Discord 中批准或拒绝。针对金融交易或数据删除等高风险操作的多方批准 (N-of-M)。未决定的请求会自动过期,因此未答复的批准将执行失败关闭,而不是让 agent 一直挂起。在可以暂停的表面上(异步预执行钩子、工具调用包装、CrewAI),SDK 会保持调用直到做出决定;在无法暂停的同步回调表面上(LangGraph、LangChain、Pydantic AI),匹配到的批准将执行失败关闭,即阻止并记录。各表面的支持矩阵详见文档。[了解更多 → getstrathon.com/docs/intervention](https://getstrathon.com/docs/intervention)
### MCP 安全网关
对你从未插桩的工具执行策略。将任何 MCP 客户端指向接收器的 `/v1/mcp/proxy` endpoint,每个 `tools/call` 在到达服务器之前都会进行评估:被阻止的调用将作为 JSON-RPC 错误返回,而不是被执行;被引导的调用将直接返回替换结果,而无需联系上游工具;`tools/list` 会被过滤,因此被阻止的工具根本不会出现在模型的 context 中。响应在返回途中会被扫描以检查是否泄露凭据。如果无法加载或评估策略,则调用将被阻止,而不是被允许。[了解更多 → getstrathon.com/docs/mcp](https://getstrathon.com/docs/mcp)
### 出口代理
管理任何 SDK 都无法看到的流量。在 agent 前面运行代理,设置 `HTTP_PROXY`,来自任何库(无论是否插桩)的每个出站请求都会根据相同的策略集进行评估:调用带有工具名称 `http.
` 和完整的 URL,因此阻止你的 agent 访问某个域的策略也会阻止第三方依赖项访问它。在请求体中检测到凭据将直接阻止请求;在响应中检测到凭据则会在 agent 读取之前进行脱敏。目前以显式 `HTTP_PROXY` 模式作为独立的 mitmproxy 进程运行;透明拦截已在路线图上。[了解更多 → getstrathon.com/docs/egress](https://getstrathon.com/docs/egress)
### 凭据泄露检测
捕获传输中的机密信息。超过 50 种模式涵盖 AWS 密钥、GCP 服务账户、GitHub token、Stripe 密钥、数据库 URI、私钥、JWT 等,可扫描工具参数以及请求和响应体。将检测器与 CEL 策略结合使用可阻止任何携带凭据的工具调用,并且存储的 span 会在摄取时进行清理,因此泄露的密钥永远不会存在于你的 trace 历史记录中。[了解更多 → getstrathon.com/docs/redaction](https://getstrathon.com/docs/redaction)
### 行为漂移检测
对每个 agent 进行 EWMA 和 CUSUM 统计分析,跟踪四个信号:策略拒绝率、错误率、工具调用率和每分钟成本。根据每个 agent 的前 100 次观察(可配置)进行自动校准,然后当行为偏离学习到的基线时触发 webhook 警报,从而捕获来自被入侵或出现故障的 agent 的突然激增和逐渐漂移。[了解更多 → getstrathon.com/docs/analytics](https://getstrathon.com/docs/analytics)
### 断路器
针对每个 agent 和每个工具进行故障跟踪,以标准的 CLOSED → OPEN → HALF-OPEN 模式建模。当 agent 或工具超过错误阈值时,断路器将跳闸:后续的 span 在摄取时会被标记上断路器状态,打开的断路器会显示在 API 和 dashboard 中,你可以将该标志与策略配对或使用 halt 来停止 agent。Half-open 探针检测恢复情况;重置 endpoint 可手动关闭断路器。[了解更多 → getstrathon.com/docs/budgets](https://getstrathon.com/docs/budgets)
### 防篡改审计日志
证明追踪未被重写。每个操作员操作都使用 HMAC-SHA256 进行链接,Merkle 根以可配置的间隔进行锚定,并且该表在数据库级别是只追加的(PostgreSQL 行级安全性)。专为那些将审计日志视为证据(而不仅仅是历史记录)的环境而构建。[了解更多 → getstrathon.com/docs/audit](https://getstrathon.com/docs/audit)
### 欧盟 AI 法案合规性
为第 9-15 条和第 19 条导出证据,涵盖风险管理、数据治理、透明度、人工监督、准确性和严重事件报告。具有 NIST AI RMF 风险评分的 Agent 清单。事件检测自动生成第 73 条报告元数据。专为需要在不构建定制工具的情况下向审计员证明合规性的团队而构建。[了解更多 → getstrathon.com/docs/compliance-mapping](https://getstrathon.com/docs/compliance-mapping)
### Dashboard
Next.js 操作员 UI:trace waterfall、策略编辑器、批准卡片、agent 风险评分、带有哈希验证的审计日志、预算图表和合规性导出。带有 httpOnly cookie 的 BFF 安全代理。支持浅色和深色模式,移动端响应式。[了解更多 → getstrathon.com/docs](https://getstrathon.com/docs)
## 框架集成
```
pip install strathon # core
pip install "strathon[langgraph]" # + LangGraph
pip install "strathon[all]" # all 10 frameworks
```
| 框架 | 集成类型 | 描述 | 文档 |
|-----------|-----------------|-------------|------|
| **LangGraph** | BaseCallbackHandler | 通过 LangChain 回调系统拦截工具调用。在执行前进行阻止和限流。 | [指南](https://getstrathon.com/docs/frameworks/langgraph) |
| **CrewAI** | Event listener + tool wrap | 用于可观测性的事件总线;用于完整操作集(包括交互式批准)的工具调用包装。 | [指南](https://getstrathon.com/docs/frameworks/crewai) |
| **OpenAI Agents SDK** | TracingProcessor + RunHooks | 官方追踪扩展点;用于预执行强制执行的运行钩子。 | [指南](https://getstrathon.com/docs/frameworks/openai-agents) |
| **OpenAI** | Drop-in wrapper | 包装 `chat.completions.create`。除了 `instrument()` 之外零代码更改。 | [指南](https://getstrathon.com/docs/frameworks/openai) |
| **Anthropic** | Drop-in wrapper | 包装 `messages.create`。与 OpenAI 集成模式相同。 | [指南](https://getstrathon.com/docs/frameworks/anthropic) |
| **LangChain** | BaseCallbackHandler | 与 LangGraph 处理程序相同。适用于链、agent 和工具。 | [指南](https://getstrathon.com/docs/frameworks/langchain) |
| **AutoGen** | Agent wrapper | 包装 `BaseChatAgent.on_messages`。捕获多 agent 对话。 | [指南](https://getstrathon.com/docs/frameworks/autogen) |
| **Claude Agent SDK** | PreToolUse hooks | 在 `ClaudeSDKClient` 上进行一等钩子拦截;用于可观测性的查询包装器。 | [指南](https://getstrathon.com/docs/frameworks/claude-agent-sdk) |
| **Pydantic AI** | AbstractCapability | 通过 Pydantic AI 的能力系统实现的一等插件。Steer 直接工具结果。 | [指南](https://getstrathon.com/docs/frameworks/pydantic-ai) |
| **Google ADK** | BasePlugin | 通过 Google ADK 插件系统实现的一等插件。无需 monkey-patching。 | [指南](https://getstrathon.com/docs/frameworks/google-adk) |
只要框架提供一等框架扩展点(TracingProcessor、BasePlugin、AbstractCapability、回调处理程序),集成就会使用它们;如果不存在,Strathon 将包装框架文档记载的入口点。每个表面可以执行的内容有所不同,每个指南都准确说明了使用的是哪种机制以及它执行什么;[各表面的支持矩阵](https://getstrathon.com/docs/intervention)提供了完整的图景。
## CLI
```
pip install strathon-cli
```
```
# Policy 管理
strathon policies list
strathon policies create --name "block-email" \
--expr 'attrs["gen_ai.tool.name"] == "send_email"' --action block
strathon policies create --template block-prompt-injection
strathon policies create --from-english "block all shell commands" # needs STRATHON_AI_API_KEY on the receiver
strathon policies import policies.yaml
strathon policies test --name my-policy --last 100
strathon policies suggest
strathon policies conflicts
# Traces 和 spans
strathon traces list --limit 50 --agent my-agent
strathon traces tree
strathon spans search --tool send_email --limit 50
# 操作
strathon halts create --scope project --reason "Emergency"
strathon budgets list
strathon budgets forecast
strathon approvals list --status pending
strathon approvals approve
# Compliance 和 audit
strathon compliance export --format sarif
strathon audit list --limit 100
# 管理
strathon admin list-users
strathon admin reset-password --email user@company.com
strathon admin transfer-ownership --to user@company.com
strathon admin revoke-all-keys
```
13 个命令组,36 个子命令。每个读取命令都带有一个 `--json` 标志,用于编写脚本和 CI pipeline。
## 性能
吞吐量取决于你的硬件、PostgreSQL 配置和 span payload,因此 Strathon 没有引用单个数字,而是提供了一个可重现的基准测试,可以在你的环境中进行测量:
```
# terminal 1:启动 receiver
cd receiver && uvicorn main:app --workers 4 --port 4318
# terminal 2:从 repo 根目录
pip install httpx opentelemetry-proto protobuf
python benchmarks/loadtest.py --endpoint http://127.0.0.1:4318 \
--api-key "$STRATHON_API_KEY" --requests 5000 --concurrency 16
```
它驱动完整的按 span 处理的 pipeline(protobuf 解析、CEL 策略评估、50 多种凭据模式、PII 脱敏和批量 PostgreSQL 写入),并报告其运行的硬件的持续 spans/sec、延迟 p50/p95/p99 和错误率。(我们测试所用的参考环境:MacBook Pro M 系列,4 个 uvicorn worker,PostgreSQL 16,50,000 个 span。)
接收器是无状态的,可以在负载均衡器后面水平扩展。在共享的 PostgreSQL 成为瓶颈之前,接收器层几乎呈线性扩展:所有接收器都写入一个主数据库,因此请围绕数据库写入路径(PgBouncer、更大的主数据库、用于 dashboard 查询的只读副本)规划容量,而不是接收器数量。请参阅[扩展指南](https://getstrathon.com/docs/scaling)。
## OWASP Agent 安全覆盖范围
Strathon 的威胁模型基于 [OWASP Top 10 for Agentic Applications 2026](https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/)。
| 威胁 | Strathon 覆盖范围 |
|--------|-------------------|
| **ASI01** Agent 目标劫持 | 针对提示词内容和输入模式的 CEL 策略,对检测到的劫持尝试进行阻止/警报 |
| **ASI02** 工具误用和漏洞利用 | 对工具名称和参数进行预执行策略强制执行(阻止/允许列表),具有默认拒绝允许列表的精确工具名称匹配,以及针对敏感工具的批准工作流 |
| **ASI03** 身份和权限滥用 | 限定范围的 API 密钥、RBAC(4 种角色)、MFA、按密钥的速率限制 |
| **ASI04** Agent 供应链漏洞 | [MCP 网关](https://getstrathon.com/docs/mcp)根据策略评估第三方工具/MCP 服务器调用;[出口代理](https://getstrathon.com/docs/egress)具有域名允许列表;对工具响应进行凭据扫描 |
| **ASI05** 意外的代码执行 | 针对 shell、代码和 SQL 工具的阻止和允许列表策略;执行代码的工具运行前需要批准工作流 |
| **ASI06** 内存和上下文投毒 | 行为漂移检测(Vigil、EWMA/CUSUM)显示投毒影响;halt 传播;对摄取的数据进行内容脱敏 |
| **ASI07** 不安全的 Agent 间通信 | MCP 网关根据策略评估 agent 间和工具调用,当评估无法完成时执行失败关闭 |
| **ASI08** 级联故障 | 具有自动停止的预算和迭代限制、紧急停止开关和 halt 传播,可在故障蔓延之前将其控制住;断路器会标记反复出现故障的 agent 和工具 |
| **ASI09** 人机信任利用 | 人工批准工作流(多方 N-of-M、未决定请求的自动过期、Slack/Discord 批准通知)、防篡改审计日志、trace 搜索和 SARIF 导出以追究责任 |
| **ASI10** 流氓 Agent | 行为漂移检测(Vigil)、心跳监控、SDK 完整性检查、紧急停止开关 |
## 范围和限制
Strathon 在**工具调用边界**执行策略:它在执行前检查每个工具调用及其参数,并且可以阻止、引导、限流、要求批准、记录、警报或明确允许。这是 agent 的决策转化为现实世界操作的层,也是无论模型是错误、被操纵还是被破坏,阻止操作发生的正确位置。
它是 agent 安全的其中一层,而不是全部。有两点诚实声明值得事先指出,完整情况在 [docs/scope.md](docs/scope.md) 中:
- **凭据:目前是检测,未来是注入。** Strathon 检测并脱敏工具参数和请求/响应体中的机密信息(50 多种模式),这是针对正在发生的泄露的被动防御。在网关侧进行凭据*注入*(即 agent 根本不持有机密)更为强大,已在路线图上,但尚未发布。
- **出口:目前是显式的,未来是透明的。** 出口代理以显式(`HTTP_PROXY`)模式运行,这对于合作的 agent 来说是深度防御。无法被 agent 绕过的透明、网络级别的拦截已在路线图上。
某些攻击类别无法仅通过工具调用边界来解决,我们宁愿坦诚说明,也不愿暗示相反的情况:
- **数据流泄露。** 当先前读取的敏感数据被偷偷夹带在另一个看似有效的参数中(例如,编码在允许域名的 URL 中)时,单个调用看起来是合法的。要可靠地捕获这种情况,需要数据流溯源(污点追踪),这已在我们的路线图上。
- **投毒的工具输出和上下文攻击。** 注入到工具响应中的指令,或在协议握手期间注入到工具列表中的指令,可以在不产生自身恶意调用的情况下影响 agent。这些需要响应清理和输入过滤,而不仅仅是调用时的强制执行。
- **内存投毒。** 植入在 agent 长期内存中的恶意指令会在稍后产生一个不携带带内信号的调用。防御此问题是一个内存完整性和训练时的问题。
- **聚合/经济滥用。** 每次调用可能都是合法的,但攻击量在于其调用量。Strathon 的预算和漂移检测解决了这个问题,但是是通过成本和速率核算,而不是基于单次调用的策略。
安全社区的诚实框架同样适用:如果一个 agent 同时具备对私有数据的访问、暴露于不可信内容以及出站通道,那么它在结构上就是可利用的,最可靠的缓解措施是通过设计移除其中的一个环节。Strathon 很好地管控了出站操作环节;它作为分层设计的一部分最为有效,而不是单一的保证。
## 架构
```
Your Agent Strathon
┌─────────────────┐ ┌──────────────────┐ ┌────────────┐
│ │ OTLP/HTTP │ Receiver │ │ │
│ Agent code │─────────────▶│ (FastAPI) │───────▶│ PostgreSQL │
│ │ │ │ │ │
│ ┌───────────┐ │◀─────────────│ Ingest pipeline │ └────────────┘
│ │ Strathon │ │ policy sync, │ Credential scan │
│ │ SDK │ │ halts │ PII redaction │ ┌───────────┐
│ │ (in-proc │ │ │ Audit log │───────▶│ Dashboard │
│ │ enforce) │ │ │ Webhooks │ │ (Next.js) │
│ └───────────┘ │ └──────────────────┘ └───────────┘
└─────────────────┘
```
单一 PostgreSQL 依赖。没有 ClickHouse,没有 S3,不需要 Redis(Redis 是可选的,仅用于启用异步 webhook 传递)。在单台机器上自托管,或在负载均衡器后面水平扩展。
## 部署
### 自托管(推荐)
```
# Docker Compose:PostgreSQL、receiver 和 dashboard
git clone https://github.com/strathon/strathon.git
cd strathon && docker compose up
```
注册第一个账户,创建策略,获取 API 密钥,然后连接你的 agent。无需电子邮件服务器;唯一的依赖项是 PostgreSQL,它已包含在 Compose stack 中。Strathon 作为两个镜像发布:`ghcr.io/strathon/receiver` 和 `ghcr.io/strathon/dashboard`,以及 PostgreSQL。Compose 运行这三个组件;你也可以单独运行接收器或独立扩展 dashboard。请参阅[自托管](https://getstrathon.com/docs/self-hosting)。
### Docker 镜像
```
docker pull ghcr.io/strathon/receiver:latest
docker pull ghcr.io/strathon/dashboard:latest
```
### HTTPS(生产环境)
将 Caddy 或 nginx 放置在接收器前面作为反向代理。有关完整的 Caddyfile 和 nginx 配置,请参阅[使用 HTTPS 部署](https://getstrathon.com/docs/self-hosting#https)。
### 云(托管)
计划推出托管云产品。目前支持的部署方式是自托管;有关更新,请参阅 [getstrathon.com](https://getstrathon.com)。
## 社区
- [Discord](https://discord.gg/Ta9XRmh4H) 用于提问、讨论和支持
- [GitHub Issues](https://github.com/strathon/strathon/issues) 用于报告 bug
- [GitHub Discussions](https://github.com/strathon/strathon/discussions) 用于功能请求和想法
- [贡献](CONTRIBUTING.md) 用于开发设置指南
## 许可证
Apache License 2.0,适用于所有组件。请参阅 [LICENSE](LICENSE) 和
[LICENSING.md](LICENSING.md)。 标签:AI智能体, Lerna, Python, 合规治理, 大语言模型安全, 无后门, 机密管理, 测试用例, 策略执行, 请求拦截, 逆向工具, 防火墙