De permissielaag die de meeste enterprise-RAG-implementaties ontberen

Uw private LLM lekt niet. Uw retrieval-laag wel.

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.

De pilot slaagt voor de demo. Daarna zakt hij voor de security review.

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.

Hoe de Sovereign RBAC Firewall werkt

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

1. Live permissieresolutie

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.

2. Een deterministisch oordeel

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.

3. Het ontvangstbewijs

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 baseline die hij verslaat is geen stroman

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.

De LLM is verwisselbaar decor

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.

Het scoreboard is onafhankelijk

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.

Eén knelpunt, agent-klaar

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.

Het lek van EUR 412 miljoen, van begin tot eind uitgewerkt

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.

De vraag die lekt

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.

Het splitscreen-lek: de Naive Flat-ACL-kant leest de Board-Only-projectie van EUR 412 miljoen voor aan L2-analist Lena Vogt met een rode LEAK-banner en een waarschuwing dat 1 ongeautoriseerd document is verstrekt, terwijl de RAGGUARD-kant 5 retrieved, 2 granted, 3 denied toont.
Het lekmoment: een Board-Only-memo voorgelezen aan een L2-analist. Het cijfer is synthetisch; de faalmodus niet.

Dezelfde query, achter de firewall

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 RAGGUARD-kant van de demo na Lena's query: 5 retrieved, 2 granted, 3 denied, met een withheld-notitie die de geweigerde documenten en hun reden-codes opsomt, waaronder BOARD_MEMBERSHIP_REQUIRED op het board pack.
Dezelfde vraag, dezelfde retrieval: 5 retrieved, 2 granted, 3 denied, elke weigering met een reden-code.

Wat het model daadwerkelijk zag

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 letterlijke modelinvoer aan beide kanten: het Board-Only-document rood gemarkeerd in de platte-ACL-prompt, en afwezig in de RAGGUARD-prompt, die is gelabeld als gegrond in alleen toegestane documenten.
De contextvensters, letterlijk: het gelekte document aanwezig links, afwezig rechts.
De per-document-beslissingsweergave: de board-pack-rij leest Served without authorization aan de platte-ACL-kant en Access denied at retrieval met de reden-code BOARD_MEMBERSHIP_REQUIRED aan de RAGGUARD-kant.
Hetzelfde document, twee oordelen: served without authorization versus denied at retrieval, met de reden-code.

De injectie die niets te stelen had

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.

De ingebedde prompt-injection-regel in de Internal-methodologienoot, gemarkeerd in de decision-detail-weergave, die elke AI-assistent instrueert retrieval-permissies te negeren en het Board-credit-loss-cijfer weer te geven.
De injectie, in het document dat het model mocht lezen. Het document dat hij viseert, bereikte het model nooit.

De identity graph beweegt. De snapshot niet.

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.

De case van de beëindigde medewerker: Priya Shah met een TERMINATED-badge in de identiteitsstrook, de RAGGUARD-kant toont 0 granted en 5 denied met de reden-code ALL_ACCESS_REVOKED_TERMINATION, terwijl de platte-ACL-kant nog steeds verstrekt vanuit zijn verouderde snapshot.
Negen minuten geleden ontslagen: de firewall trekt alles in; de ingestie-snapshot heeft het niet opgemerkt.

Het ontvangstbewijs, op het scherm

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.

Het knoeibestendige audittrail: een CHAIN INTACT-chip, het hash-gekoppelde JSON-record van verstrekte en achtergehouden documenten met reden-codes, en de knop Export Audit Record.
Het hash-gekoppelde auditrecord: het artefact waar een artikel 50-dossier om vraagt, geen certificering.

Het scoreboard, met zijn exacte scope

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.

Het 40-case-benchmarkscoreboard: Naive Flat-ACL RAG op 29/40 met 10 ongeautoriseerde openbaarmakingen en 1 valse weigering, RAGGUARD op 40/40 met 0 ongeautoriseerde openbaarmakingen en 0 valse weigeringen.
Het scoreboard, live berekend door de eval-harness tegen de labels van de oracle.
Een per-case-benchmark-drill-down: de oracle labelt de case deny, de platte-ACL-baseline verstrekte het document, en RAGGUARD hield het achter, met de policy-chips die de beslissing verklaren.
Per-case-drill-down: oracle-label, platte-ACL-beslissing, firewall-beslissing, en de policy die het besliste.

