一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

SqlAugur 如何用 AST 校验保障 SQL Server MCP 查询安全?

时间:2026-09-13 11:34:02 编辑:袖梨 来源:一聚教程网

SqlAugur 是一个面向 Microsoft SQL Server 的只读 MCP Server,它使用微软官方 T-SQL 解析器 TSql180Parser,把每条查询解析成完整抽象语法树,再判断是否允许执行。与简单正则或关键词扫描相比,AST 能理解注释、字符串、嵌套结构和真实语句类型,因此更难被文本变形绕过。

项目只允许单条 SELECT 或 WITH CTE 查询,禁止 INSERT、UPDATE、DELETE、DROP、EXEC、CREATE、ALTER 等其他语句类型,还会阻止 SELECT INTO、外部数据访问、链接服务器和 MAXRECURSION hint。所有工具还受并发与吞吐速率限制。

AST 校验很强,但不是全部安全边界。SqlAugur 允许三段式跨数据库名称,安全边界默认是整个 SQL Server 实例;查询结果也可能包含恶意提示。数据库登录仍需最小权限,敏感数据库、对象和列必须在 SQL Server 授权层限制。

为什么正则检查容易出错

很多数据库 MCP 只检查查询是否以 SELECT 开头,或搜索 DELETE、DROP 等关键词。攻击者可以利用注释、大小写、编码、字符串和多语句批次让文本检查误判。

正则也容易把字符串内容中的关键词当成危险操作,拒绝合法查询。规则越复杂,维护越困难,仍无法真正理解 T-SQL 语法。

SqlAugur 先让官方解析器构建语法树,再检查节点类型和结构。注释和字符串在 AST 中具有明确位置,不会被当成可执行语句。

TSql180Parser 是什么

TSql180Parser 来自 Microsoft ScriptDom,是微软提供的 T-SQL 解析组件。它能把 SQL 文本转换为表示批次、语句、表达式、对象名和查询选项的结构树。

SqlAugur 根据 AST 判断批次中有几条语句、语句是否属于 SELECT、是否包含 INTO、外部数据源、四段式名称或被禁止 hint。

使用官方解析器可以跟随 SQL Server 方言,但仍要关注 ScriptDom 版本和安全更新。项目当前还依赖官方 MCP C# SDK,任何协议层漏洞也会影响边界。

只允许单条语句

SqlAugur 拒绝包含多条语句的批次。这样可以阻止在合法 SELECT 后追加分号和第二条 DROP、UPDATE 或 EXEC。

单条限制也让审计和资源控制更清晰。每次工具调用对应一个查询,不会在同一批次隐藏多步操作。

不要通过存储过程或函数把多步写入封装后视为单条安全语句。数据库账户权限仍要阻止执行副作用对象。

只允许 SELECT 和 CTE

普通查询必须是 SELECT;需要公用表表达式时可以使用 WITH 后接 SELECT。其他语句节点一律拒绝。

这比检查第一个词更准确。解析器会识别 CTE 的主体、嵌套查询和批次结构,不会把 WITH UPDATE 当成只读 CTE。

只读 SELECT 仍可能消耗大量资源或读取敏感数据,所以还需要行数、超时、并发和对象权限。

为什么禁止 SELECT INTO

SELECT INTO 形式看似以 SELECT 开头,却会创建新表并写入数据。如果仅用关键词白名单,它很容易被错误允许。

AST 能识别查询规格中的 INTO 目标,SqlAugur 明确拒绝。这是语法结构校验优于开头匹配的典型例子。

数据库只读账户也应没有 CREATE TABLE 权限,形成第二层保护。

阻止外部数据访问

SqlAugur 禁止 OPENROWSET 的所有变体,包括 BULK、Cosmos DB 和内部用法,也禁止 OPENQUERY、OPENDATASOURCE 与 OPENXML。

这些功能可能读取本地文件、远程数据库或外部服务,扩大数据边界,甚至把 SQL Server 变成网络跳板。

AST 能识别对应函数和表引用,不必依赖字符串是否刚好出现大写关键词。SQL Server 侧仍应关闭不需要的 Ad Hoc Distributed Queries 和外部访问权限。

阻止链接服务器

四段式对象名通常包含 server.database.schema.object,可通过 linked server 查询另一实例。SqlAugur 拒绝四段式引用。

这阻止 Agent 借当前连接访问配置好的其他服务器。链接服务器登录映射可能具有比当前用户更高的权限,风险尤其大。

管理员还应检查 SQL Server linked servers 配置并删除不需要项。MCP 校验不能保护其他客户端。

为什么阻止 MAXRECURSION

递归 CTE 默认有递归限制,MAXRECURSION hint 可以改变限制。SqlAugur 拒绝它,防止 Agent覆盖默认递归上限并产生 runaway 查询。

