TM-threemavithana/agentiam
GitHub: TM-threemavithana/agentiam
AgentIAM 是一个用 Go 编写的 PostgreSQL/MySQL 语义防火墙代理,通过 AST 级解析拦截并阻止 LLM 代理生成的破坏性或超载查询。
Stars: 1 | Forks: 0
# AgentIAM
**一个在 AST 层面阻止 AI 代理进行 SQL 注入的 PostgreSQL 和 MySQL 网络代理。**
将大型语言模型(LLM)直接连接到您的数据库以实现“Text-to-SQL”功能是非常危险的。AgentIAM 位于您的 LangChain/LlamaIndex 代理和数据库之间,拦截 PostgreSQL 和 MySQL 的网络协议流量,以便在破坏性查询执行之前对其进行解析和阻止。
[](https://github.com/tm-threemavithana/agentiam/actions/workflows/ci.yml)
[](https://goreportcard.com/report/github.com/tm-threemavithana/agentiam)
[](https://opensource.org/licenses/Apache-2.0)
## 🛑 存在的问题
如果您给 AI 代理提供一个数据库连接,它最终*一定会*尝试删除数据或使您的数据库超载。
- **Prompt Injection:** 攻击者可以轻易诱骗 LLM 生成 `DELETE FROM users;` 而不是无害的查询。
- **Denial of Service (DoS):** LLM 可能会意外运行 `SELECT * FROM massive_table;`,试图获取数百万行数据并导致您的数据库服务器崩溃。
- **Regex Evasion:** 使用正则表达式的标准 SQL 防火墙可以通过嵌套的 Common Table Expressions (CTE)、子查询或晦涩的格式轻易绕过。
依靠“prompt engineering”或 LLM 安全防护来防止这种情况是行不通的。给 AI 一个只读的数据库用户可以防止删除,但这无法阻止大规模、未分页的查询导致服务器崩溃。
## 🚀 工作原理
**AgentIAM** 是一个用 Go 编写的专用代理,充当 PostgreSQL 和 MySQL 的严格语义防火墙。
1. **Wire Protocol Interception:** AI 代理连接到 AgentIAM。代理在 Postgres Extended Query 或 MySQL 协议层面拦截传入的数据包。
2. **AST Parsing:** 使用 `pg_query_go`(针对 PostgreSQL)或 `pingcap/tidb` 解析器(针对 MySQL)将 SQL 解析为抽象语法树(AST)。
3. **Deterministic Enforcement:** AgentIAM 使用递归 Visitor 模式遍历 AST。如果检测到被阻止的节点(如 `DeleteStmt`)——即使它深藏在 CTE 或子查询中——代理也会立即丢弃该查询,并向 AI 返回协议错误。
4. **Policy Fetching via HTTP Polling:** 代理根据通过 HTTP 轮询机制从远程控制平面获取的策略来执行规则。这取代了基于 Redis 的传统架构,以减少外部基础设施依赖(例如在代理旁边部署 Redis 集群),尽管这会引入轮询开销。
5. **AST Rewriting:** 如果允许的 `SelectStmt` 缺少 limit,AgentIAM 会重写 AST 以强制执行硬性 `LIMIT 100`,将其重新解析回 SQL,并将其转发到真实数据库。
## 🏃 快速开始(5 分钟)
您可以使用 Docker Compose 在本地尝试完整的 Go-To-Market 演示。它会启动一个测试数据库、AgentIAM,以及一个 Python LangChain 脚本,该脚本会尝试安全、恶意和 prompt injected 的 SQL 生成。
```
cd demo/
docker-compose up --build
```
*注意:该演示默认在 `AGENTIAM_DEMO_MOCK=true` 模式下运行,因此您不需要 OpenAI API 密钥即可看到它的工作效果。要使用真实的 LLM,请在运行之前执行 `export OPENAI_API_KEY="sk-..."`。*
## ⚙️ 配置说明
AgentIAM 的策略会通过 HTTP 轮询定期从远程控制平面获取。该代理需要一个 API endpoint 和一个长期的访问 token 来引导配置。
```
version: "1"
control_plane:
endpoint: "https://api.agentiam.io/v1/policies"
token: "secret-token-here"
poll_interval: "30s"
```
当您的 AI 连接时,它使用 `langchain-bot` 作为数据库用户。代理拦截握手,根据缓存策略验证密码,并建立会话。
## 🏗️ 架构与限制
AgentIAM 针对特定类别的攻击提供了强大的缓解措施,但了解其边界也很重要。
### ⚠️ 拓扑警告:PgBouncer
AgentIAM 不池化上游连接;它在传入的客户端连接和上游数据库连接之间维护 1:1 的映射。为了防止在高并发环境中使您的数据库超载,您应该在 AgentIAM 的*下游*部署 **PgBouncer**:
`AI Agent -> AgentIAM Proxy -> PgBouncer -> Postgres`
### 安全边界
- **Authentication:** 该代理支持本地连接的 `AuthenticationCleartextPassword`,但现在非常强调使用 **mutual TLS (mTLS)** 进行安全身份验证。有效的 mTLS 证书可以配置为绕过标准密码检查。
- **Timing Oracles:** 该代理在身份验证或策略评估期间不会混淆延迟。同一子网上的攻击者理论上可以通过测量 `bcrypt` 比较时间来推断有效的代理密钥,并且可以检测策略查找中 SQLite 命中与未命中的延迟。
- **Parameterized LIMITs:** 虽然代理会自动为无界的 `SELECT` 语句注入 `LIMIT` 子句,但它故意拒绝参数化限制(例如 `LIMIT $1`)。默认使用参数化限制的应用程序或 ORM 必须禁用它们以符合代理要求。
- **Semantic Logic:** 该代理可防止查询未授权的表,但目前不强制执行行级安全(RLS)或注入租户隔离限制。
- **Policy Configuration:** AgentIAM 会严格执行您配置的内容。配置错误的策略仍然是配置错误的策略。如果您将敏感表或函数列入白名单,代理将允许访问它们。
- **Concurrency & DDoS Protection:** 该代理利用严格的 `AGENTIAM_MAX_CONNECTIONS` 并发信号量,并保证在极端负载下处理连接断开时不会发生 goroutine 泄漏。
## 🤝 贡献
有关设置开发环境、运行 `testcontainers-go` 集成测试以及提交 Pull Requests 的说明,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
标签:CISA项目, EVTX分析, Go语言, PostgreSQL, SQL注入防护, 数据库代理, 日志审计, 版权保护, 程序破解, 请求拦截