两周前,我把公司的数据库接进了AI编程工具。效率确实起飞了,直到我翻了一下会话记录。
两周前
我把公司的 PostgreSQL 数据库接进了 Claude Code。AI 确实能干——帮我写迁移、联表、生成报表,效率直接起飞。
直到我随手翻了一下会话记录,看到这个:
[{
"id": 41021,
"full_name": "Alice Johnson",
"email": "alice.johnson@example.com",
"phone": "+1 415-555-0142",
"card_last_four": "4242",
"ssn": "123-45-6789",
"status": "active"
}, ...]
这是 AI 执行 SELECT * FROM users LIMIT 5 时返回的真实数据。
姓名、手机号、邮箱等等敏感信息,全在上下文里。
并且这些数据可能存在:
- 对话日志
- AI 生成的任何摘要
- 它刚写入
/tmp的文件 - 如果开了会话共享,可能还去了别人的机器
- 最隐蔽的:某些平台会拿用户数据训练下一代开源模型
AI 没做错任何事。我也没做错。工具返回了什么,模型就看到什么——中间没有人在把关。
我当时的第一反应:为什么不用 LLM 来脱敏?
能不能让 AI “自觉”不请求敏感字段?试过,没用。提示词写得再严,模型在某些边界情况下还是会漏。
那在 AI 收到结果后,再调个 LLM 脱敏呢?这条路我也想过,但行不通:
- 成本:一次会话几十上百次查询,每次多调一次模型,账单感人
- 延迟:tool 执行路径需要毫秒级返回,LLM 做不到
- 审计:“为什么这个字段被脱敏了?”——LLM 给不出确定答案,也没法复现
现有的 PII 脱敏工具(Presidio、Nightfall 等)是给数据管道或 API 网关用的,跑在 Agent 的 tool 执行路径上?不合适。
所以我想要的不是“更聪明的模型”,而是一个确定性的过滤器:
- 放在 Agent 和数据库之间
- 自动拦截查询结果
- 不靠 LLM 猜
- Agent 无法绕过
于是写了 gate
gate 是一个 Rust 写的命令行工具,做一件事:在数据进入模型之前,把 PII 替换成 [PII:类型] 。
*上图分三步
1. gate scan 预先扫描 schema 中的 PII 风险列
2. gate 关闭时,AI 查询能看到完整的卡号
3. gate 开启后,MCP 和 Bash 两条路径的返回结果都被自动脱敏
JSON 结构不变,AI 可以继续遍历、计数、推理,但永远看不到原始值。
涵盖两个路径
它覆盖 Agent 从后端拿数据的两个途径:
1. Bash 命令
Agent 想跑 psql -c "SELECT ..." → gate 的钩子在 harness 层把命令改写成 gate run -- psql -c "..." → 子进程的 stdout 经过扫描脱敏后才返回给模型。
这个改写发生在 Claude Code / OpenCode / Copilot CLI 的 PreToolUse 钩子里,是强制执行的,Agent 没法说"我不走那个钩子"。
2. MCP Server
gate mcp 是一个 stdio 代理,你把它注册成 MCP Server,它启动上游的真实 Server,然后所有 tools/call 的返回值都会经过脱敏扫描。对上游 Server 零侵入,现有 MCP Server 不用改一行代码。
一条命令就能把所有 MCP Server 包进去:
bash
gate init --wrap-mcp --yes
用之前先扫一遍:gate scan
我建议任何人在接入 AI 之前,先跑 gate scan 看看自己库里有多少敏感信息:
bash
psql -d mydb -c "SELECT TABLE_NAME, COLUMN_NAME
FROM information_schema.columns
WHERE table_schema = 'public'" | gate scan
输出按 Critical / Elevated / Standard 分级,告诉你哪几张表风险最高。有假阳性(比如products 表里的city字段)可以用 --review 一键加入白名单。
跑了一段时间后:gate retro
gate retro 会读取本地的统计日志,告诉你:
- 一共拦截了多少次查询
- 脱敏了多少个 PII 字段
- 按工具和 PII 类型拆分的命中率
这是写给安全团队看的:这工具不是摆设,数字在这。
坦诚说,哪些它防不住
- Agent攻击(被注入后故意 Base64 编码、换成 CSV 输出、走没配置的工具)—— 不在威胁模型内。可以配合 harness 级别的工具白名单加固。
- 非 JSON 输出 — 纯文本、CSV 原样放过。可以配置
pipe: "jq -c ."转成 JSON。 - MCP 的
resources/read—— 目前只拦截tools/call,这是个已知缺口,正在做。
快速指南(3条命令)
bash
# macOS / Linux
brew tap GaaraZhu/gate && brew install gate
gate config # 生成配置
gate init # 注册 Claude Code 钩子
gate init --wrap-mcp # 包住现有 MCP Server(先 dry-run)
关了也很简单:gate disable 关,gate enable 再开。彻底卸载是 gate uninstall。
项目地址
Rust 编写,MIT 协议,~7k 行代码 + ~6k 行测试,已发布 46 个版本,Homebrew 可安装。
如果你也在用AI连接数据库,不妨先跑个 gate scan 看看。 也许你会发现,有些东西不该出现在模型的上下文里。