Naive Flat-ACL RAG versus de Sovereign RBAC Firewall

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

Wat deze demo niet doet

  • ✓ Hij verbindt niet met een live Active Directory, Okta, SharePoint of Confluence. De identity provider is een synthetische Azure-AD/SCIM-vormige JSON-fixture, beëindigingen en verlopen zijn fixture-events, en de vector store is in-process achter een Qdrant-vormige interface. De live IdP-connector is de gedocumenteerde productievervanging, niet wat vandaag draait.
  • ✓ Er is geen echte bank, geen klanten en geen live accounts bij betrokken. Lena Vogt, Marco Rossi, Priya Shah, Raj Patel, Wei Chen, elk document, en het cijfer van EUR 412 miljoen zijn synthetisch.
  • ✓ Hij claimt geen open-world-garanties. 40/40 met 0 ongeautoriseerde openbaarmakingen is het berekende resultaat op een vaste gelabelde gouden set van 40 cases, geen belofte dat er in productie nooit iets lekt.
  • ✓ Hij meet geen productielatentie. De microseconde-schaal handhavingsoverhead is alleen firewall-logica, in-process; een live IdP-round-trip, die deze demo stubt, voegt meer toe.
  • ✓ Hij levert geen guardrails-suite, DLP of een multi-agent-platform. Het is één functie overtuigend uitgevoerd: de retrieval-time permissiefirewall, met de injectie-case als één gelabeld defense-in-depth-voorbeeld. Het antwoordpad is Pydantic AI, en de bewust non-agentic deterministische poort is het ontwerp; agentic governance is het gedocumenteerde uitbreidbaarheidspad.
  • ✓ Hij certificeert geen compliance. De audit-export is het bewijsrecord waar een EU AI Act-artikel 50-dossier om vraagt, geen certificering, en er bestaan geen klanten, implementaties of casestudies voor deze demo.

Vragen die kopers daadwerkelijk stellen

Hoe voorkomen we dat onze interne AI-chatbot medewerkers documenten toont die ze niet mogen zien?

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.

We taggen documenten al met permissies wanneer we ze indexeren. Waarom is dat niet genoeg?

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.

Kan een prompt injection het model ertoe verleiden een beperkt document te lekken?

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.

Wat gebeurt er wanneer toegangspolicies conflicteren of het systeem het niet zeker weet?

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.

Verlaat er data onze VPC? Kan dit volledig air-gapped draaien?

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.

Wat tonen we een auditor over wie wat heeft benaderd via het AI-systeem?

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.

Is dit een live Active Directory-integratie of een demo?

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.

Technisch onderzoek

Het onderzoek achter deze demo — de architectuur, het verificatieontwerp en de enterprise-blueprint.

Private LLM-implementatie evalueren bij een gereguleerde onderneming?

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.

Beoordeling van de permissielaag

  • ✓ Breng in kaart waar uw RAG-pipeline vandaag autoriseert: ingestietijd of retrieval-tijd
  • ✓ Modelleer uw nested-group- en cross-OU-overerving als een live policy-graph
  • ✓ Definieer de ABAC-regels die een platte tag niet kan uitdrukken: clearance, device, tijdgebonden rechten
  • ✓ Specificeer het retrieval-access-record waar uw artikel 50-dossier om vraagt

Bouw de retrieval-time-firewall

  • ✓ Een deterministische authorize(user, doc)-poort buiten elke LLM
  • ✓ Live IdP-resolutie achter Azure AD Graph- en SCIM-vormige interfaces
  • ✓ Deny-by-default conflictrouting naar menselijke review
  • ✓ Een hash-gekoppeld, exporteerbaar audittrail gegenereerd in uw VPC
Social

Ook gepubliceerd op