如何防止 AI Agent 泄露敏感数据?Gate 确定性 PII 脱敏工具详解
问题:你的 AI Agent 正在把你的数据”送”给大模型
当你让 Claude Code 或 Codex 查询数据库时,是不是从来没想过这个场景——
tkpsql query --sql "SELECT * FROM users WHERE id = 42"
返回的结果中包含用户邮箱、手机号、身份证号甚至信用卡号。这些数据就这样原封不动地进入了 LLM 的上下文窗口,随 API 请求发送到云端。
这不是假设——这是每个用 AI Agent 连接数据库或内部 API 的开发团队每天都在经历的事情。结果就是:你的敏感数据被训练在别人的模型里。
为什么这是一个不容忽视的问题
| 维度 | 影响 |
|---|---|
| 合规风险 | GDPR、CCPA、《个人信息保护法》等法规要求 PII 数据不得外传 |
| 商业机密 | 内部系统查询可能暴露客户数据、薪资信息、业务策略 |
| 不可追溯 | LLM 的训练数据使用难以审计,数据被用于训练后无法撤回 |
| 普遍性 | 只要 Agent 能执行 CLI 命令或调用 MCP 工具,就可能接触到敏感字段 |
AI 编码 Agent 越来越强大,也越来越频繁地访问数据库和内部 API。每次 psql、mysql、curl internal-api 调用都是潜在的数据泄露窗口。
传统方案的局限
方案 A:LLM 驱动的 PII 检测(不靠谱)
很多 PII 防护方案本身也是 LLM——把你的数据发送给另一个模型来判断是否包含敏感信息。
| 对比项 | LLM 方案 | 问题 |
|---|---|---|
| 确定性 | ❌ 每次运行结果不同 | 不可复现,不可审计 |
| 数据外泄 | ❌ 数据仍然发送给模型 API | 相当于二次泄露 |
| 延迟 | 增加一次 API 往返 | 200ms-2s 额外开销 |
| 误报率 | 未知 | 黑盒决策,无法追踪 |
方案 B:数据库级脱敏(需要管理员权限)
数据库级动态数据脱敏(DDM)是正确做法——前提是你控制数据库。但如果使用的是第三方/供应商数据库,或者 Agent 的调用路径绕过了 DDM(如通过 MCP 工具访问),DB 脱敏就覆盖不到。
方案 C:什么都不做(最常见)
大多数团队的选择——因为配置复杂、工具不成熟、或者”还没出事”。但这不是长久之计。
Gate:确定性的 PII 脱敏方案
Gate(108⭐, Rust, MIT)是一个基于确定性规则的 PII 脱敏工具——用正则表达式 + 列名启发式 + Luhn 算法检测敏感数据,在数据到达模型之前自动替换为 [PII:type] 占位符。
核心差异在于:不是用另一个模型来判断——而是用硬规则,100% 可复现、可审计。
核心优势
| Gate | LLM 方案 | 数据库脱敏 | |
|---|---|---|---|
| 决策方式 | 正则 + 启发式 | 模型推理 | SQL 规则 |
| 确定性 | ✅ 每次结果相同 | ❌ 随机波动 | ✅ |
| 数据本地处理 | ✅ 不离机 | ❌ 发送给模型 API | ✅ |
| 延迟 | < 10ms | 200ms-2s | 0(数据库原生) |
| 可审计 | ✅ 每条决策可追踪 | ❌ 黑盒 | ✅ |
| 覆盖 MCP 工具 | ✅ | ❌ | ❌ |
它能做什么
Gate 覆盖了 AI Agent 访问数据的两条路径:
Bash 工具路径:Agent 的每条 Bash 命令经过 Gate 钩子,匹配的命令被静默重写,输出经扫描后返回模型。整个过程透明——Agent 看到的仍然是正常 JSON 响应,只是敏感字段被替换。
MCP 路径:Gate 作为透明代理注册在 Agent 与 MCP 服务器之间,拦截 tools/call 响应进行脱敏,其他消息透传。
输出示例:
{
"id": 1,
"full_name": "[PII:name]",
"email": "[PII:email]",
"ssn": "[PII:ssn]",
"card_number": "[PII:credit_card]",
"_gate_summary": {
"redacted": 4,
"types": ["name", "email", "ssn", "credit_card"],
"warnings": []
}
}
使用场景
- 数据库查询:所有通过 CLI 工具(psql, mysql, tkpsql)的查询输出自动脱敏
- 内部 API 调用:curl 等工具返回的 JSON 响应中的 PII 字段被屏蔽
- MCP 服务器:Agent 通过 MCP 协议访问的任何数据源同样受保护
- 生产环境审计:gate retro 汇总所有脱敏记录,生成审计报告
快速上手
Gate 安装只需要一条命令:
brew tap GaaraZhu/gate && brew install gate cargo binstall gate
配置和启用:
gate config gate init gate init --wrap-mcp gate validate
每条命令的钩子注册格式:
gate init --harness claude-code # Claude Code(默认) gate init --harness codex # Codex CLI gate init --harness cursor # Cursor gate init --harness opencode # OpenCode gate init --harness gemini # Gemini CLI gate init --harness copilot-cli # GitHub Copilot CLI
先扫描再部署:先扫描数据库结构确认有哪些 PII 风险:
psql -U user -h host -d dbname -c "SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS" | gate scan
这会输出每张表的 PII 风险评估报告——无需任何配置!
核心功能详解
1. 模式扫描(Schema Scan)
gate scan 在配置任何防护之前就能发现你的数据库中有多少敏感字段。管道输入表名→列名的查询,输出每张列的风险评分。
2. 双通道保护
Bash 路径和 MCP 路径同时保护,不会因为 Agent 通过不同渠道访问数据而出现漏洞。
3. 审计回溯(Retro)
gate retro 聚合所有历史脱敏记录——总查询次数、脱敏字段数量、命中率、按工具和 PII 类别分类——生成可直接用于合规审计的报告。
如果某次检测是低置信度匹配,gate retro 会单独列出建议添加白名单的字段。
4. 白名单/黑名单
对于误报的字段(如测试表中的假数据),可以用 gate allowlist add 直接放行。
需要注意的限制
Gate 不是万能的,它有明确的作用边界:
- 只保护配置的工具:不在
tools列表中的命令,输出不被扫描 - 只保护 JSON 输出:纯文本、CSV 等格式未经检查
- 无法处理自由文本中的 PII:散落在备注字段中的身份证号不会被检测
- 对抗性攻击防范有限:如果 Agent 被恶意操控,可以绕过检测
- 不保护已进入上下文的 PII:之前的对话轮次或文件读取中的敏感信息不受影响
这些限制都在威胁模型文档中有详细说明。
总结
Gate 代表了一种更务实的 AI Agent 数据安全思路:不要用另一个模型来保护模型,而是用确定性的规则来拦截敏感数据。
它的价值在于:
- 零改动:不需要修改 Agent 配置、提示词或数据库
- 低开销:< 10ms 延迟,对开发体验几乎无影响
- 可审计:每条脱敏决策都可以追溯到具体规则
- 互补性:和数据库脱敏方案互补,覆盖现有方案覆盖不到的路径
如果你在用 AI Agent 访问数据库或内部 API,Gate 是一个值得花 5 分钟配置的工具——花的时间远比处理一次数据泄露要少。
🔗 GitHub: https://github.com/GaaraZhu/gate 🔗 设计文档: https://gaarazhu.github.io/introducing-gate/