1. 首页 > 技术教程 > 正文

MCP 数据库连接器使用注意:账号权限、只读访问和日志审计

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

zhujixuan TASK 112

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