I permessi valgono anche per l'IA
Un assistente utile deve leggere tanto: se legge solo i documenti di una cartella, risponde male. Ma leggere tanto non puo voler dire leggere tutto. La regola di borc e una sola: il modello vede solo quello che l'utente potrebbe gia aprire da solo, e i permessi si applicano nella ricerca, prima che il testo arrivi al modello.
Due livelli che si intersecano
Nelle cartelle di rete Windows servono entrambi:
| Livello | Dove sta | Vale per |
|---|---|---|
| Permessi della condivisione | Sulla condivisione | Tutti i file di quella fonte |
| ACL NTFS | Su ogni file e cartella | Quel file |
Un utente vede un file solo se entrambi glielo permettono. Contano solo i diritti di lettura dei dati (FILE_READ_DATA, GENERIC_READ, GENERIC_ALL): l'attraversamento delle cartelle o la lettura degli attributi non bastano.
Il divieto vince sempre, anche dove Windows applicherebbe l'ordine delle voci: e una scelta prudente, dichiarata al cliente. E nel dubbio il file e invisibile: qualunque errore di lettura dei permessi lo esclude dall'indice, invece di includerlo per sbaglio.
I casi che quasi tutti sbagliano
- Everyone e Authenticated Users valgono per tutti gli utenti di dominio. Un account locale di borc, o un utente Google senza collegamento all'AD, non e mai stato autenticato dal file server: vede solo cio che gli e concesso in modo esplicito.
- Gruppi locali del file server (BUILTIN\Users, gruppi creati sul server) non stanno in tokenGroups: i membri si leggono dal server via RPC durante la scansione e si espandono nei gruppi di dominio che li contengono.
- NAS con utenti propri (per esempio un Synology senza dominio): i gruppi si mappano a mano su gruppi AD in installazione. Senza mappatura i file restano invisibili.
- CREATOR OWNER vale solo per l'ereditarieta: sul file e gia sostituito dall'utente reale.
Il filtro sta nella query
Il filtro non e un'istruzione al modello, e una condizione nella ricerca, uguale per la parte vettoriale e per quella testuale:
WHERE share_allow && $principali AND NOT (share_deny && $principali)
AND acl_allow && $principali AND NOT (acl_deny && $principali)
Con pgvector 0.8 la ricerca vettoriale usa hnsw.iterative_scan, cosi il filtro sui permessi non svuota i risultati. Quando i permessi di un file cambiano si aggiornano le liste senza ricalcolare i vettori, e all'apertura di una fonte citata il permesso si ricontrolla in quel momento.
Chi amministra puo vedere l'elenco dei documenti senza utenti noti: i file il cui permesso nomina SID che non risolvono a nessun utente. E il modo onesto di dire "questi li ho esclusi per prudenza".