L'applicazione web è connessa a un database tramite un server delle applicazioni più sicuro?

4

Ho sentito dai miei colleghi e da altre persone sul Web che suggeriscono che è più sicuro eseguire questa configurazione:

Web server -> Application server -> Database , di questo:

Web server -> Database

La ragione per cui se un avversario prende il controllo di un server web, allora c'è un altro livello da superare se hai bisogno del database.

Penso che se un avversario controlla il server Web, allora è come se avesse accesso completo al database, dato che sarà in grado di eseguire richieste arbitrarie al server delle applicazioni che si fiderà di loro. Immagino che lo rallenteranno, ma lo sforzo extra per implementare un livello intermedio + tutti i possibili buchi nell'applicazione introdotta da questo sembra non valga la pena per me.

P.S. Poiché mi è stato detto che la mia domanda è generica, aggiungerò ulteriori informazioni sulla configurazione che ho.

Ho un client SPA che parla solo con l'API e il token è usato come schema di autenticazione. L'applicazione Web fornisce realmente solo la richiesta iniziale per collegare l'applicazione e non ci sono altre chiamate oltre a file e API statici. L'applicazione web quindi parla direttamente al database nel livello dati. Ho un solo utente nel database e tutti gli accessi sono controllati dalla logica aziendale e / o dal livello di autorizzazione nel mio framework (ad esempio, i ruoli in un token possono essere verificati con gli attributi prima di passare al livello aziendale, quindi senza il ruolo richiesto non sono autorizzati ad accedere ad alcune API affatto). Quindi non c'è pericolo in nessuno che chiami una delle API (a meno che non riesca a proteggerle in modo appropriato, ma questa è un'altra storia).

Quindi, tenendo conto di questa configurazione, ci sarebbe un vantaggio dal punto di vista della sicurezza per far sì che il livello dati dell'applicazione web parli al server delle applicazioni che gestirà la logica di business invece del database direttamente (e il server delle applicazioni parlerà al database). In questo caso l'applicazione web è generalmente ridotta al caricamento iniziale del client + un proxy al servizio dell'applicazione, il che mi sembra del tutto superfluo.

    
posta Ilya Chernomordik 07.02.2016 - 13:14
fonte

3 risposte

4

"Più sicuro" è non costruttivo

Pensare che qualcosa sia "più sicuro" spesso porta a decisioni sbagliate. Ogni sorta di cose sono più sicure pur essendo una cattiva idea. È più utile chiedere "Questo aggiunge sicurezza significativa?" e "La sicurezza ha raggiunto un compromesso ragionevole tra costi e benefici?"

I livelli non aggiungono molta sicurezza

La maggior parte dei libri di infosec consiglia il modello a tre livelli. Ho trovato che il modello a due livelli è altrettanto comune (forse più comune) e questo include un gran numero di app altamente critiche che ho verificato: online banking, ecc.

La realtà è che avere due livelli è solo un beneficio marginale per la sicurezza su un singolo livello. Le persone diranno spesso "se il server web viene violato, non sono nel database". Mentre tecnicamente vero, questo è fuorviante. Il server Web disporrà di credenziali per connettersi al database, che consentirà a un utente malintenzionato di estrarre tutti i dati. Puoi immaginare alcuni scenari di attacco in cui avere due livelli blocca particolari vettori di exploit, ma questi sono rari.

Il vantaggio sulla sicurezza di tre livelli contro due è addirittura inferiore a due contro uno. E questo è particolarmente vero con SPA, dove il livello web è sul client.

Modifica Per essere chiari, intendo i livelli come nei livelli su server separati (virtuali o fisici) - piuttosto che una separazione puramente logica.

    
risposta data 08.02.2016 - 12:41
fonte
5

Se si distingue tra server Web, server applicazioni e database, si intende in realtà un front end, una logica aziendale e un back-end (storage). Questa è anche chiamata architettura multilivello con livello di presentazione, livello applicazione e livello dati. In questo caso, il server delle applicazioni non passerà semplicemente alcuna richiesta dal server Web ma consentirà solo azioni che si adattano alla logica aziendale. Ciò significa che tutta la sicurezza (cioè chi può accedere a cosa) viene essenzialmente eseguita nel server delle applicazioni e il server Web è lì solo per rendere queste informazioni accessibili tramite un browser web.

Se invece si dispone solo di server Web e database, la logica aziendale è essenzialmente parte del server web. Mentre questo rende spesso più facile iniziare con alcune applicazioni Web, la distinzione mancante tra presentazione e logica aziendale porterà facilmente in un disastro che nessuno può più comprendere e che spesso consente di aggirare la logica di business e ottenere così un accesso diretto al database per un attaccante.

Si noti che la separazione tra i livelli non deve necessariamente essere eseguita con un server o un'applicazione separati, ma può anche essere una separazione in-process (ad esempio API, classi ...). Ma è importante che questa separazione non possa essere semplicemente aggirata, che spesso può essere gestita in modo più sicuro con un processo o server separato. Una separazione mancante tra la presentazione e l'applicazione può talvolta essere vista in quanto non è possibile accedere a informazioni specifiche in HTML, ma sono comunque accessibili da un'API JSON o XML.

    
risposta data 07.02.2016 - 13:30
fonte
4

È necessario un livello applicazione come filtro, poiché la maggior parte dei * sistemi di database non consente la gestione delle autorizzazioni, che è abbastanza dettagliata per gestire più utenti.

Di solito * puoi creare utenti con permessi di lettura e scrittura diversi, ma solitamente * questi sono progettati per un massimo di poche decine di utenti e non si adattano bene a migliaia o addirittura a milioni di utenti. Inoltre, di solito * puoi impostare le autorizzazioni solo a livello di tabella non su un livello per riga ma solo a livello di campo.

Questo significa che è difficile per te controllare quali dati i tuoi utenti possono e non possono visualizzare e quali dati possono e non possono modificare. Per fare un esempio, prendiamo una tabella utenti con queste colonne

userId
password
profilePicture
createdDate
lastLoggedInDate

Le persone dovrebbero poter cambiare il proprio profilePicture , ma non quello di altre persone. Nessuno dovrebbe cambiare il campo createdAt e cambiare userId potrebbe causare tutti i tipi di hijink. Ogni utente deve modificare lastLoggedInDate al momento dell'accesso e impostarlo sulla data corrente, ma non impostarlo su qualcosa di diverso. Il tuo database può gestire questa complessità *? Oh, e non abbiamo ancora parlato dei riferimenti tra i tavoli.

Bene, ma se si limitasse a vietarlo sul livello del client semplicemente non scrivendo il codice della GUI per fare ciò che l'utente non dovrebbe fare? Il problema è che il tuo database non ha modo di verificare che l'applicazione client sia realmente il programma che hai scritto. Quando parla SQL e invia credenziali di accesso valide, il database si fiderà di esso. Un utente malintenzionato potrebbe scrivere il proprio client e inviare comandi SQL arbitrari al proprio database.

* Non voglio dire che è impossibile che esista un database che può fare tutto questo, ma finora non ne ho visto uno. Quando ne conosci uno, non esitare a commentare.

    
risposta data 08.02.2016 - 09:43
fonte

Leggi altre domande sui tag