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.