Ci sono in realtà due domande qui: come autenticare un utente contro un server web e quale utente usare per connettersi al db as.
La vera domanda è, se la sicurezza del database è all'altezza del DBA o del programmatore web?
I server di database sono di lunga durata e sono spesso condivisi da più applicazioni.
Idealmente, autenticherai i tuoi utenti webapp (LAN) contro un server LDAP (aka ActiveDirectory), tramite Kerberos + SPNEGO. Ciò ti offre un'autenticazione centralizzata e single sign-on su molte app.
Potresti anche autenticare gli utenti webapp direttamente dagli utenti db, ad esempio qui . Se è lì che sono presenti tutte le informazioni authn dell'utente e non si utilizza LDAP / Kerberos, potrebbe anche usarlo.
La prossima domanda è quale utente db usare quando ci si connette dal server web:
- Connetti come utente esperto e aggiungi informazioni "reali" userid alle tue istruzioni SQL (utilizzando i parametri, ovviamente!)
- Connetti come vero utente db (elimina il pool di connessioni)
- Connetti come utente limitato e impersonare l'utente reale utilizzando
set role
ONE è il più comune, non perché sia una buona idea, ma perché le persone volevano utilizzare il pool di connessioni in passato e non capivano la rappresentazione. Questo calcia il principio del privilegio minimo direttamente nel cavallo.
Ci sono delle vulnerabilità incredibilmente comuni, a fine carriera, rese più probabili dall'opzione 1: SQL Injection e Riferimenti agli oggetti non sicuri :
Il server Web si connette a db come powerUser
, Malice accede al sito Web come malice
e trova un'iniezione SQL e rilascia la tabella payments
, poiché powerUser
ha quell'autorità.
Gli sviluppatori web aggiungono l'ID utente allo sql per l'URL /bank-accounts
, ma sono stupidi e dimenticano di aggiungere l'ID utente per gli URL di singoli conti bancari (come /bank-accounts/999
). Malice accede come malice
e visualizza bobs
saldo bancario.
Questi rischi possono essere ridotti al minimo utilizzando la rappresentazione e la sicurezza delle righe del database (che in sostanza richiede la rappresentazione). PG 9.5 supporta la sicurezza delle righe. Puoi imitarlo nelle versioni precedenti con security_barrier check option
visualizzazioni e trigger.
Rende anche più semplice il controllo dei dati, dato che hai il vero nome utente nel tuo db come current_user
Direi che un database come Postgres ha una sicurezza migliore rispetto alla maggior parte dei framework di sicurezza web, così come Row Security, Column Security e ha un buon sistema di ruoli gerarchici.
Ho visto framework di sicurezza web che selezionano tutte le righe per una determinata query, quindi eliminano tutto ciò che non appartiene all'utente X. Ciò stravolge completamente l'impaginazione ed è terribile per le prestazioni. Non ne ho mai visto uno che faccia correttamente la sicurezza Column / Field.