¿Es la aplicación web conectada a una base de datos a través de un servidor de aplicaciones más segura?

4

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.

    
pregunta Ilya Chernomordik 07.02.2016 - 13:14
fuente

3 respuestas

4

"Más seguro" no es constructivo

Pensar que algo es "más seguro" a menudo conduce a una mala toma de decisiones. Todo tipo de cosas son más seguras y son una mala idea. Es más útil preguntar "¿Añade esto seguridad significativa?" y "¿La seguridad obtuvo una compensación razonable entre costo y beneficio?"

Los niveles no agregan mucha seguridad

La mayoría de los libros informáticos recomiendan el modelo de tres niveles. Descubrí que el modelo de dos niveles es igual de común (quizás más común) y esto incluye una gran cantidad de aplicaciones muy importantes que he auditado: banca en línea, etc.

La realidad es que tener dos niveles es solo un beneficio de seguridad marginal en un solo nivel. La gente suele decir "si el servidor web es hackeado, no están en la base de datos". Si bien técnicamente es cierto, eso es engañoso. El servidor web tendrá credenciales para conectarse a la base de datos, lo que permitirá a un atacante extraer todos los datos. Puedes imaginar ciertos escenarios de ataque donde tener dos niveles bloquea vectores de exploits particulares, pero estos son poco comunes.

El beneficio de seguridad de tres niveles frente a dos es incluso inferior a dos frente a uno. Y esto es especialmente así con los SPA, donde el nivel web está en el cliente.

Editar Para ser claro, me refiero a los niveles como en los niveles en servidores separados (virtuales o físicos), en lugar de una separación puramente lógica.

    
respondido por el paj28 08.02.2016 - 12:41
fuente
5

Si distingue entre el servidor web, el servidor de aplicaciones y la base de datos, en realidad quiere decir front-end, lógica empresarial y back-end (almacenamiento). Esto también se denomina arquitectura de múltiples niveles con nivel de presentación, nivel de aplicación y nivel de datos. En este caso, el servidor de aplicaciones no simplemente pasará por las solicitudes del servidor web, sino que solo permitirá acciones que se ajusten a la lógica de negocios. Esto significa que todo el material de seguridad (es decir, quién puede acceder a qué) se realiza esencialmente en el servidor de aplicaciones y el servidor web está allí para hacer que esta información sea accesible a través de un navegador web.

Si, en cambio, solo tiene un servidor web y una base de datos, la lógica de negocios es esencialmente parte del servidor web. Si bien esto hace que a menudo sea más fácil comenzar con alguna aplicación web, la distinción que falta entre la presentación y la lógica de negocios llevará fácilmente a un desorden que ya nadie puede entender y que a menudo permite evitar la lógica de negocios y así obtener acceso directo a la base de datos para atacante.

Tenga en cuenta que la separación entre las capas no necesariamente tiene que hacerse con un servidor o aplicación independiente, pero también puede ser una separación en proceso (es decir, API, clases ...). Pero es importante que esta separación no se pueda omitir simplemente, lo que a menudo se puede manejar de manera más segura con un proceso o servidor separado. En ocasiones, se puede ver una separación que falta entre la presentación y la aplicación, ya que no se puede acceder a información específica mediante HTML, pero aún se puede acceder a ellas mediante una API JSON o XML.

    
respondido por el Steffen Ullrich 07.02.2016 - 13:30
fuente
4

Necesita un nivel de aplicación como filtro porque la mayoría de los sistemas de base de datos * no permiten el manejo de permisos, que es lo suficientemente detallado para manejar múltiples usuarios.

Generalmente * puede crear usuarios con diferentes permisos de lectura y escritura, pero generalmente * estos están diseñados para una docena de usuarios y no se escalan bien para miles o incluso millones de usuarios. Además, por lo general, * solo se pueden establecer permisos en un nivel de tabla, no en un nivel por fila, pero solo en un nivel por campo.

Esto significa que es difícil para usted controlar qué datos pueden y no pueden ver sus usuarios y qué datos pueden y no pueden editar. Para dar un ejemplo, tomemos una tabla de usuarios con estas columnas

userId
password
profilePicture
createdDate
lastLoggedInDate

Se debería permitir a las personas cambiar su propio profilePicture , pero no el de otras personas. Nadie debería cambiar el campo createdAt y cambiar el userId podría causar todo tipo de hijinks. Cada usuario debe editar el lastLoggedInDate cuando inicia sesión y lo establece en la fecha actual, pero no lo establece en nada diferente. ¿Puede su base de datos manejar esta complejidad *? Ah, y aún no hemos hablado de referencias entre tablas.

Bueno, pero ¿qué pasa si simplemente prohíbe esto en la capa de cliente al no escribir el código GUI para hacer las cosas que el usuario no debe hacer? El problema es que su base de datos no tiene forma de verificar que su aplicación cliente sea realmente el programa que escribió. Cuando habla SQL y envía credenciales de inicio de sesión válidas, la base de datos confiará en ello. Un usuario malintencionado podría escribir su propio cliente y enviar comandos SQL arbitrarios a su base de datos.

* No quiero decir que es imposible que exista una base de datos que pueda hacer todo eso, pero hasta ahora no he visto ninguna. Cuando conozca uno, no dude en comentar.

    
respondido por el Philipp 08.02.2016 - 09:43
fuente

Lea otras preguntas en las etiquetas