MCP(Model Context Protocol)数据库连接器让 AI Agent 能直接查询数据库,看起来很方便,但权限没控好就是给自己留后门。这篇文章不讲概念,直接说连接数据库时三个最容易翻车的点:账号权限配置、只读访问落地、以及日志审计怎么追查谁查了什么。

MCP 数据库连接器使用注意:账号权限不能给太大
很多人在 VPS 上部署 AI Agent(比如 Claude Code、Codex、Hermes Agent)时,图省事直接用 root 或管理员账号配连接器。这个坑很常见——Agent 能跑起来,但一旦被注入恶意提示,数据库可能被删表。
正确做法:为 MCP 连接器单独创建一个数据库用户。
sql
— MySQL 示例,创建只读用户
CREATE USER 'mcp_agent'@'localhost' IDENTIFIED BY '强密码';
GRANT SELECT ON your_database.* TO 'mcp_agent'@'localhost';
FLUSH PRIVILEGES;
如果是 PostgreSQL:
sql
CREATE USER mcp_agent WITH PASSWORD '强密码';
GRANT CONNECT ON DATABASE your_db TO mcp_agent;
GRANT USAGE ON SCHEMA public TO mcp_agent;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_agent;
别急着重装系统,先看日志。如果 Agent 报“Access denied”,就检查用户权限和 host 匹配(比如 localhost 和 % 的区别)。
只读访问:能查不能改是底线
AI Agent 的场景通常是“查询数据→分析→返回结果”,不需要写操作。但很多 MCP 配置示例为了演示方便,直接给了读写权限。生产环境必须强制只读。
在数据库层面锁定
除了 GRANT SELECT,还要注意:
• 撤销 INSERT、UPDATE、DELETE、DROP、ALTER 等权限。
• 如果 Agent 需要调用存储过程或函数,确保这些过程也是只读的。
• 对 PostgreSQL,可以用 `REVOKE ALL ON SCHEMA public FROM mcp_agent;` 然后只给 SELECT。
在 MCP 连接器配置中二次限制
有些 MCP 实现(如 n8n 的数据库节点或自定义 Agent 插件)支持在连接字符串里加参数。例如 MySQL 可以加 `readOnly=true`(部分驱动支持)。但最保险的还是数据库账号本身只有读权限,不要依赖应用层。
老鸟叮嘱:只读不代表可以暴露所有表
如果数据库里有用户密码、支付记录等敏感字段,即使只读,Agent 也可能通过查询泄露。建议:
• 为 MCP 连接器创建视图,只暴露需要的列。
• 或者用数据库的列级权限(如 MySQL 8.0+ 支持)。
• 不要给 `*` 权限,精确到表。
日志审计:谁查了什么数据必须可追溯
AI Agent 查询数据库的行为默认不会记录到应用日志里,出了问题很难定位。日志审计是最后一道防线。
开启数据库审计日志
MySQL:
ini
general_log = 1
general_log_file = /var/log/mysql/mysql.log
生产环境建议用 audit log 插件(如 MySQL Enterprise Audit 或 MariaDB Audit Plugin),避免 general log 性能开销过大。
PostgreSQL:
ini
logging_collector = on
log_statement = 'all' # 或 'mod' 只记录写操作
log_min_duration_statement = 0 # 记录所有查询耗时
重启后,所有 SQL 语句都会写入日志。配合 `grep mcp_agent` 就能过滤出 Agent 的查询。
在 AI Agent 侧加审计
如果 Agent 支持自定义回调(比如 Claude Code 的 tool call 日志),可以把每次查询的 SQL、参数、返回行数写入独立文件或日志系统。例如在 Hermes Agent 的配置里加上 `log_queries: true`。
日志轮转别忘
审计日志增长很快,尤其是生产环境。配置 logrotate:
/var/log/mysql/mysql.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
copytruncate
}
老鸟叮嘱:三个容易忽略的坑
1.连接池泄漏:MCP 连接器反复创建数据库连接,不释放会导致 max_connections 打满。建议在 Agent 配置里限制连接池大小(如 2-5 个),并设置 idle timeout。
2.SSL 加密:如果 Agent 和数据库不在同一台 VPS 上,连接必须用 SSL/TLS。否则 SQL 明文传输,等于裸奔。在连接字符串里加 `ssl-mode=REQUIRED`。
3.不要用 root 跑 MCP 服务:即使数据库账号是只读,Agent 进程本身也建议用普通用户运行。防止 Agent 被攻破后通过文件系统读取数据库配置文件。
FAQ
Q1:MCP 数据库连接器必须单独开一个用户吗?
是的。不要复用应用的用户,更不能用 root。单独用户方便回收权限和审计。
Q2:只读用户能防止 SQL 注入吗?
不能完全防止,但可以限制损失。注入后只能 SELECT,无法删表或改数据。仍需配合输入过滤。
Q3:日志审计对性能影响大吗?
全量查询日志(general_log)影响较大,建议用 audit 插件或只记录慢查询。如果必须全量,日志文件放在独立磁盘上。
Q4:怎么验证只读权限生效?
用该用户登录后执行 `DELETE FROM table;` 或 `DROP TABLE table;`,应该报权限错误。
Q5:Agent 查询频繁,审计日志文件太大怎么办?
设置日志轮转,同时限制单条查询长度(如 MySQL 的 `log_queries_not_using_indexes` 过滤无效查询)。
Q6:MCP 连接器支持 PostgreSQL 和 MySQL 吗?
大部分 MCP 实现(如 n8n、Open WebUI 的数据库工具)都支持主流关系型数据库。具体看对应 Agent 的文档,连接字符串格式略有差异。
结尾
MCP 数据库连接器用起来顺手,但权限、只读和审计这三个点必须落地。先从创建只读用户开始,再配置日志轮转,最后加一层 SSL。别等出事了再查日志——那时候可能已经来不及了。
—
**相关阅读:**
– [VPS部署AI工具100讲:AI Agent、Codex、Claude Code、Hermes Agent、Ollama与自动化工作流实战教程](https://www.zhujixuan.com/jishujiaocheng/9606.html)
– [Codex、Claude Code、OpenClaw、Hermes Agent、Ollama、n8n 分别适合什么场景](https://www.zhujixuan.com/jishujiaocheng/9759.html)
– [Claude Code 与 Codex 对比:哪个更适合 VPS 远程开发](https://www.zhujixuan.com/jishujiaocheng/9816.html)
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9835.html 商家投稿邮箱:zhujixuanblog@qq.com
