恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Vanna AI数据库查询安全:一条SQL从生成到落库,权限在哪几道关被检查
首页
资讯中心
/
Vanna AI数据库查询安全:一条SQL从生成到落库,权限在哪几道关被检查
Vanna AI数据库查询安全:一条SQL从生成到落库,权限在哪几道关被检查
发布时间:2026/9/5 15:20:38
Vanna AI数据库查询安全一条SQL从生成到落库权限在哪几道关被检查【免费下载链接】vanna Chat with your SQL database . Accurate Text-to-SQL Generation via LLMs using Agentic Retrieval .项目地址: https://gitcode.com/GitHub_Trending/va/vanna一条把客户列表发我的自然语言提问让模型生成的 SELECT 少了 WHERE 子句三万行客户资料整表流出。AI 直连数据库后应用层只能看自己数据的防线形同虚设。Vanna AI 的数据库查询安全设计就是在请求链路上设下身份解析、权限校验、SQL 改写、审计落盘几道关。️ 一个请求进来安全链路上发生了什么Vanna AI 把执行 SQL建模成一次工具调用安全逻辑全部挂在这条链上身份解析UserResolver从 Cookie、JWT 或会话头里取凭证翻译成带group_memberships的User对象权限校验工具的access_groups与用户所属组求交集为空即拒绝拒绝原因连同用户组信息记入访问检查事件SQL 改写transform_args按用户上下文改写查询参数行级过滤在这一步发生执行与落盘SQL 交给对应数据库的 runner 执行工具调用、执行结果、AI 响应各自生成审计事件写盘。校验的主体逻辑集中在src/security/任何一步失败都不会走到下一步。权限最终怎么落到某一行数据上工具级权限决定能不能执行行级安全决定执行后能看到哪些行。SQL 先由检索增强加 LLM 生成行过滤发生在生成之后、执行之前这是整套权限模型的分界。身份从哪来请求被翻译成用户对象UserResolver是个抽象基类只要求实现一个方法resolve_user从请求上下文的 header 或 cookie 里取凭证返回User。User上有两个关键字段group_memberships决定用户属于哪些组metadata携带组织、租户等上下文。认证可以是 JWT、SSO也可以是聊天内验证邮箱的轻方案——框架只认请求到 User这个映射不关心身份来自哪个系统。权限组怎么定工具声明谁能碰它每个Tool都带access_groups属性。空列表表示所有已认证用户可用声明了[finance_ops]就只有组内成员能触发该工具。组的划分建议按数据域而非岗位命名read_sales、write_finance对应的是能碰哪块数据不是什么职级。这一步解决动作准入数据行怎么过滤交给参数改写。数据行怎么被过滤transform_args 里的多租户RLS行级过滤落在ToolRegistry.transform_args工具参数在执行前经过它可以按用户改写也可以返回ToolRejection直接终止。常见写法是给 SELECT 追加 WHERE——销售带自己客户 ID 的过滤条件经理带团队组织 IDSaaS 场景按organization_id逐租户过滤就是标准的多租户RLS。查询里出现受限表名时返回拒绝而不是放行过滤和拦截共用同一个钩子少一条旁路。 事前、事中、事后各拦了什么事前生命周期钩子在消息进处理之前动手LifecycleHook提供before_message和before_tool两个时机。前者在消息进入处理前运行可以改写内容也可以抛异常直接中止配额检查、内容安全过滤都适合放这里后者在每次工具执行前运行抛异常即阻止这次调用。钩子以独立类注入不侵入工具实现检查逻辑可以单独测试、单独下线。事中限流与参数脱敏同步进行工具执行期间速率限制按用户或组计数防止单账号把数据库刷爆带注入特征的 SQL 在参数层拦截不进入 runner。审计写入的参数默认脱敏password、token、api_key一类字段在写盘前替换为[REDACTED]避免敏感值随日志二次泄露。事后自然语言转SQL审计有据可查AuditLogger定义了几类事件访问检查谁、哪些组、是否放行、拒绝原因、工具调用工具名、参数、是否脱敏、工具结果成败、耗时、返回大小、AI 响应响应哈希、调用的工具列表。实现可写文件、入数据库或推 SIEM。事件带request_id与conversation_id一次提问的所有动作能串成时间线按时间范围即可回溯。接口见src/audit/。上线前你需要改动的三处配置把真实身份接进 UserResolver不接真实身份所有请求落到同一个匿名用户权限组形同虚设class JwtUserResolver(UserResolver): async def resolve_user(self, request_context): token request_context.get_header(Authorization) payload decode_jwt(token) return User( idpayload[sub], group_membershipspayload[groups], )在 transform_args 写行级过滤没有这一步有工具权限的用户仍能 SELECT 全表。组织 ID 建议放进用户metadata由身份系统下发不依赖用户自报class RlsRegistry(ToolRegistry): async def transform_args(self, tool, args, user, context): if tool.name execute_sql: args.query append_where( args.query, forg_id {user.metadata[org_id]} ) return args打开审计并导出到日志平台审计器不注入事件就不落盘事后追溯无从谈起。生产环境建议同时保留 AI 响应哈希用于核对模型当时生成的 SQL 原文。其余配置项见docs/security.md。同一套机制在不同业务里的取舍机制相同参数不同。三个典型业务在粒度、审计深度和合规约束上的差别业务权限粒度审计深度合规约束金融工具级 access_groups 细分到报表、账务域全量事件入 SIEM长保留期响应哈希留痕内审与监管的双重留痕要求医疗以多租户 RLS 为主按机构、科室过滤数据行脱敏默认开启敏感字段不落盘HIPAA 患者隐私访问可归因到个人电商组较粗靠配额与限流控制滥用抽样存储异常模式告警GDPR 数据主体访问与删除权取舍逻辑金融宁可慢也要全量可追溯审计不抽样医疗的敏感点在数据本身过滤前置、脱敏默认电商并发高、单次查询价值低预算花在限流上更划算。回到开头那句把客户列表发我在 Vanna AI 的链路上它会被定位到具体组织、在权限校验时被挡下、或在 SQL 改写时带上 WHERE 子句并留下一条审计事件。整张客户表流出正是这几道关共同拦下的场景。【免费下载链接】vanna Chat with your SQL database . Accurate Text-to-SQL Generation via LLMs using Agentic Retrieval .项目地址: https://gitcode.com/GitHub_Trending/va/vanna创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考