即使不使用该 hint,递归和复杂查询仍可能昂贵。CommandTimeoutSeconds 与资源治理应同时生效。

对层级数据先限定根节点和深度,不让模型尝试无限遍历。

跨数据库查询默认允许

SqlAugur 允许 database.schema.object 三段式名称,这是项目有意设计。配置中的连接通常指向 master,以便列出服务器上的数据库并按名称查询。

因此安全边界是 SQL Server 实例,不是连接字符串中的默认数据库。若登录在多个数据库有用户映射和 SELECT,Agent 可以跨库读取。

需要限制到单库时,必须在登录和数据库用户层收紧权限,不给其他数据库映射。不要依赖 Initial Catalog。

创建专用只读登录

为 SqlAugur 创建独立登录,只在批准数据库映射用户,并加入 db_datareader 或更窄的自定义角色。

CREATE LOGIN sqlaugur_reader
WITH PASSWORD = 'replace-with-strong-secret';
USE [Reporting];
CREATE USER sqlaugur_reader FOR LOGIN sqlaugur_reader;
ALTER ROLE db_datareader ADD MEMBER sqlaugur_reader;

不加入 db_owner、db_datawriter 或 sysadmin。敏感表通过自定义角色或脱敏视图暴露。

安装方式

推荐安装 .NET Global Tool,需要 .NET 10 Runtime:

dotnet tool install -g SqlAugur

也可以使用 Docker、Podman 或从源码构建。从源码需要 .NET 10 SDK。生产环境固定版本或镜像 digest,不使用浮动 latest。

安装后先保存 appsettings.json,再配置 MCP 客户端,最后调用 list_servers 验证。

本地配置位置

Linux 与 macOS 的用户配置位于 .config/sqlaugur/appsettings.json,Windows 位于 APPDATA 下的 sqlaugur/appsettings.json。

配置包含命名 SQL Server 连接。文件应限制为当前用户读取,并保持在 Git 之外。

优先使用 Windows Authentication 或 Azure Managed Identity,减少保存密码。需要 SQL Authentication 时通过环境变量或秘密存储注入。

最小 MCP 客户端配置

{
  "mcpServers": {
    "sqlaugur": {
      "command": "sqlaugur"
    }
  }
}

重启客户端后先调用 list_servers,再对某个名称调用 list_databases。返回认证错误时检查 SqlAugur 实际读取的配置位置和连接权限。

不要把连接字符串直接写进客户端共享配置。

配置优先级

SqlAugur 按命令行、环境变量、当前工作目录 appsettings.json、用户配置目录、Azure Key Vault、应用目录配置的顺序覆盖。

高优先级来源可能静默覆盖安全设置。打开不可信仓库时,当前目录 appsettings.json 尤其需要检查。

生产进程固定工作目录,记录最终有效配置,但日志中隐藏连接字符串和秘密。

Azure Key Vault

设置 AzureKeyVaultUri 后,可以使用 DefaultAzureCredential 读取秘密。Key Vault secret 名使用双连字符映射配置层级。

运行身份只读取指定 vault 与连接 secret,不要授予管理密钥和全部秘密权限。

托管身份轮换更易管理,但 Azure 身份被攻破仍能读取数据库。数据库账户权限继续保持只读。

默认资源限制

MaxRows 默认 1000,CommandTimeoutSeconds 默认 30,MaxConcurrentQueries 默认 5,MaxQueriesPerMinute 默认 60。

并发限制防止多个 Agent 同时占满连接,令牌桶吞吐限制防止循环快速重试。超额请求会被拒绝并提示稍后重试。

这些值是起点,不是所有数据库的最佳值。根据实例容量、工作负载和用户数调整,并在 SQL Server 侧配置 Resource Governor 或报告副本。

核心六个工具

list_servers 列命名实例,list_databases 列数据库,read_data 执行只读查询,get_query_plan 返回估计或实际 XML 计划,get_schema_overview 生成紧凑模式图,describe_table 返回详细表元数据。

核心工具始终可用。初始工具较少能降低模型上下文负担和误选概率。

get_query_plan 的实际计划可能真正执行查询,使用前确认模式、数据规模和权限。优先估计计划。

模式探索和 ER 图

模式工具可以列出可编程对象、读取对象定义、扩展属性和依赖关系。图形工具生成 PlantUML 或 Mermaid ER 图,并保存到本地文件。

模式信息可能暴露业务结构和敏感字段,文件输出还会写入本机。限制输出目录和文件权限。

图工具表数量上限为 200,使用 schema 与 table 过滤,避免生成巨大文件和上下文。

DBA 诊断工具

SqlAugur 可选集成 First Responder Kit、DarlingData 和 sp_WhoIsActive。它们用于性能、阻塞、索引、Query Store、日志和活动会话分析。

