大多数企业 RAG 部署所欠缺的权限层
一名初级分析师提出一个例行问题,而一份过时的摄入时 ACL 把一份仅限董事会的备忘录交给了模型。主权 RBAC 防火墙在查询时对照用户实时的嵌套组集合与属性,对每一份检索到的文档进行授权,并在模型看到任何一个 token 之前丢弃被扣留的文档。确定性代码,独立于任何 LLM 之外。智能体建议,代码裁定。
40/40
在黄金授权集上的正确裁定
0 次未授权披露,0 次错误拒绝,由评估框架计算得出
29/40
同一 40 个案例上忠实的扁平 ACL 基线
10 次未授权披露,1 次错误拒绝
$670K
影子 AI 数据泄露相对传统事件的额外成本
IBM Cost of a Data Breach, 2025
这是一个可运行的演示,而非一次部署。每一个身份与每一份文档都是合成的欧洲银行测试夹具;身份提供者为 Azure-AD/SCIM 形态的 JSON 测试夹具,向量存储在进程内、位于 Qdrant 形态的接口之后运行。
买下一套私有 LLM,并不意味着可以安全地指向皇冠级语料。
标准的试点构建会在摄入时用扁平 ACL 给每个文档分块打上标签。该设计在真实的企业身份面前会崩溃:嵌套的 Active Directory 组、跨 OU 继承、密级、有时限的项目授权,以及索引构建之后才发生的离职。结果就是本演示从头到尾所呈现的经典失败:一名初级分析师提出一个正常问题,而 RAG 流水线把一份仅限董事会的备忘录交给了模型,因为一份过时的摄入时快照声称她可以看到它。
根因是结构性的。文档权限是身份图的实时属性,因此对它的任何快照都已经是错的。更好的模型并不能修复这一点:一个完美的模型只要被交给一份董事会文档,仍然会把它泄露出去。价值在于治理什么到达模型,而不在于模型质量。
利害是可衡量的。影子 AI 数据泄露比传统事件多耗费 $670K,且 65% 的 AI 相关数据泄露危及了客户 PII(IBM Cost of a Data Breach, 2025)。影子 AI 数据泄露需要 247 天才能被发现,而平均为 241 天,五分之一的组织曾遭受与影子 AI 相关的数据泄露(IBM,2025 年)。在监管一侧,欧盟《AI 法案》第 50 条透明度义务将于 2026 年 8 月 2 日可强制执行,GDPR 与《AI 法案》合计罚则上限达到 EUR 55M 或全球年营业额的 11%。
我们自己的解决方案页将检索时权限强制执行称为“大多数企业 RAG 试点未能通过安全审查的原因”以及“企业 RAG 中最难的未解问题”。其背后的白皮书产品分析指出,市场上具备 RBAC 感知能力的 RAG 被描述但未被演示,没有可运行的实现。本演示就是那个可运行的实现。
一道确定性策略引擎决定模型看见什么。不是模型,也不是提示。
每一次查询都运行同一条流水线:
查询 + 用户身份 → 检索 → RBAC 防火墙(确定性,独立于任何 LLM 之外)→ 仅许可文档 → 回答 LLM → 哈希链式审计记录
对每一份候选文档,防火墙在查询时解析用户的有效权限:它递归展平嵌套的 AD/OU 组(测试夹具嵌套 3 层深),并对照文档的结构化策略引用评估 ABAC 属性:密级 L1 至 L4、受管设备、部门、带到期日的有时限项目授权,以及雇佣状态。
每一份文档得到 ALLOW、带有机器可核验原因码的 WITHHELD(BOARD_MEMBERSHIP_REQUIRED、ACCESS_WINDOW_EXPIRED、ALL_ACCESS_REVOKED_TERMINATION、POLICY_CONFLICT),或 NEEDS_REVIEW。被扣留的文档在进入上下文窗口之前被丢弃,因此模型永远看不到用户无权访问的文档。在任何冲突或未解析引用上,它默认拒绝并路由至人工审核,而非猜测。
每一次查询都会向仅追加的 SHA-256 哈希链追加一条带篡改核验的记录:用户、已解析权限集、检索到的、已送达的以及因原因码被扣留的文档、需审核冲突、模型与供应商,以及提示/响应对。可导出为 JSON,在 VPC 内生成。欧盟《AI 法案》第 50 条卷宗所要求的检索访问证据记录。
演示的对照侧是忠实的朴素扁平 ACL RAG,也就是大多数试点实际交付的构建。它确实在摄入时解析嵌套组。其失败是两项诚实、固有的局限:快照会过时,扁平标签无法表达密级、设备、时间窗口或离职。在演示的 40 例黄金集上,这两项局限产生 10 次未授权披露和 1 次错误拒绝,该错误拒绝是一名摄入后加入者,其权利被冻结快照遗漏。
建立在 Pydantic AI 上的回答路径只接收防火墙之后的许可分块,陈述被扣留了什么以及为何,而非虚张声势,并且对权限零权威。它可通过一个环境变量切换供应商:Anthropic(默认模型 claude-opus-4-8)、OpenAI、Gemini,或用于气隙主权部署的 Ollama,在那里没有任何东西、甚至一个 token 也不会离开盒子。永远不需要 API 密钥:演示在本地桥接运行时将回答路由到该桥接,否则回退到确定性桩,评估记分板从不调用 LLM。防火墙才是产品;模型是布景。
40 例集的黄金标签由独立参考预言机机械派生,那是一份根据策略定义而非被测防火墙写成的单独实现。记分板是身份图的函数,而非手挑结果,每一个数字都在运行时计算,从不硬编码。强制执行开销以微秒计,进程内,仅针对防火墙逻辑本身;生产 IdP 往返会增加本演示所桩掉的延迟。
Gartner 预测,到 2026 年底 40% 的企业应用将嵌入 AI 智能体,而 2025 年还不到 5%。同一道确定性 authorize(user, doc) 关卡是那个世界有文档记载的可扩展路径,而非本演示已交付的功能:智能体无法检索其所代表用户无法检索的内容。
一个问题,由一名合成分析师提出,在分屏两侧作答。下方每一张图都是运行中应用的截图;每一个身份、每一份文档和每一个数字都是合成测试夹具数据。
Lena Vogt,一名密级为 L2 的 EMEA 信用风险分析师,问道:“我们 Q3 EMEA 信贷损失预测是多少,其方法论是什么?”检索把仅限董事会的 Q3 董事会材料连同她可以看见的文档一起浮出。扁平 ACL 一侧将其送达:身份图中多年的嵌套组继承债务使她可传递地成为“董事会”成员,而仅有组标签没有密级概念。备忘录到达模型,回答读出 EUR 412 million,横幅显示 LEAK。
在 RAGGUARD 一侧,同样的检索会运行,但董事会材料在到达 LLM 之前被扣留,原因码为 BOARD_MEMBERSHIP_REQUIRED:该文档要求密级 L4,而 Lena 持有 L2。模型从内部方法论说明以及她的嵌套组链确实赋予她权利的机密备忘录中正确作答,并陈述被扣留了什么以及为何,而非虚张声势。
裁定详情模态框在两侧显示逐字的模型输入。左侧,被泄露的董事会材料坐在提示内,标为红色。右侧,它干脆不在:模型永远看不到用户无权访问的文档。逐文档视图让分歧一目了然,同一董事会材料行在一侧读作“未经授权即送达”,在另一侧读作“在检索时拒绝访问”并带有原因码。
内部方法论说明携带一条嵌入的提示注入字符串,指示任何阅读它的 AI 助手忽略其检索权限并输出完整的董事会数字。在防火墙一侧它无物可外泄:董事会材料从未进入上下文窗口,因为授权发生在 LLM 之前。这是一个带标签的案例,作为检索时强制执行的纵深防御展示,而非一个单独的护栏产品。
Priya Shah 在演示时钟上九分钟前被终止雇佣,测试夹具的 webhook 已触发。防火墙对一切返回 ALL_ACCESS_REVOKED_TERMINATION:0 份已授予,5 份已拒绝。扁平 ACL 快照在离职前构建,仍然向她送达,因为尚未运行重新索引。演示对 Marco Rossi 走同一条边,其有时限的 Project-Atlas 授权在演示时钟上昨天到期(ACCESS_WINDOW_EXPIRED);对 Raj Patel,他同时处于允许组和拒绝组(POLICY_CONFLICT,扣留待人工审核);以及对 Wei Chen,防火墙正确送达的 L4 董事会成员,作为证明它并非一味拒绝一切的阳性对照。
这些裁定每一条都落入防篡改审计轨迹:一条哈希链式 JSON 记录,记载谁问了什么、送达了什么、扣留了什么以及为何、哪个模型作答,带有 CHAIN INTACT 核验芯片和一键导出。自动生成,在 VPC 内。
黄金集是 40 个带标签的(用户,文档)允许/拒绝裁定:10 名用户对 4 份敏感文档,标签由独立预言机从身份图语义机械派生。防火墙得分 40/40,0 次未授权披露、0 次错误拒绝。扁平 ACL 基线得分 29/40,10 次未授权披露,包括向 7 名未授权用户送达董事会材料、已过期的 Atlas 窗口,以及已离职员工,外加 1 次错误拒绝。每一个数字都由框架在运行时计算,从不硬编码,逐案下钻将每个预言机标签与两套系统的裁定并排显示。这些是黄金集结果,而非开放世界保证。
演示实时运行的同一对照,基于同一身份图和同一批文档。
| 维度 | 朴素扁平 ACL RAG(典型试点构建) | 主权 RBAC 防火墙(RAGGUARD) |
|---|---|---|
| 授权发生的时机 | 在摄入时,冻结为每个分块上的标签 | 在检索时,按查询、按文档 |
| 嵌套组与跨 OU 继承 | 在摄入时解析一次;快照会过时 | 每一次查询都对照实时身份图递归展平 |
| ABAC:密级、设备、有时限授权、雇佣状态 | 扁平标签无法表达 | 按文档对照结构化策略引用进行评估 |
| 九分钟前的离职 | 在重新索引运行之前仍会送达 | 对一切返回 ALL_ACCESS_REVOKED_TERMINATION |
| 同一文档上的冲突策略 | 送达该文档 | 默认拒绝:NEEDS_REVIEW,路由给人工并写明冲突 |
| 40 例黄金集 | 29/40:10 次未授权披露,1 次错误拒绝 | 40/40:0 次未授权披露,0 次错误拒绝 |
| 审计轨迹 | 无 | 哈希链式、防篡改的每一次送达与扣留记录,可导出为 JSON |
在检索时而非摄入时强制执行授权。独立于 LLM 之外的确定性策略引擎在每一份检索到的文档到达模型之前,对照用户实时的组成员资格与属性进行检查,因此被扣留的文档永远不会进入上下文窗口。在本演示中,该关卡在带标签的 40 例黄金集上得分 40/40,而大多数试点交付的扁平 ACL 构建为 29/40。
因为标签是快照,而权限是身份图的实时属性。摄入时 ACL 会错过索引之后发生的一切变化,例如离职或过期的项目授权,并且完全无法表达密级或受管设备这类属性规则。在演示中,这两项局限在 40 例基准上造成 10 次未授权披露和 1 次错误拒绝,而该基线在摄入时忠实地解析了嵌套组。
如果文档从未到达模型,就不能。演示包含一个带标签案例:嵌入文档中的一条说明指示任何 AI 助手忽略其检索权限并输出仅限董事会的数字,而注入无物可外泄,因为授权发生在 LLM 之前,备忘录从未进入上下文窗口。那是检索时强制执行的一个纵深防御示例,而非一个独立的护栏产品。
默认拒绝。当用户对同一文档同时持有允许与拒绝的成员资格,或策略引用无法解析时,防火墙返回 NEEDS_REVIEW,并将该案路由给人工并写明冲突,而非猜测。演示精确展示了这一点:一名同时处于允许组与拒绝组的信用风险经理,其争议备忘录被扣留待审,而非送达。
防火墙是确定性 Python,根本不需要模型,回答路径可通过一个环境变量切换:Anthropic、OpenAI、Gemini 或 Ollama。设置 LLM_PROVIDER=ollama 用于气隙主权部署,没有任何东西、甚至一个 token 也不会离开盒子。演示本身离线运行、无需 API 密钥,评估记分板从不调用 LLM。
每一次查询都会向防篡改的 SHA-256 哈希链追加一条记录:谁问了、已解析权限集、送达了什么、扣留了什么以及为何、哪个模型作答。它导出为 JSON,并在您的 VPC 内生成。它是欧盟《AI 法案》第 50 条卷宗所要求的检索访问证据记录,而非合规认证。
一个证明该机制的可运行演示。身份提供者是合成的 Azure-AD/SCIM 形态 JSON 测试夹具,离职与授权到期是测试夹具事件,向量存储在进程内、位于 Qdrant 形态接口之后运行。策略引擎、评估框架和哈希链式审计导出是真实的,并完全按所示运行;因为测试夹具镜像 Azure AD Graph 和 SCIM 接口,通往实时 IdP 的有文档记载的生产路径是一次配置替换,而非重写。
权限层才是难处。我们来构建它。
如果您的团队正在纠结如何把私有模型指向一份由多年嵌套组继承所治理的语料,或纠结欧盟《AI 法案》的透明度义务对您的检索日志意味着什么,我们真诚希望听听您是如何思考的。这个问题是全行业的,答案也将如此。