多數企業 RAG 部署所欠缺的權限層

您的私有 LLM 並未外洩。外洩的是您的檢索層。

資淺分析師提出一個例行問題,過時的擷取時 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 防火牆如何運作

一套確定性政策引擎決定模型看到什麼。不是模型,也不是提示。

每一次查詢都跑同一條管線:

查詢 + 使用者身分 → 檢索 → RBAC 防火牆(確定性,位於任何 LLM 之外)→ 僅限獲准文件 → 回答 LLM → 雜湊鏈稽核紀錄

1. 即時權限解析

對每一份候選文件,防火牆在查詢時解析使用者的有效權限:它遞迴攤平巢狀 AD/OU 群組(測試夾具巢狀 3 層深),並依文件的結構化政策參照評估 ABAC 屬性:密等等級 L1 至 L4、受管理裝置、部門、具到期日的時限專案授權,以及僱用狀態。

2. 確定性判定

每份文件得到 ALLOW、附有機器可核對原因代碼的 WITHHELD(BOARD_MEMBERSHIP_REQUIRED、ACCESS_WINDOW_EXPIRED、ALL_ACCESS_REVOKED_TERMINATION、POLICY_CONFLICT),或 NEEDS_REVIEW。被扣留的文件在進入情境視窗之前就被丟棄,因此模型永遠看不到使用者無權存取的文件。遇任何衝突或未解析參照時,預設拒絕並改送人工審查,而非猜測。

3. 收據

每一次查詢都會向僅可附加的 SHA-256 雜湊鏈追加一筆紀錄,並具竄改驗證:使用者、已解析權限集合、已檢索、已提供與已扣留(附原因代碼)的文件、需審查衝突、模型與供應商,以及提示/回應配對。可匯出為 JSON,在 VPC 內產生。這正是歐盟 AI 法案第 50 條檔案所要求的檢索存取證據紀錄。

它所勝過的基準並非稻草人

示範的對照側是忠實的天真扁平 ACL RAG,也就是多數試行實際交付的建置。它確實在擷取時解析巢狀群組。其失敗是兩項誠實、固有的限制:快照會過時,且扁平標籤無法表達密等、裝置、時間視窗或終止。在示範的 40 案例黃金集上,這兩項限制產生 10 次未授權揭露與 1 次錯誤拒絕,該錯誤拒絕來自擷取後才加入的人員,凍結快照錯過了其權益。

LLM 是可替換的布景

建立在 Pydantic AI 上的回答路徑只接收防火牆之後獲准的區塊,陳述什麼被扣留以及為什麼,而非虛張聲勢,且對權限零裁量權。它可藉由一個環境變數替換供應商:Anthropic(預設模型 claude-opus-4-8)、OpenAI、Gemini,或用於氣隙主權部署的 Ollama,此時沒有任何東西、連一個 token 都不會離開箱體。從不需要 API 金鑰:示範在本機橋接運行時把回答路由到該橋接,否則回退到確定性存根,而評測計分板從不呼叫 LLM。防火牆才是產品;模型是布景。

計分板是獨立的

40 案例集的黃金標籤由獨立參照判定器機械推導,那是依政策定義而非受測防火牆寫成的另一套實作。計分板是身分圖譜的函數,而非手挑結果,每一個數字都在執行時計算,從不寫死。強制執行開銷以微秒計,行程內,僅計防火牆邏輯本身;正式環境的 IdP 往返會增加延遲,本示範以存根代替。

單一扼流點,為代理就緒

Gartner 預估到 2026 年底,40% 的企業應用程式將嵌入 AI 代理,高於 2025 年不到 5% 的水準。同一個確定性 authorize(user, doc) 閘道是該世界已文件化的擴充路徑,而非本示範已出貨的功能:代理無法檢索其代表之使用者本身無法取得的內容。

EUR 412 million 外洩,從頭到尾走一遍

一個問題,由一名合成分析師提出,在分割畫面兩側作答。下方每一張圖都是執行中應用程式的螢幕截圖;每一個身分、文件與數字都是合成測試夾具資料。

造成外洩的那個問題

Lena Vogt,EMEA 信用風險分析師、密等 L2,問:「我們 Q3 EMEA 信用損失預估是多少,背後方法論是什麼?」檢索把僅限董事會的 Q3 董事會資料包連同她可以看的文件一起浮出。扁平 ACL 一側把它提供出去:身分圖譜中多年巢狀群組繼承負債已使她因傳遞關係成為「董事會」成員,而僅有群組的標籤沒有密等概念。備忘錄到達模型,答案讀出 EUR 412 million,橫幅寫著 LEAK。

