¿Merece la pena desde el punto de vista de seguridad limitar al usuario del servidor de base de datos para el sitio web ASP.NET a solo EJECUTAR en procedimientos almacenados?

9

Sé que, obviamente, debemos evitar los ataques de inyección de SQL mediante la validación de las entradas del usuario y las consultas parametrizadas. Ya existe un servidor de seguridad en el servidor de la base de datos para limitar las conexiones remotas a ser aceptadas solo desde el servidor web.

¿También agregaría valor desde un punto de vista de seguridad para limitar la cuenta de usuario de la base de datos real que usa el sitio web ASP.NET al permiso EXECUTE solo en los procedimientos almacenados que necesitan? Toda la interacción de la base de datos se llevaría a cabo utilizando estos procedimientos almacenados.

Esto me parece que incluso en un escenario en el que un atacante descubre una forma de acceder a la conexión de la base de datos, ¿el ataque se limita a ejecutar solo consultas predefinidas y no consultas abiertas?

    
pregunta Peter Smith 09.08.2011 - 22:51
fuente

4 respuestas

9

Hay dos razones principales (de seguridad) para hacer esto, más allá del simple uso de consultas parametrizadas:

  • Cumplimiento del tipo de parámetro
  • Mínimo privilegio.

El principio de privilegio mínimo requiere que usted permita que cualquier entidad (usuario o aplicación) acceda solo a lo que necesite para realizar la tarea definida. Si no restringe la aplicación web solo a los SP, la aplicación podría ejecutar cualquier consulta arbitraria.
Tenga en cuenta que esto es relevante en dos situaciones: evitar que un atacante, que logró encontrar una vulnerabilidad en su aplicación (inyección de SQL o cualquier otra vulnerabilidad que pudiera permitirle ejecutar código), ejecute consultas SQL maliciosas; y, mucho menos riesgo, los desarrolladores que buscan accesos directos inseguros y no aprobados (o incluso desarrolladores maliciosos).
Al otorgar solo los privilegios de EJECUTAR sobre los SP requeridos, evitará que la aplicación ejecute cualquier consulta que no esté predefinida.

Wrt impone los tipos de parámetros, aunque es posible implementar esto de otras maneras, esto lleva el tipo de imposición a la base de datos, pero antes de que llegue al servidor db. Es decir. usando los tipos que están en realidad definidos en la base de datos, y sin saltar accidentalmente un parámetro.

Tenga en cuenta que para hacer esto correctamente y evitar algunos errores comunes, desea:

  1. defina una cuenta de usuario específica para la aplicación ASP.NET
  2. asigne la cuenta a un personalizado rol de DB
  3. elimine la cuenta de todos los demás roles, como dbo .
  4. conceda privilegios EXECUTE al rol de base de datos personalizado que creó
  5. elimine todos los demás privilegios en los SP, tablas y otros objetos de base de datos. Esto incluye roles "públicos" predeterminados, y así sucesivamente.
  6. asegúrese de que la función de base de datos personalizada no tenga otros privilegios.
respondido por el AviD 09.08.2011 - 23:04
fuente
3

Absolutamente.

Pero luego debe tener cuidado con los procedimientos almacenados. Si uno pudiera permitir que se le pasaran consultas arbitrarias, entonces todavía se encuentra atrapado en la misma posición.

    
respondido por el Steve 09.08.2011 - 23:00
fuente
0

El principio de privilegio mínimo viene a la mente aquí, ahora es un poco anecdótico. En PostgreSQL (sí, me doy cuenta de que esta es una pregunta de SQL Server, pero podría ser algo a tener en cuenta) es posible que un usuario sin privilegios escriba una función que sobrecargue (el mismo nombre de función + parámetros) que pueda ser maliciosa consulta. Cuando un usuario privilegiado ejecuta esta consulta, puede pensar que está ejecutando la función de agregar predeterminada cuando en realidad está utilizando la maliciosa. Como desarrollador, sé que estás creando una pesadilla de mantenimiento, porque siempre habrá una consulta "única" que debe escribirse. Entonces, aquí hay una pregunta: cuando creas una nueva cuenta de usuario, si esa es una consulta predefinida, no te has otorgado ninguna protección adicional. Se podría argumentar que, de hecho, lo ha empeorado, ya que ahora permite que un atacante monitoree su sistema de forma indefinida, a menos que supervise constantemente los archivos de registro de los nuevos usuarios. Además, los datos cambian, por lo que la declaración UPDATE es su nuevo peor enemigo, ya que le permite a alguien poner javascript directamente en un registro que se devuelve, ya que estoy hablando por experiencia, todos confían en que los datos de la base de datos ya están protegidos.

    
respondido por el Woot4Moo 10.08.2011 - 17:47
fuente
0

Aquí hay un inconveniente desagradable: una vez tuvimos este tipo de reglas, pero no todas las solicitudes de base de datos encajan perfectamente en los procedimientos almacenados. Entonces, lo que sucedió fue que muchos de los desarrolladores creaban manualmente SQL dentro de los procedimientos almacenados y lo ejecutaban allí. Esto llevó a una gran cantidad de código feo y agujeros potenciales desagradables, ya que sp_executsql , al menos en ese momento, se ejecutaría con permisos de nivel sa una vez que estuviera dentro de un proceso almacenado y la entrada de desinfección dentro de los procedimientos de SQL es mucho más fea que la entrada de desinfección Un lenguaje de aplicación moderno.

Comenzamos a ejecutar con permitir operaciones CRUD en tablas y aplicar la parametrización en la capa de aplicación después de que esto saliera a la luz.

    
respondido por el Wyatt Barnett 02.08.2013 - 20:32
fuente

Lea otras preguntas en las etiquetas