Demesne
Il motore di autorizzazione su cui gira Fóir. Le regole di accesso si scrivono una sola volta, in un unico file di specifica, e Demesne le compila in row-level security di Postgres, così il database le applica a ogni query. Lo abbiamo costruito per Fóir e pubblicato con licenza Apache 2.0.
Cosa fa
Una specifica Demesne descrive quattro cose: la forma del tuo tenancy, i tipi di utente e di credenziale che agiscono, le tabelle su cui agiscono e le relazioni che le collegano, come proprietà, ruoli, condivisione e appartenenza a gruppi.
Da quel file il compilatore genera le policy di row-level security e le funzioni del database che quelle policy richiamano. Genera anche una mappa dei permessi per Go e TypeScript, per le domande che non riguardano le righe («questo utente può pubblicare?»), e i claim che una sessione deve portare. Cambi la specifica e rigeneri, e database e codice applicativo si muovono insieme.
Perché le regole vivono nel database
L'autorizzazione di solito sta nel codice applicativo: un servizio che richiami, oppure controlli sparsi tra i gestori delle richieste. In entrambi i casi protegge solo i percorsi che si ricordano di chiedere. Un job in background, un nuovo endpoint o una query digitata in una console del database la aggirano.
Demesne mette la decisione sui dati. La stessa policy filtra ogni query, qualunque codice l'abbia inviata, quindi un percorso che dimentica di controllare riceve solo le righe che il suo chiamante poteva vedere.
Perché abbiamo scritto un compilatore
La row-level security è il posto giusto per una regola ed è scomoda da scrivere a mano. Un prodotto multi-tenant richiede proprietà, ruoli, gruppi annidati e condivisione, ripetuti su ogni tabella, e questi schemi è facile sbagliarli in modo sottile.
I motori che condividono il modello di Demesne, Zanzibar di Google e i progetti open source che lo seguono, girano come servizio separato. La tua applicazione deve chiamare quel servizio per ogni decisione e mantenere la propria copia delle relazioni allineata ai tuoi dati. Volevamo il modello senza il servizio, quindi le regole di Demesne leggono le tue tabelle esistenti nella stessa transazione della query.
Come viene verificato il suo output
La build di Demesne confronta ogni file generato, byte per byte, con una copia committata. Ogni controllo dei permessi lato applicazione porta con sé, alla lettera, la condizione della policy corrispondente, quindi il codice non può divergere dal database senza far fallire la build. Eseguita su un vero Postgres, la suite di test installa le funzioni generate e conferma, caso per caso, che l'SQL concordi con le versioni in Go e TypeScript.
Per un database già in produzione, demesne diff segnala qualsiasi differenza tra la specifica e le policy attive.
Perché è open source
Il componente che decide chi può leggere i tuoi dati è quello che dovresti poter ispezionare. Qualsiasi piattaforma può dire che i suoi tenant sono isolati. Con Demesne puoi leggere il compilatore che scrive le nostre policy, i test che deve superare e l'SQL che produce, e puoi eseguire tutto da solo.
Niente in Demesne è specifico di Fóir. Funziona con qualsiasi database Postgres e legge la sessione emessa dal tuo provider di login, e la guida del repository spiega come adottarlo su uno schema esistente. Può usarlo un team che della nostra piattaforma non sa che farsene, ed è il miglior controllo che conosciamo sulla tenuta del modello.
Cosa significa su Fóir
Il modello di accesso di Fóir è una sola specifica Demesne, che al momento in cui scriviamo governa circa cento tabelle. Un test elenca ogni tabella del nostro schema e fallisce su quelle aggiunte senza una decisione registrata su come sono protette.
Le regole che imposti per il tuo progetto, come chi possiede un record e quali ruoli possono leggere un modello, sono dati che quelle policy leggono, quindi hanno effetto anche dentro il database. Applicata nel database descrive come le policy vengono generate, forzate e testate.
Resta con te
Un export Postgres del tuo progetto include policy di row-level security che riproducono quali righe poteva leggere ciascuno dei tuoi utenti, pronte da applicare al database che ora possiedi. Se vuoi l'intero modello sulla tua infrastruttura, il motore è lì, utilizzabile con una licenza che lo consente.
Dove è lo strumento sbagliato
Demesne funziona solo con Postgres. È una libreria e uno strumento da riga di comando, senza alcun servizio ospitato da chiamare. Ogni regola deve essere esprimibile come condizione SQL, e le domande che vanno nell'altro senso («chi può vedere questo record?») ricevono risposte prudenti. Il repository contiene un confronto con Zanzibar, Ory Keto, OpenFGA, Cerbos e Oso che indica dove ciascuno di loro è la scelta migliore.
Leggilo di persona
Il linguaggio della specifica, l'SQL generato e la suite di test sono tutti nel repository.