Il livello dei permessi che manca alla maggior parte dei dispiegamenti RAG enterprise
Un analista junior pone una domanda di routine e un ACL obsoleto, catturato al momento dell'ingestione, consegna al modello un memo Board-Only. Il Sovereign RBAC Firewall autorizza ogni documento recuperato al momento della query, rispetto all'insieme live di gruppi nidificati e attributi dell'utente, e scarta i documenti trattenuti prima che il modello veda un token. Codice deterministico, esterno a qualsiasi LLM. Gli agenti consigliano, il codice decide.
40/40
Decisioni corrette sul set golden di autorizzazione
0 divulgazioni non autorizzate, 0 falsi dinieghi, calcolati dall'harness di valutazione
29/40
La baseline fedele ad ACL piatto sugli stessi 40 casi
10 divulgazioni non autorizzate, 1 falso diniego
$670K
Costo aggiuntivo di una violazione Shadow AI rispetto a un incidente tradizionale
IBM Cost of a Data Breach, 2025
Questa è una demo eseguibile, non un dispiegamento. Ogni identità e ogni documento è un fixture sintetico di una banca europea; l'identity provider è un fixture JSON modellato su Azure AD/SCIM, e il vector store gira in-process dietro un'interfaccia modellata su Qdrant.
Comprare un LLM privato non lo rende sicuro da puntare sul corpus dei gioielli della corona.
La build standard del pilot etichetta ogni chunk di documento con un ACL piatto al momento dell'ingestione. Quel disegno crolla di fronte all'identità enterprise reale: gruppi Active Directory nidificati, ereditarietà cross-OU, livelli di clearance, concessioni di progetto a tempo, e cessazioni che avvengono dopo che l'indice è stato costruito. Il risultato è il fallimento classico che questa demo mette in scena da un capo all'altro: un'analista junior pone una domanda normale e la pipeline RAG consegna al modello un memo Board-Only, perché uno snapshot obsoleto al momento dell'ingestione diceva che poteva vederlo.
La causa radice è strutturale. Il permesso sul documento è una proprietà live di un grafo di identità, quindi qualsiasi snapshot di essa è già sbagliato. Un modello migliore non risolve questo: un modello perfetto a cui viene consegnato un documento del consiglio lo fa comunque trapelare. Il valore sta nel governare ciò che raggiunge il modello, non nella qualità del modello.
La posta in gioco è misurata. Le violazioni Shadow AI costano $670K in più rispetto agli incidenti tradizionali, e il 65% delle violazioni legate all'AI ha compromesso PII dei clienti (IBM Cost of a Data Breach, 2025). Le violazioni Shadow AI richiedono 247 giorni per essere rilevate rispetto a una media di 241 giorni, e 1 organizzazione su 5 ha subito una violazione legata allo Shadow AI (IBM, 2025). Sul versante regolatorio, gli obblighi di trasparenza dell'Articolo 50 dell'EU AI Act diventano applicabili il 2 agosto 2026, e il tetto combinato delle sanzioni GDPR più AI Act arriva a EUR 55M o all'11% del fatturato annuo globale.
La nostra stessa pagina della soluzione definisce l'enforcement dei permessi al momento del retrieval «il motivo per cui la maggior parte dei pilot RAG enterprise fallisce la security review» e «il problema irrisolto più difficile nel RAG enterprise». L'analisi di prodotto del whitepaper alle sue spalle ha segnalato il RAG RBAC-aware sul mercato come descritto ma non dimostrato, senza un'implementazione funzionante. Questa demo è quella implementazione funzionante.
Un motore di policy deterministico decide cosa vede il modello. Non il modello, e non un prompt.
Ogni query esegue la stessa pipeline:
query + identità utente → retrieval → firewall RBAC (deterministico, esterno a qualsiasi LLM) → solo documenti consentiti → LLM di risposta → record di audit concatenato con hash
Per ogni documento candidato, il firewall risolve i permessi effettivi dell'utente al momento della query: appiattisce ricorsivamente i gruppi AD/OU nidificati (il fixture nidifica 3 livelli in profondità) e valuta gli attributi ABAC rispetto al riferimento di policy strutturato del documento: livello di clearance da L1 a L4, dispositivo gestito, dipartimento, concessioni di progetto a tempo con scadenza, e stato occupazionale.
Ogni documento riceve ALLOW, WITHHELD con un reason code verificabile da macchina (BOARD_MEMBERSHIP_REQUIRED, ACCESS_WINDOW_EXPIRED, ALL_ACCESS_REVOKED_TERMINATION, POLICY_CONFLICT), oppure NEEDS_REVIEW. I documenti trattenuti vengono scartati prima della finestra di contesto, così il modello non vede mai documenti a cui l'utente non può accedere. Su qualsiasi conflitto o riferimento irrisolto, nega per default e instrada alla revisione umana invece di indovinare.
Ogni query appende un record a una catena di hash SHA-256 append-only con verifica di manomissione: utente, insieme di permessi risolto, documenti recuperati, serviti e trattenuti con reason code, conflitti needs-review, modello e provider, e la coppia prompt/risposta. Esportabile come JSON, generato all'interno del VPC. Il record di evidenza dell'accesso in retrieval che un fascicolo dell'Articolo 50 dell'EU AI Act richiede.
Il lato di confronto della demo è un RAG fedele e naive ad ACL piatto, la build che la maggior parte dei pilot spedisce davvero. Risolve genuinamente i gruppi nidificati al momento dell'ingestione. I suoi fallimenti sono i suoi due limiti onesti e inerenti: lo snapshot diventa obsoleto, e un tag piatto non può esprimere clearance, dispositivo, finestra temporale o cessazione. Sul set golden di 40 casi della demo, quei due limiti producono 10 divulgazioni non autorizzate e 1 falso diniego, il falso diniego essendo un neoassunto post-ingestione la cui titolarità lo snapshot congelato ha mancato.
Il percorso di risposta, costruito su Pydantic AI, riceve solo chunk consentiti post-firewall, dichiara cosa è stato trattenuto e perché invece di bluffare, e ha zero autorità sui permessi. È intercambiabile di provider con una sola variabile d'ambiente: Anthropic (modello predefinito claude-opus-4-8), OpenAI, Gemini, o Ollama per un dispiegamento sovrano air-gapped, dove nulla, neanche un token, lascia il box. Nessuna chiave API è mai richiesta: la demo instrada le risposte a un bridge locale quando uno è in esecuzione e altrimenti ricade su uno stub deterministico, e lo scoreboard di valutazione non chiama mai un LLM. Il firewall è il prodotto; il modello è scenografia.
Le etichette golden per il set di 40 casi sono derivate meccanicamente da un oracolo di riferimento indipendente, un'implementazione separata scritta dalle definizioni di policy e non dal firewall sotto test. Lo scoreboard è una funzione del grafo di identità, non risultati scelti a mano, e ogni cifra è calcolata a runtime, mai hard-coded. L'overhead di enforcement si misura in microsecondi, in-process, per la sola logica del firewall; un round-trip IdP di produzione aggiunge latenza che questa demo sostituisce con uno stub.
Gartner proietta che il 40% delle applicazioni enterprise incorporerà agenti AI entro fine 2026, rispetto a meno del 5% nel 2025. Lo stesso cancello deterministico authorize(user, doc) è il percorso di estensibilità documentato per quel mondo, non una feature spedita di questa demo: un agente non può recuperare ciò che l'utente per conto del quale opera non potrebbe.
Una domanda, posta da un'analista sintetica, risposta su entrambi i lati dello split screen. Ogni immagine sotto è uno screenshot dell'app in esecuzione; ogni identità, documento e cifra è dato di fixture sintetico.
Lena Vogt, analista EMEA Credit Risk con clearance L2, chiede: «Qual è la nostra proiezione di credit-loss EMEA del Q3 e la metodologia dietro di essa?» Il retrieval fa emergere il board pack Q3 Board-Only insieme a documenti che lei può vedere. Il lato ACL piatto lo serve: anni di debito di ereditarietà di gruppi nidificati nel grafo di identità l'hanno resa transitivamente membro del «Board», e un tag solo-gruppo non ha alcun concetto di clearance. Il memo raggiunge il modello, la risposta legge EUR 412 million, e il banner dice LEAK.
Sul lato RAGGUARD, lo stesso retrieval viene eseguito, ma il board pack è trattenuto prima dell'LLM con il reason code BOARD_MEMBERSHIP_REQUIRED: il documento richiede clearance L4 e Lena detiene L2. Il modello risponde correttamente dalla nota metodologica Internal e dal memo Confidential a cui la sua catena di gruppi nidificati le dà diritto, e dichiara cosa è stato trattenuto e perché invece di bluffare.
Il modal dei dettagli di decisione mostra l'input verbatim del modello su entrambi i lati. A sinistra, il board pack trapelato sta dentro il prompt, contrassegnato in rosso. A destra, è semplicemente assente: il modello non vede mai documenti a cui l'utente non può accedere. La vista per documento rende esplicita la divergenza, la stessa riga del board pack che recita «Served without authorization» da un lato e «Access denied at retrieval» con il suo reason code dall'altro.
La nota metodologica Internal porta una stringa di prompt-injection incorporata che istruisce qualsiasi assistente AI che la legga a ignorare i propri permessi di retrieval e a emettere la cifra Board completa. Sul lato firewall non ha nulla da esfiltrare: il board pack non è mai entrato nella finestra di contesto, perché l'autorizzazione è avvenuta prima dell'LLM. Questo è un caso etichettato, mostrato come difesa in profondità dall'enforcement al momento del retrieval, non un prodotto di guardrail separato.
Priya Shah è stata cessata nove minuti fa sull'orologio della demo, e il webhook del fixture è scattato. Il firewall restituisce ALL_ACCESS_REVOKED_TERMINATION su tutto: 0 concessi, 5 negati. Lo snapshot ACL piatto, costruito prima della cessazione, la serve ancora, perché il re-index non è stato eseguito. La demo percorre lo stesso bordo per Marco Rossi, la cui concessione a tempo Project-Atlas è scaduta ieri sull'orologio della demo (ACCESS_WINDOW_EXPIRED), per Raj Patel, che siede in un gruppo che consente e in un gruppo che nega contemporaneamente (POLICY_CONFLICT, tenuto per revisione umana), e per Wei Chen, il membro del board L4 che il firewall serve correttamente, il controllo positivo che prova che non sta semplicemente negando tutto.
Ognuna di queste decisioni atterra nella traccia di audit a prova di manomissione: un record JSON concatenato con hash di chi ha chiesto cosa, cosa è stato servito, cosa è stato trattenuto e perché, e quale modello ha risposto, con un chip di verifica CHAIN INTACT e un export con un clic. Generato automaticamente, all'interno del VPC.
Il set golden è 40 decisioni allow/deny etichettate (utente, documento): 10 utenti contro 4 documenti sensibili, etichette derivate meccanicamente dall'oracolo indipendente dalla semantica del grafo di identità. Il firewall ottiene 40/40 con 0 divulgazioni non autorizzate e 0 falsi dinieghi. La baseline ACL piatto ottiene 29/40 con 10 divulgazioni non autorizzate, incluso il board pack servito a 7 utenti non autorizzati, la finestra Atlas scaduta e il dipendente cessato, più 1 falso diniego. Ogni cifra è calcolata dall'harness a runtime, mai hard-coded, e il drill-down per caso mostra ciascuna etichetta dell'oracolo accanto alle decisioni di entrambi i sistemi. Questi sono risultati del set golden, non garanzie a mondo aperto.
Lo stesso confronto che la demo esegue dal vivo, sullo stesso grafo di identità e sugli stessi documenti.
| Dimensione | Naive Flat-ACL RAG (la build tipica del pilot) | Sovereign RBAC Firewall (RAGGUARD) |
|---|---|---|
| Quando avviene l'autorizzazione | All'ingestione, congelata in un tag su ciascun chunk | Al momento del retrieval, per query, per documento |
| Gruppi nidificati ed ereditarietà cross-OU | Risolti una volta all'ingestione; lo snapshot diventa obsoleto | Appiattiti ricorsivamente rispetto al grafo di identità live a ogni query |
| ABAC: clearance, dispositivo, concessioni a tempo, stato occupazionale | Inesprimibile in un tag piatto | Valutato per documento rispetto al riferimento di policy strutturato |
| Cessazione nove minuti fa | Ancora servito finché non gira il re-index | ALL_ACCESS_REVOKED_TERMINATION su tutto |
| Policy in conflitto su un documento | Serve il documento | Deny-by-default: NEEDS_REVIEW, instradato a un umano con il conflitto esplicitato |
| Set golden a 40 casi | 29/40: 10 divulgazioni non autorizzate, 1 falso diniego | 40/40: 0 divulgazioni non autorizzate, 0 falsi dinieghi |
| Traccia di audit | Nessuna | Record concatenato con hash, a prova di manomissione, di ogni servizio e ogni trattenimento, esportabile come JSON |
Applica l'autorizzazione al momento del retrieval, non al momento dell'ingestione. Un motore di policy deterministico esterno all'LLM controlla ogni documento recuperato rispetto alle membership di gruppo live e agli attributi dell'utente prima che raggiunga il modello, così i documenti trattenuti non entrano mai nella finestra di contesto. In questa demo quel cancello ottiene 40/40 su un set golden etichettato di 40 casi, contro 29/40 per la build ACL piatto che la maggior parte dei pilot spedisce.
Perché il tag è uno snapshot e il permesso è una proprietà live del tuo grafo di identità. Un ACL al momento dell'ingestione manca tutto ciò che cambia dopo l'indicizzazione, come una cessazione o una concessione di progetto scaduta, e non può esprimere affatto regole di attributo come il livello di clearance o il dispositivo gestito. Nella demo quei due limiti spiegano 10 divulgazioni non autorizzate e 1 falso diniego su un benchmark di 40 casi, da una baseline che risolve fedelmente i gruppi nidificati all'ingestione.
Non se il documento non raggiunge mai il modello. La demo include un caso etichettato in cui una nota incorporata in un documento istruisce qualsiasi assistente AI a ignorare i propri permessi di retrieval e a emettere la cifra Board-Only, e l'iniezione non ha nulla da esfiltrare perché l'autorizzazione è avvenuta prima dell'LLM e il memo non è mai entrato nella finestra di contesto. Quello è un esempio di difesa in profondità dell'enforcement al momento del retrieval, non un prodotto di guardrail autonomo.
Nega per default. Quando un utente detiene sia una membership che consente sia una che nega sullo stesso documento, o un riferimento di policy non può essere risolto, il firewall restituisce NEEDS_REVIEW e instrada il caso a un umano con il conflitto esplicitato, invece di indovinare. La demo mostra esattamente questo: un credit risk manager che è in un gruppo consentito e in un gruppo negato contemporaneamente ha il memo contestato tenuto per revisione, non servito.
Il firewall è Python deterministico che non ha bisogno di alcun modello, e il percorso di risposta è intercambiabile con una sola variabile d'ambiente: Anthropic, OpenAI, Gemini o Ollama. Imposta LLM_PROVIDER=ollama per un dispiegamento sovrano air-gapped e nulla, neanche un token, lascia il box. La demo stessa gira offline senza chiave API, e lo scoreboard di valutazione non chiama mai un LLM.
Ogni query appende un record a una catena di hash SHA-256 a prova di manomissione: chi ha chiesto, l'insieme di permessi risolto, cosa è stato servito, cosa è stato trattenuto e perché, e quale modello ha risposto. Si esporta come JSON ed è generato all'interno del tuo VPC. È il record di evidenza dell'accesso in retrieval che un fascicolo dell'Articolo 50 dell'EU AI Act richiede, non una certificazione di conformità.
Una demo eseguibile che prova il meccanismo. L'identity provider è un fixture JSON sintetico modellato su Azure AD/SCIM, cessazioni e scadenze delle concessioni sono eventi di fixture, e il vector store gira in-process dietro un'interfaccia modellata su Qdrant. Il motore di policy, l'harness di valutazione e l'export di audit concatenato con hash sono reali e girano esattamente come mostrato; poiché il fixture rispecchia le interfacce Azure AD Graph e SCIM, il percorso di produzione documentato verso un IdP live è uno swap di config, non una riscrittura.
La ricerca dietro questa demo — l'architettura, il disegno di verifica e il blueprint enterprise.
Soluzione completa
Esplora la soluzione IA sovrana & dispiegamento di LLM privati →Il livello dei permessi è la parte difficile. Lo costruiamo noi.
Se il tuo team sta lottando con come puntare un modello privato su un corpus governato da anni di ereditarietà di gruppi nidificati, o con cosa gli obblighi di trasparenza dell'EU AI Act significano per i tuoi log di retrieval, ci farebbe davvero piacere sentire come ci stai pensando. Il problema è di tutta l'industria e lo saranno anche le risposte.