
“给 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