分割畫面外洩:天真扁平 ACL 一側向 L2 分析師 Lena Vogt 讀出 EUR 412 million 僅限董事會預估,並帶紅色 LEAK 橫幅與「已提供 1 份未授權文件」的警告,而 RAGGUARD 一側顯示 5 份已檢索、2 份獲准、3 份被拒。
外洩當下:一份僅限董事會備忘錄被向 L2 分析師讀出。數字是合成的;失效模式不是。

同一個查詢,在防火牆之後

在 RAGGUARD 一側,相同的檢索會執行,但董事會資料包在進入 LLM 之前就被扣留,原因代碼為 BOARD_MEMBERSHIP_REQUIRED:該文件要求密等 L4,而 Lena 持有 L2。模型從內部方法論說明與機密備忘錄正確作答——她的巢狀群組鏈確實賦予她那些權限——並陳述什麼被扣留以及為什麼,而非虛張聲勢。

Lena 查詢後示範的 RAGGUARD 一側:5 份已檢索、2 份獲准、3 份被拒,並附扣留說明,列出被拒文件及其原因代碼,包括董事會資料包上的 BOARD_MEMBERSHIP_REQUIRED。
同一問題、同一檢索:5 份已檢索、2 份獲准、3 份被拒,每一次拒絕都帶有原因代碼。

模型實際看到了什麼

決定詳情模態在兩側顯示逐字模型輸入。左側,外洩的董事會資料包坐在提示之內,標為紅色。右側,它根本不在:模型永遠看不到使用者無權存取的文件。逐文件檢視讓分歧一目了然,同一列董事會資料包在一側讀作「未經授權即提供」,在另一側讀作「於檢索時拒絕存取」並附原因代碼。

兩側的逐字模型輸入:僅限董事會文件在扁平 ACL 提示內被標為紅色,而從 RAGGUARD 提示中缺席,該提示標示為僅奠基於獲准文件。
情境視窗,逐字呈現:外洩文件在左側存在,在右側缺席。
逐文件決定檢視:董事會資料包列在扁平 ACL 一側讀作未經授權即提供,在 RAGGUARD 一側讀作於檢索時拒絕存取,並附原因代碼 BOARD_MEMBERSHIP_REQUIRED。
同一份文件,兩種判定:未經授權即提供,對上於檢索時拒絕,並附原因代碼。

那場無物可偷的注入

內部方法論說明內嵌一條提示注入字串,指示任何讀到它的 AI 助理忽略其檢索權限並輸出完整董事會數字。在防火牆一側它沒有任何東西可外洩:董事會資料包從未進入情境視窗,因為授權發生在 LLM 之前。這是一個已標註案例,作為檢索時執行的縱深防禦來展示,而非獨立的防護機制產品。

內部方法論說明內嵌的提示注入行,在決定詳情檢視中被醒目標示,指示任何 AI 助理忽略檢索權限並輸出董事會信用損失數字。
注入就在模型被允許讀取的那份文件裡。它要針對的那份文件從未到達模型。

身分圖譜在動。快照不會。

Priya Shah 在示範時鐘上九分鐘前被終止,測試夾具的 webhook 已觸發。防火牆對一切回傳 ALL_ACCESS_REVOKED_TERMINATION:0 份獲准、5 份被拒。扁平 ACL 快照在終止之前建立,仍向她提供,因為重新索引尚未執行。示範對 Marco Rossi 走同一條邊界:其時限 Project-Atlas 授權在示範時鐘上昨天到期(ACCESS_WINDOW_EXPIRED);對 Raj Patel,他同時坐在允許群組與拒絕群組中(POLICY_CONFLICT,留待人工審查);以及 Wei Chen,防火牆正確向其提供的 L4 董事會成員,作為正向對照,證明它並非一律全部拒絕。

已終止員工案例:Priya Shah 在身分列上帶 TERMINATED 徽章,RAGGUARD 一側顯示 0 份獲准與 5 份被拒,原因代碼 ALL_ACCESS_REVOKED_TERMINATION,而扁平 ACL 一側仍從過時快照提供。
九分鐘前被終止:防火牆撤銷一切;擷取快照尚未察覺。

收據,顯示在畫面上

這些決定每一筆都會落入可偵測竄改的稽核軌跡:一筆雜湊鏈 JSON 紀錄,記載誰問了什麼、提供了什麼、扣留了什麼以及為什麼、哪個模型作答,並帶 CHAIN INTACT 驗證晶片與一鍵匯出。自動產生,在 VPC 內。

