Sto cercando uno schema valido per implementare controlli di sicurezza a livello di riga (tramite ad esempio un proxy, un servizio Web man-in-the-middle o stored procedure) idoneo all'uso in un ambiente client-> database. Controllo sia il client che il database. Alcuni requisiti:Sicurezza a livello di riga in uno scenario di database client
- Proibire agli utenti di visualizzare le righe nella query risultati che non hanno il permesso di vedere
- Permettere agli utenti di inserire e aggiornare i propri righe nella tabella, che dà loro il permesso di vederli
- (requisito morbido) che consente agli utenti di concedere ad altri l'accesso per leggere o scrivere le proprie righe
- Una soluzione open source oa basso costo che gira su Linux. A quanto ho capito, nessun database libero implementa la sicurezza a livello di riga in quanto tale. Oracle supporta questo, ma è troppo costoso $$$$. Postgres might be implementing this in 9.4, ma era originariamente mirato per 9.3 e scivolato e non vi è discussione sulla ML che potrebbe scivolare di nuovo. Sto vagamente pensando di usare Postgres solo perché sembrano il più lungo in questa funzione.
Alcuni (non particolarmente buone) idee che ho avuto:
- vista barriera di sicurezza di usare PostgreSQL e nego l'accesso degli utenti alla tabella sottostante. Sfortunatamente c'è no good way to insert a row into a security barrier view, quindi alcuni proxy/webservice privilegiati dovrebbero gestire le istruzioni di inserimento. Questo sembra difficile da ottenere.
- Utilizzare le viste normali e negare all'utente l'accesso alla tabella sottostante. Ciò consente
insert
, ma avrei bisogno di bloccare le autorizzazioni in modo piuttosto rigido (ad esempio nessuna funzione di creazione) e there seem to be a lot of gotchas (like divide by zero) that leak information. - Definire un sottoinsieme di SQL e creare un proxy che è l'unico punto di comunicazione con il database. Il proxy analizza la query SQL e la riscrive per far rispettare i requisiti di sicurezza. Questo sembra difficile da fare in generale, ma forse potrei farla franca con un sottogruppo SQL molto piccolo fino a quando postgres implementerà la sicurezza a livello di riga per davvero.
- Basta avere tabelle diverse per utenti diversi (o anche diversi DB). Tuttavia non sono sicuro di quanto bene questo ridimensiona a molti utenti. Inoltre, questo non sembra soddisfare il requisito morbido.
- Trovare qualche DB commerciale ma ragionevole costo che supporta in realtà questo
- Usa Veil, ma non sembra essere mantenuto, e ha la maggior parte delle limitazioni di altre soluzioni
Ho fatto un molto sul googling su questo argomento ma devo ancora vedere un post-mortem su come qualcuno ha risolto questo problema in uno scenario del mondo reale. C'è some documentation for MS SQL ma sembra essere discouraged in MySQL e le scritture sono praticamente inesistenti per postgres.
Questo mi sembra un problema molto comune, ma credo che molte persone stanno scrivendo applicazioni web e si accontentano di ammanettare i loro utenti a determinate query pre-controllati, ma ho davvero bisogno di dare ai miei utenti la massima flessibilità possibile per interrogare i dati con il mio cliente.
Sì, la sicurezza di riga per PostgreSQL è scivolata per 9.4. La patch corrente è abbastanza buona, ma devo ancora correggere almeno un bug relativo alle viste della barriera di sicurezza nella base di codice esistente, correggere i test di regressione e fare una pulizia generale per renderla committibile. È troppo tardi per 9.4. –
Sarebbe utile se si inserisse una buona parola per l'inclusione delle viste di barriera di sicurezza aggiornabili automaticamente in 9.4, comunque. La spinta dell'utente su quella caratteristica potrebbe essere la differenza tra l'inclusione e la scadenza mancante. –
http://www.postgresql.org/docs/devel/static/ddl-rowsecurity.html – kzh