程序员小一头像
给数据库 MCP Agent 发凭证:只读之外,还要有效期与查询额度封面图

给数据库 MCP Agent 发凭证:只读之外,还要有效期与查询额度

封面

“给 Agent 一个只读账号”是起点。它仍可能读到不该读的数据,也可能用一条大查询吃满资源,或者把长期密码留在日志里。

ClickHouse 的 MCP 仓库提供数据库连接工具;9 月 23 日的 26.9 发布文章介绍了有时限的访问令牌。后者是九月资料,不能包装成十月新发布。10 月 22 日的 Langfuse 案例则提供工具调用观测思路。这几层能力不能合并成一句“接入 MCP 就安全”。

本文专属原理图

原理示意,非真实系统截图或性能测量。

凭证、数据库授权与预算分别审查

主密码用于建立长期身份;短期令牌限制暴露窗口;数据库角色决定能访问的资源;查询预算约束一次或一段时间内消耗。令牌过期不自动意味着正在执行的查询立刻停止,只读也不保证租户隔离。

以下程序是离线许可模型,使用虚构身份,不创建或展示任何真实凭证。它检查有效期、许可资源和剩余额度,刻意没有设计真实令牌签名协议。

grant = dict(subject="demo-agent", expires=200,
             resources={"demo_metrics"}, remaining=2)
def consume(resource, now):
    if now >= grant["expires"]:
        return "expired"
    if resource not in grant["resources"]:
        return "forbidden"
    if grant["remaining"] <= 0:
        return "quota_exhausted"
    grant["remaining"] -= 1
    return "allowed"
assert consume("other_tenant", 100) == "forbidden"
assert consume("demo_metrics", 100) == "allowed"
assert consume("demo_metrics", 101) == "allowed"
assert consume("demo_metrics", 102) == "quota_exhausted"
assert consume("demo_metrics", 200) == "expired"
print("offline grant checks passed")

Python 3.9.6 本地通过。并发系统必须以原子方式核减额度;这个单进程字典没有实现分布式授权、身份验证或数据库原生 quota。它只暴露了“只读”之外需要核对的条件。

工具服务器也有身份边界

不能由模型把任意 DSN、库名和角色交给工具自由连接。服务端应绑定受控目标与会话身份,核对连接池是否混用租户,限制返回字段和行数。工具调用日志避免落完整密码、令牌和敏感结果,追踪用脱敏引用关联身份版本。

当凭证轮换、用户离职或策略收紧时,要验证新请求被拒绝、现有连接如何处理、缓存结果是否仍可访问。撤销和过期是不同测试项,不能用“有 TTL”替代全部检查。

接入前的一页记录

记录支持的数据库版本、令牌方式、角色、表集、查询与扫描预算、连接上限、撤销路径、审计位置和未支持项。每个开关引用其对应版本文档;缺少字段时标待核实,不自行造配置键。

本轮没有连接 MCP 数据库、生成凭证或调用收费 API。访问控制与资源策略是否真正生效,仍需在获得授权的一次性环境中测试;文章不承诺某个只读选项能够自动覆盖所有工具。

资料:ClickHouse MCP、ClickHouse 26.9(2026-09-23)、Langfuse 案例(2026-10-22)。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/guoyizhongxing/article/details/169465665

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--