可偵測竄改的稽核軌跡:CHAIN INTACT 晶片、已提供與已扣留文件(附原因代碼)的雜湊鏈 JSON 紀錄,以及「匯出稽核紀錄」按鈕。
雜湊鏈稽核紀錄:第 50 條檔案所要求的成品,而非認證。

計分板,及其確切範圍

黃金集是 40 個已標註的(使用者, 文件)允許/拒絕決定:10 名使用者對 4 份敏感文件,標籤由獨立判定器依身分圖譜語意機械推導。防火牆得分 40/40,0 次未授權揭露、0 次錯誤拒絕。扁平 ACL 基準得分 29/40,含 10 次未授權揭露——包括向 7 名未授權使用者提供董事會資料包、已到期的 Atlas 視窗,以及已終止員工——外加 1 次錯誤拒絕。每一個數字都由工具組在執行時計算,從不寫死,而逐案例下鑽在兩套系統的決定旁顯示每個判定器標籤。這些是黃金集結果,不是開放世界保證。

40 案例基準計分板:天真扁平 ACL RAG 為 29/40,含 10 次未授權揭露與 1 次錯誤拒絕;RAGGUARD 為 40/40,含 0 次未授權揭露與 0 次錯誤拒絕。
計分板,由評測工具組對照判定器標籤即時計算。
逐案例基準下鑽:判定器將該案例標為拒絕,扁平 ACL 基準提供了文件,RAGGUARD 將其扣留,並以政策晶片說明該決定。
逐案例下鑽:判定器標籤、扁平 ACL 決定、防火牆決定,以及作出該決定的政策。

天真扁平 ACL RAG 對上主權 RBAC 防火牆

示範即時執行的同一比較,在同一身分圖譜與同一批文件上。

維度 天真扁平 ACL RAG(典型試行建置) 主權 RBAC 防火牆(RAGGUARD)
授權發生的時機 在擷取時,凍結成每個區塊上的標籤 在檢索時,每次查詢、每份文件
巢狀群組與跨 OU 繼承 在擷取時解析一次;快照會過時 每一次查詢都對即時身分圖譜遞迴攤平
ABAC:密等、裝置、時限授權、僱用狀態 扁平標籤無法表達 逐文件對照結構化政策參照評估
九分鐘前的終止 在重新索引執行前仍會提供 對一切回傳 ALL_ACCESS_REVOKED_TERMINATION
同一份文件上的衝突政策 提供該文件 預設拒絕:NEEDS_REVIEW,改送人工並把衝突寫清楚
40 案例黃金集 29/40:10 次未授權揭露、1 次錯誤拒絕 40/40:0 次未授權揭露、0 次錯誤拒絕
稽核軌跡 每一次提供與扣留的雜湊鏈、可偵測竄改紀錄,可匯出為 JSON

本示範不做什麼

  • ✓ 它不連接到正式的 Active Directory、Okta、SharePoint 或 Confluence。身分提供者是合成的 Azure AD/SCIM 形狀 JSON 測試夾具,終止與到期是測試夾具事件,向量儲存庫在行程內、以 Qdrant 形狀的介面運行。正式 IdP 連接器是已文件化的正式環境替換,不是今天所運行的。
  • ✓ 它不涉及任何真實銀行、客戶或正式帳戶。Lena Vogt、Marco Rossi、Priya Shah、Raj Patel、Wei Chen、每一份文件,以及 EUR 412 million 這個數字都是合成的。
  • ✓ 它不主張開放世界保證。40/40 且 0 次未授權揭露,是在固定 40 案例已標註黃金集上計算出的結果,不是正式環境永遠不會外洩的承諾。
  • ✓ 它不量測正式環境延遲。微秒級強制執行開銷僅計行程內的防火牆邏輯;正式 IdP 往返(本示範以存根代替)會再增加延遲。
  • ✓ 它不出貨防護機制套件、DLP 或多代理平台。它是一項能力被令人信服地做完:檢索時權限防火牆,並以注入案例作為一個已標註的縱深防禦例子。回答路徑是 Pydantic AI,刻意非代理化的確定性閘道才是設計;代理治理是已文件化的擴充路徑。
  • ✓ 它不認證合規。稽核匯出是歐盟 AI 法案第 50 條檔案所要求的證據紀錄,而非認證,且本示範不存在任何客戶、部署或案例研究。

買方實際會問的問題