对应存储过程必须预先安装,配置 flags 默认 false。只有 DBA 场景和批准服务器才启用。

诊断工具可能读取查询文本、计划、登录和服务器配置,结果敏感。数据库账户需要额外 EXECUTE 与 DMV 权限,应逐项评估。

诊断过程参数阻断

First Responder Kit 的 Output 系列参数被阻断,防止把结果写入服务器表。DarlingData 的日志和输出参数也被阻断。

sp_WhoIsActive 的 destination_table、return_schema、schema 和 help 等参数被禁止,避免建表或返回可执行 schema。

调用只允许白名单过程名和安全参数。安装自定义修改版过程后应重新审查,参数阻断基于预期接口。

响应大小优化

DBA 工具默认排除 XML 查询计划、死锁图和详细指标,并截断长字符串,文档称可减少 90% 到 99% 响应体。

verbose 和 includeQueryPlans 可以返回完整内容,但会增加敏感信息、网络和上下文负担。仅在明确诊断时使用。

大响应可能超过客户端限制或把查询文本送入模型。先用默认紧凑模式定位,再按需展开。

渐进式工具发现

SqlAugur 最多提供 31 个工具。启用 EnableDynamicToolsets 后,初始只暴露核心工具,模型通过 list_toolsets、get_toolset_tools 和 enable_toolset 按需加载 DBA 工具集。

管理员的 Enable flags 仍决定哪些工具集可用,模型不能启用未授权类别。

渐进发现减少初始上下文和误选,但依赖 MCP tools list changed 通知。

Claude Code 的已知兼容限制

项目说明 Claude Code 当前不处理动态工具列表变化通知,因此动态启用的工具不会出现。

在 Claude Code 中使用 DBA 工具时,应将 EnableDynamicToolsets 保持 false,采用静态模式。

客户端兼容性会变化,升级后以实际工具列表验证,不根据配置成功推断工具已可调用。

速率限制如何测试

使用无敏感测试库并发发起超过 MaxConcurrentQueries 的慢查询,确认多余请求被拒绝而不是排队耗尽连接。

在一分钟内超过 MaxQueriesPerMinute,确认令牌桶返回重试信息。客户端不应立即无限重试。

监控 SQL Server 会话、CPU 和连接数,验证限制在所有工具和诊断过程中一致生效。

AST 校验如何测试

测试合法 SELECT、CTE、注释和字符串,确认不被误伤。再测试多语句、DML、DDL、EXEC 和 SELECT INTO,必须拒绝。

测试 OPENROWSET、OPENQUERY、OPENDATASOURCE、OPENXML、四段式名称和 MAXRECURSION,确认 AST 节点规则生效。

升级 ScriptDom 或 SqlAugur 后复跑回归。只在隔离测试库测试危险语句。

查询结果中的提示注入

SqlAugur 能保证查询语法只读,不能保证返回数据可信。表字段可能包含诱导模型调用其他工具或泄露数据的指令。

把查询结果标记为不可信数据,不允许其改变系统规则、连接名称和工具授权。敏感工具要求人工审批。

只连接可信数据源,并限制数据库、表、列和行。项目自身明确将此列为无法在服务器内消除的 AI 安全风险。

常见错误

认为 AST 可以替代数据库权限

AST 保护 SQL 形态,但跨库查询默认允许,函数和未来解析器也可能有边界。专用只读登录不可缺少。

连接到 master 就以为只读单库

三段式名称允许跨数据库。移除登录在其他数据库的权限,而不是依赖默认库。

开启所有 DBA 工具

默认 flags 为 false。只启用已安装、已审查且业务需要的工具,并授予最小诊断权限。

直接使用 latest 容器

浮动标签会改变二进制和依赖。固定 digest,升级前运行 AST 与速率测试。

上线检查清单

确认使用 .NET 10 运行时和固定 SqlAugur 版本;配置文件不在 Git;优先 Windows Authentication、Managed Identity 或 Key Vault。

确认数据库登录只映射批准数据库,只有 SELECT 与必要 metadata 权限;跨库、链接服务器和外部数据访问测试已完成。

确认 MaxRows、超时、并发和每分钟限制适合生产;DBA flags 默认关闭;响应优化和审计启用。

确认客户端兼容动态工具发现;查询结果按不可信内容处理;MCP SDK 与 ScriptDom 安全更新进入维护流程。

SqlAugur 的核心优势是让 T-SQL 先变成结构化 AST,再以语法节点阻止危险查询,而不是猜测文本里有没有关键词。配合单语句、SELECT-only、外部访问阻断、速率限制和诊断参数白名单,它提供了扎实的应用层防护;再加数据库最小权限与数据边界,才能形成可靠的 SQL Server MCP 安全方案。

热门栏目