De permissielaag die de meeste enterprise-RAG-implementaties ontberen
Een junior analist stelt een routinevraag, en een verouderde ACL van het ingestiemoment overhandigt het model een Board-Only-memo. De Sovereign RBAC Firewall autoriseert elk opgehaald document op querytijd, tegen de live nested-group-set en attributen van de gebruiker, en filtert achtergehouden documenten weg voordat het model een token ziet. Deterministische code, buiten elke LLM. Agents adviseren, code beslist.
40/40
Correcte beslissingen op de gouden autorisatieset
0 ongeautoriseerde openbaarmakingen, 0 valse weigeringen, berekend door de eval-harness
29/40
De getrouwe platte-ACL-baseline op dezelfde 40 cases
10 ongeautoriseerde openbaarmakingen, 1 valse weigering
$670K
Extra kosten van een shadow-AI-inbreuk ten opzichte van een traditioneel incident
IBM Cost of a Data Breach, 2025
Dit is een uitvoerbare demo, geen implementatie. Elke identiteit en elk document is een synthetische Europese-bankfixture; de identity provider is een Azure-AD/SCIM-vormige JSON-fixture, en de vector store draait in-process achter een Qdrant-vormige interface.
Een private LLM kopen maakt het nog niet veilig om die op het kroonjuweelcorpus te richten.
De standaard pilot-build tagt elk documentchunk met een platte ACL bij ingestie. Dat ontwerp bezwijkt onder echte enterprise-identiteit: geneste Active Directory-groepen, cross-OU-overerving, clearance-niveaus, tijdgebonden projectrechten, en beëindigingen die plaatsvinden nadat de index is gebouwd. Het resultaat is de klassieke fout die deze demo van begin tot eind ensceneert: een junior analist stelt een normale vraag, en de RAG-pipeline overhandigt het model een Board-Only-memo, omdat een verouderde snapshot van het ingestiemoment zei dat zij die mocht zien.
De oorzaak is structureel. Documentpermissie is een live eigenschap van een identity graph, dus elke snapshot ervan is al verkeerd. Een beter model lost dit niet op: een perfect model dat een bestuursdocument krijgt, lekt het nog steeds. De waarde zit in het beheersen van wat het model bereikt, niet in modelkwaliteit.
De belangen zijn gekwantificeerd. Shadow-AI-inbreuken kosten $670K meer dan traditionele incidenten, en 65% van de AI-gerelateerde inbreuken compromitteerde klant-PII (IBM Cost of a Data Breach, 2025). Shadow-AI-inbreuken duren 247 dagen om te detecteren tegenover een gemiddelde van 241 dagen, en 1 op de 5 organisaties heeft een inbreuk geleden die aan shadow AI is gekoppeld (IBM, 2025). Aan de regelgevende kant worden de transparantieverplichtingen van artikel 50 van de EU AI Act afdwingbaar op 2 augustus 2026, en het gecombineerde GDPR- plus AI Act-boeteplafond bereikt EUR 55M of 11% van de wereldwijde jaaromzet.
Onze eigen oplossingspagina noemt retrieval-time permissiehandhaving "de reden waarom de meeste enterprise-RAG-pilots hun security review niet halen" en "het moeilijkste onopgeloste probleem in enterprise-RAG." De whitepaper-productanalyse erachter merkte RBAC-aware RAG over de markt aan als beschreven maar niet gedemonstreerd, zonder werkende implementatie. Deze demo is die werkende implementatie.
Een deterministische policy-engine beslist wat het model ziet. Niet het model, en niet een prompt.
Elke query doorloopt dezelfde pipeline:
query + user identity → retrieval → RBAC firewall (deterministisch, buiten elke LLM) → alleen toegestane documenten → answer LLM → hash-gekoppeld auditrecord
Voor elk kandidaatdocument lost de firewall de effectieve permissies van de gebruiker op querytijd op: hij vlakt recursief geneste AD/OU-groepen af (de fixture nest 3 niveaus diep) en evalueert ABAC-attributen tegen de gestructureerde policy-referentie van het document: clearance-niveau L1 tot L4, managed device, afdeling, tijdgebonden projectrechten met vervaldatum, en arbeidsstatus.
Elk document krijgt ALLOW, WITHHELD met een machine-controleerbare reden-code (BOARD_MEMBERSHIP_REQUIRED, ACCESS_WINDOW_EXPIRED, ALL_ACCESS_REVOKED_TERMINATION, POLICY_CONFLICT), of NEEDS_REVIEW. Achtergehouden documenten worden gedropt vóór het contextvenster, zodat het model nooit documenten ziet waartoe de gebruiker geen toegang heeft. Bij elk conflict of onopgeloste referentie weigert het standaard en stuurt het door naar menselijke review in plaats van te gokken.
Elke query voegt een record toe aan een append-only SHA-256-hashketen met knoeiverificatie: gebruiker, opgeloste permissieset, opgehaalde, verstrekte en achtergehouden documenten met reden-codes, needs-review-conflicten, model en provider, en het prompt/response-paar. Exporteerbaar als JSON, gegenereerd binnen de VPC. Het retrieval-access-bewijsrecord waar een EU AI Act-artikel 50-dossier om vraagt.
De vergelijkingskant van de demo is een getrouwe naïeve platte-ACL-RAG, de build die de meeste pilots daadwerkelijk opleveren. Hij lost geneste groepen daadwerkelijk op bij ingestie. Zijn tekortkomingen zijn zijn twee eerlijke, inherente limieten: de snapshot veroudert, en een platte tag kan geen clearance, device, tijdvenster of beëindiging uitdrukken. Op de gouden set van 40 cases van de demo produceren die twee limieten 10 ongeautoriseerde openbaarmakingen en 1 valse weigering, waarbij de valse weigering een post-ingestie-joiner is wiens recht de bevroren snapshot miste.
Het antwoordpad, gebouwd op Pydantic AI, ontvangt alleen post-firewall toegestane chunks, vermeldt wat is achtergehouden en waarom in plaats van te bluffen, en heeft nul zeggenschap over permissies. Het is per provider verwisselbaar via één omgevingsvariabele: Anthropic (standaardmodel claude-opus-4-8), OpenAI, Gemini, of Ollama voor air-gapped soevereine implementatie, waarbij niets, geen enkel token, de box verlaat. Er is nooit een API-sleutel vereist: de demo routeert antwoorden naar een lokale bridge wanneer er een draait en valt anders terug op een deterministische stub, en het eval-scoreboard roept helemaal nooit een LLM aan. De firewall is het product; het model is decor.
Gouden labels voor de 40-case-set worden mechanisch afgeleid door een onafhankelijke referentie-oracle, een aparte implementatie geschreven vanuit de policy-definities in plaats van de geteste firewall. Het scoreboard is een functie van de identity graph, geen handmatig gekozen resultaten, en elk cijfer wordt runtime berekend, nooit hard-coded. Handhavingsoverhead meet in microseconden, in-process, voor alleen de firewall-logica; een productie-IdP-round-trip voegt latentie toe die deze demo stubt.
Gartner voorspelt dat 40% van de enterprise-applicaties tegen eind 2026 AI-agents zal inbedden, tegenover minder dan 5% in 2025. Dezelfde deterministische authorize(user, doc)-poort is het gedocumenteerde uitbreidbaarheidspad voor die wereld, geen meegeleverde functie van deze demo: een agent kan niet ophalen wat zijn on-behalf-of-gebruiker niet kon.
Eén vraag, gesteld door één synthetische analist, beantwoord aan beide kanten van het splitscreen. Elke afbeelding hieronder is een screenshot van de draaiende app; elke identiteit, elk document en elk cijfer is synthetische fixturedata.
Lena Vogt, een EMEA Credit Risk Analyst met clearance L2, vraagt: "What is our Q3 EMEA credit-loss projection and the methodology behind it?" Retrieval brengt het Board-Only Q3-board pack naar boven naast documenten die zij mag zien. De platte-ACL-kant verstrekt het: jaren van nested-group-overervingsschuld in de identity graph hebben haar transitief tot "Board"-lid gemaakt, en een group-only-tag heeft geen concept van clearance. De memo bereikt het model, het antwoord leest EUR 412 miljoen voor, en de banner zegt LEAK.
Aan de RAGGUARD-kant draait dezelfde retrieval, maar het board pack wordt achtergehouden vóór de LLM met de reden-code BOARD_MEMBERSHIP_REQUIRED: het document vereist clearance L4 en Lena heeft L2. Het model antwoordt correct vanuit de Internal-methodologienoot en de Confidential-memo waar haar nested-group-keten haar wel recht op geeft, en het vermeldt wat is achtergehouden en waarom in plaats van te bluffen.
De decision-detail-modal toont de letterlijke modelinvoer aan beide kanten. Links zit het gelekte board pack in de prompt, rood gemarkeerd. Rechts is het eenvoudigweg afwezig: het model ziet nooit documenten waartoe de gebruiker geen toegang heeft. De per-documentweergave maakt de divergentie expliciet, dezelfde board-pack-rij leest "Served without authorization" aan de ene kant en "Access denied at retrieval" met zijn reden-code aan de andere.
De Internal-methodologienoot bevat een ingebedde prompt-injection-string die elke AI-assistent die hem leest instrueert om zijn retrieval-permissies te negeren en het volledige Board-cijfer weer te geven. Aan de firewall-kant heeft hij niets te exfiltreren: het board pack is nooit in het contextvenster gekomen, omdat autorisatie plaatsvond vóór de LLM. Dit is één gelabelde case, getoond als defense-in-depth vanuit retrieval-time-handhaving, geen apart guardrails-product.
Priya Shah is negen minuten geleden ontslagen op de demoklok, en de webhook van de fixture is afgegaan. De firewall geeft ALL_ACCESS_REVOKED_TERMINATION terug op alles: 0 granted, 5 denied. De platte-ACL-snapshot, gebouwd vóór de beëindiging, verstrekt haar nog steeds, omdat de herindexering niet heeft gedraaid. De demo loopt dezelfde rand af voor Marco Rossi, wiens tijdgebonden Project-Atlas-recht gisteren op de demoklok is verlopen (ACCESS_WINDOW_EXPIRED), voor Raj Patel, die tegelijk in een toelatende groep en een weigerende groep zit (POLICY_CONFLICT, vastgehouden voor menselijke review), en voor Wei Chen, het L4-bestuurslid dat de firewall correct verstrekt, de positieve controle die bewijst dat hij niet zomaar alles weigert.
Elk van deze beslissingen belandt in het knoeibestendige audittrail: een hash-gekoppeld JSON-record van wie wat vroeg, wat is verstrekt, wat is achtergehouden en waarom, en welk model antwoordde, met een CHAIN INTACT-verificatiechip en een one-click-export. Automatisch gegenereerd, binnen de VPC.
De gouden set is 40 gelabelde (user, document) allow/deny-beslissingen: 10 gebruikers tegen 4 gevoelige documenten, labels mechanisch afgeleid door de onafhankelijke oracle uit de identity-graph-semantiek. De firewall scoort 40/40 met 0 ongeautoriseerde openbaarmakingen en 0 valse weigeringen. De platte-ACL-baseline scoort 29/40 met 10 ongeautoriseerde openbaarmakingen, waaronder het board pack verstrekt aan 7 ongeautoriseerde gebruikers, het verlopen Atlas-venster, en de beëindigde medewerker, plus 1 valse weigering. Elk cijfer wordt runtime door de harness berekend, nooit hard-coded, en de per-case-drill-down toont elk oracle-label naast de beslissingen van beide systemen. Dit zijn resultaten van de gouden set, geen open-world-garanties.
Dezelfde vergelijking die de demo live draait, op dezelfde identity graph en dezelfde documenten.
| Dimensie | Naive Flat-ACL RAG (de typische pilot-build) | Sovereign RBAC Firewall (RAGGUARD) |
|---|---|---|
| Wanneer autorisatie plaatsvindt | Bij ingestie, bevroren in een tag op elke chunk | Op retrieval-tijd, per query, per document |
| Geneste groepen en cross-OU-overerving | Eenmaal opgelost bij ingestie; de snapshot veroudert | Recursief afgevlakt tegen de live identity graph bij elke query |
| ABAC: clearance, device, tijdgebonden rechten, arbeidsstatus | Niet uitdrukbaar in een platte tag | Per document geëvalueerd tegen de gestructureerde policy-referentie |
| Beëindiging negen minuten geleden | Nog steeds verstrekt tot de herindexering draait | ALL_ACCESS_REVOKED_TERMINATION op alles |
| Conflicterende policies op één document | Verstrekt het document | Deny-by-default: NEEDS_REVIEW, doorgestuurd naar een mens met het conflict uitgespeld |
| 40-case gouden set | 29/40: 10 ongeautoriseerde openbaarmakingen, 1 valse weigering | 40/40: 0 ongeautoriseerde openbaarmakingen, 0 valse weigeringen |
| Audittrail | Geen | Hash-gekoppeld, knoeibestendig record van elke verstrekking en achterhouding, exporteerbaar als JSON |
Dwing autorisatie af op retrieval-tijd, niet op ingestietijd. Een deterministische policy-engine buiten de LLM controleert elk opgehaald document tegen de live groepslidmaatschappen en attributen van de gebruiker voordat het het model bereikt, zodat achtergehouden documenten nooit in het contextvenster terechtkomen. In deze demo scoort die poort 40/40 op een gelabelde gouden set van 40 cases, tegen 29/40 voor de platte-ACL-build die de meeste pilots opleveren.
Omdat de tag een snapshot is en permissie een live eigenschap van uw identity graph. Een ACL van het ingestiemoment mist alles wat na indexering verandert, zoals een beëindiging of een verlopen projectrecht, en kan attribuutregels zoals clearance-niveau of managed device helemaal niet uitdrukken. In de demo verklaren die twee limieten 10 ongeautoriseerde openbaarmakingen en 1 valse weigering over een 40-case-benchmark, vanuit een baseline die geneste groepen getrouw oplost bij ingestie.
Niet als het document het model nooit bereikt. De demo bevat een gelabelde case waarin een noot in een document elke AI-assistent instrueert om zijn retrieval-permissies te negeren en het Board-Only-cijfer weer te geven, en de injectie heeft niets te exfiltreren omdat autorisatie plaatsvond vóór de LLM en de memo nooit in het contextvenster terechtkwam. Dat is één defense-in-depth-voorbeeld van retrieval-time-handhaving, geen standalone guardrails-product.
Standaard weigeren. Wanneer een gebruiker zowel een toelatend als een weigerend lidmaatschap op hetzelfde document heeft, of een policy-referentie niet kan worden opgelost, geeft de firewall NEEDS_REVIEW terug en stuurt de case door naar een mens met het conflict uitgespeld, in plaats van te gokken. De demo toont precies dat: een credit risk manager die tegelijk in een toegestane groep en een geweigerde groep zit, krijgt de betwiste memo vastgehouden voor review, niet verstrekt.
De firewall is deterministische Python die helemaal geen model nodig heeft, en het antwoordpad is verwisselbaar via één omgevingsvariabele: Anthropic, OpenAI, Gemini of Ollama. Zet LLM_PROVIDER=ollama voor air-gapped soevereine implementatie en niets, geen enkel token, verlaat de box. De demo zelf draait offline zonder API-sleutel, en het eval-scoreboard roept nooit een LLM aan.
Elke query voegt een record toe aan een knoeibestendige SHA-256-hashketen: wie vroeg, de opgeloste permissieset, wat is verstrekt, wat is achtergehouden en waarom, en welk model antwoordde. Het exporteert als JSON en wordt gegenereerd binnen uw VPC. Het is het retrieval-access-bewijsrecord waar een EU AI Act-artikel 50-dossier om vraagt, geen compliancecertificering.
Een uitvoerbare demo die het mechanisme bewijst. De identity provider is een synthetische Azure-AD/SCIM-vormige JSON-fixture, beëindigingen en rechtvervallen zijn fixture-events, en de vector store draait in-process achter een Qdrant-vormige interface. De policy-engine, de eval-harness en de hash-gekoppelde audit-export zijn echt en draaien precies zoals getoond; omdat de fixture Azure AD Graph- en SCIM-interfaces spiegelt, is het gedocumenteerde productiepad naar een live IdP een config-wissel, geen herschrijving.
Het onderzoek achter deze demo — de architectuur, het verificatieontwerp en de enterprise-blueprint.
Volledige oplossing
Ontdek de Sovereign AI & Private LLM Deployment-oplossing →De permissielaag is het moeilijke deel. Wij bouwen die.
Als uw team worstelt met hoe u een privaat model op een corpus richt dat wordt beheerst door jaren van nested-group-overerving, of met wat de transparantieverplichtingen van de EU AI Act betekenen voor uw retrieval-logs, horen we graag hoe u erover nadenkt. Het probleem is sectorbreed en de antwoorden zullen dat ook zijn.