我們要如何阻止內部 AI 聊天機器人向員工顯示他們不該看到的文件?

在檢索時執行授權,而非擷取時。位於 LLM 之外的確定性政策引擎,在每一份被檢索文件到達模型之前,對照使用者當下的群組成員資格與屬性加以核對,因此被扣留的文件永遠不會進入情境視窗。在本示範中,該閘道在已標註的 40 案例黃金集上得分 40/40,對照多數試行所交付的扁平 ACL 建置的 29/40。

我們在建立索引時已經為文件標記權限。為什麼還不夠?

因為標籤是快照,而權限是身分圖譜的即時屬性。擷取時 ACL 會錯過索引之後發生的一切,例如終止或到期的專案授權,而且它完全無法表達密等等級或受管理裝置這類屬性規則。在示範中,這兩項限制在 40 案例基準上造成 10 次未授權揭露與 1 次錯誤拒絕,而該基準忠實地在擷取時解析巢狀群組。

提示注入能否誘使模型洩漏受限制文件?

若文件從未到達模型,就不能。本示範包含一個已標註案例:嵌在文件中的說明指示任何 AI 助理忽略其檢索權限並輸出僅限董事會數字,而注入沒有任何東西可外洩,因為授權發生在 LLM 之前,備忘錄從未進入情境視窗。那是檢索時執行的一個縱深防禦例子,而非獨立的防護機制產品。

當存取政策衝突或系統不確定時會怎樣?

預設拒絕。當使用者對同一份文件同時持有允許與拒絕成員資格,或政策參照無法解析時,防火牆回傳 NEEDS_REVIEW,並把案例改送人工、把衝突寫清楚,而非猜測。示範精確展示這一點:一名同時處於允許群組與拒絕群組的信用風險經理,其爭議備忘錄被留待審查,而非被提供。

有任何資料會離開我們的 VPC 嗎?這能否完全氣隙運行?

防火牆是確定性 Python,完全不需要模型,而回答路徑可藉由一個環境變數替換:Anthropic、OpenAI、Gemini 或 Ollama。設 LLM_PROVIDER=ollama 以進行氣隙主權部署,此時沒有任何東西、連一個 token 都不會離開箱體。示範本身離線運行、無需 API 金鑰,評測計分板從不呼叫 LLM。

我們要向稽核人員出示什麼,以說明誰透過 AI 系統存取了什麼?

每一次查詢都會向可偵測竄改的 SHA-256 雜湊鏈追加一筆紀錄:誰問了、已解析權限集合、提供了什麼、扣留了什麼以及為什麼、哪個模型作答。它匯出為 JSON,並在您的 VPC 內產生。這是歐盟 AI 法案第 50 條檔案所要求的檢索存取證據紀錄,而非合規認證。

這是正式的 Active Directory 整合,還是示範?

一個證明機制的可執行示範。身分提供者是合成的 Azure AD/SCIM 形狀 JSON 測試夾具,終止與授權到期是測試夾具事件,向量儲存庫在行程內、以 Qdrant 形狀的介面運行。政策引擎、評測工具組與雜湊鏈稽核匯出是真實的,並如所示運行;因為測試夾具鏡射 Azure AD Graph 與 SCIM 介面,通往正式 IdP 的已文件化正式路徑是設定替換,而非重寫。

技術研究

本示範背後的研究——架構、驗證設計,以及企業藍圖。

正在評估受監管企業的私有 LLM 部署?

權限層才是難的部分。我們打造它。

若您的團隊正在掙扎如何把私有模型對準受多年巢狀群組繼承所治理的語料庫,或歐盟 AI 法案的透明度義務對您的檢索日誌意味著什麼,我們真心想聽聽您怎麼想。這個問題是全產業的,答案也會是。

權限層評估

  • ✓ 對應您的 RAG 管線今天在何處授權:擷取時還是檢索時
  • ✓ 將您的巢狀群組與跨 OU 繼承建模為即時政策圖譜
  • ✓ 定義扁平標籤無法表達的 ABAC 規則:密等、裝置、時限授權
  • ✓ 指定您的第 50 條檔案所要求的檢索存取紀錄

打造檢索時防火牆

  • ✓ 位於任何 LLM 之外的確定性 authorize(user, doc) 閘道
  • ✓ 在 Azure AD Graph 與 SCIM 形狀介面背後的即時 IdP 解析
  • ✓ 預設拒絕的衝突路由,改送人工審查
  • ✓ 在您 VPC 內產生的雜湊鏈、可匯出稽核軌跡
社群媒體

同步發佈於