He oído hablar de mis colegas y otras personas en la web que sugieren que es más seguro ejecutar esta configuración:
Web server -> Application server -> Database
, que esto:
Web server -> Database
Las razones por las que si un adversario toma el control de un servidor web, entonces hay una capa más que superar si necesita la base de datos.
Creo que si un adversario controla el servidor web, es tan bueno como tener acceso completo a la base de datos, ya que podrán ejecutar solicitudes arbitrarias al servidor de aplicaciones que confiará en ellas. Supongo que los frenará, pero el esfuerzo adicional de implementar un nivel intermedio + todos los posibles agujeros en la aplicación introducida por eso no merece la pena.
P.S. Como me dijeron que mi pregunta es genérica, agregaré más información sobre la configuración que tengo.
Tengo un cliente SPA que habla solo con la API y el token se usa como un esquema de autenticación. La aplicación web realmente proporciona solo la solicitud inicial para conectar la aplicación y no hay otras llamadas aparte de los archivos estáticos y la API. La aplicación web se comunica directamente con la base de datos en la capa de datos. Tengo un solo usuario en la base de datos y todos los accesos están controlados por la lógica de negocios y / o la capa de autorización en mi marco (por ejemplo, los roles en un token se pueden verificar con atributos antes de ir a la capa de negocios, por lo que sin un rol requerido no se les permite acceder a alguna API en absoluto). Entonces, no hay peligro en que alguien llame a cualquiera de la API (a menos que no pueda protegerlos adecuadamente, pero esa es otra historia).
Entonces, teniendo en cuenta esta configuración, ¿habría alguna ventaja desde el punto de vista de seguridad para hacer que la capa de datos de la aplicación web se comunique con el servidor de aplicaciones que manejará la lógica empresarial en lugar de la base de datos directamente (y el servidor de aplicaciones hablará)? a la base de datos). En este caso, la aplicación web generalmente se reduce a la carga inicial del cliente + un proxy al servicio de la aplicación, lo que me parece bastante superfluo.