Beneficio práctico de usar SqlCredential vs nombre de usuario / contraseña en la cadena de conexión

1

Actualmente estoy usando la autenticación de SQL Server con el nombre de usuario / contraseña como parte de la cadena de conexión para mi aplicación web. Por lo que yo sé, este procedimiento estándar dentro del mundo .NET y posiblemente más allá. Sin embargo, estaba examinando los documentos para el SqlConnection.ConnectionString debido a un asunto no relacionado y notó que dicen:

  

SqlCredential es una forma más segura de especificar credenciales para una conexión que utiliza la autenticación de SQL Server.

Supongo que la mayor parte de esta seguridad se debe al uso de SecureString para almacenar la contraseña. Esta clase viene con su propio conjunto de problemas cuando se usa en el contexto de una aplicación web porque implementa IDisposable . Eso significa que tengo que hacer una de tres opciones malas:

  1. A propósito, no desechar el SecureString dejándolo en una variable global estática que lee la contraseña del archivo de configuración una vez.
  2. Acepte el impacto de rendimiento al leer la contraseña del archivo de configuración en cada solicitud.
  3. Omita los beneficios de SecureString manteniendo la contraseña como string para que pueda deshacerme del SecureString regularmente sin incurrir en la pena de leer el archivo de configuración en cada solicitud.

Teniendo en cuenta esos problemas y el hecho de que si alguien tiene acceso al servidor, está instalado de todos modos . Además, parece que los beneficios de cifrar la cadena de conexión básicamente se reducen a , lo que reduce el riesgo de filtrar accidentalmente los detalles a personas que no deberían tenerlos:

  

Al mantener los detalles de la conexión fuera del control de la fuente y fuera de la distribución general, reduce la posibilidad de pérdida o fuga. ... Debido a esto, si el cifrado está en uso, separar la clave de la cadena de conexión y separar la cadena de conexión de la fuente es una acción esencial. Hacer esto ha separado los deberes y la protección de las claves de cifrado (o archivos de configuración) se convierte en una función de administrador del sistema, en lugar de una función de desarrollador.

Sin embargo, me parece que la forma más eficiente de reducir ese riesgo es restringiendo el acceso al servidor y la cadena de conexión solo a aquellos que necesitan saber a través de la compilación / lanzamiento automatizado 1 y proteger su servidor es obviamente el primer paso y el más importante para proteger la cadena de conexión. Me parece que probablemente haya un beneficio teórico menor al usar el SqlCredential en una aplicación web 2 , pero no hay un beneficio práctico real de tener el nombre de usuario / contraseña en la cadena de conexión.

Dicho esto, probablemente haya un error fundamental en mi razonamiento porque la gente de Microsoft es un grupo inteligente. Entonces, ¿qué me estoy perdiendo?

1: Transformar / agregar el valor automáticamente en el pipeline de compilación / lanzamiento.

2: estoy usando un Azure Cloud Service y conectarse a una Base de datos SQL de Azure , con la mayor parte de la lógica de la capa de aplicación escrita en C # si importa.

    
pregunta Erik 24.11.2015 - 22:12
fuente

2 respuestas

1

No soy un desarrollador .net, pero Java es muy similar. Creo que el caso de uso de SecureString, y SQLCredential es para cualquier contraseña que no sea de larga duración. es decir, inicia sesión en un SQL Server remoto brevemente, y luego abandona la conexión y continúa con cualquier otra cosa que la aplicación tenga que hacer. El uso de SecureString parece eliminar esta contraseña brevemente utilizada de la memoria lo antes posible, en lugar de esperar a que se elimine en un momento (posiblemente mucho más tarde).

Desde su descripción, su aplicación utiliza una conexión de base de datos persistente, y probablemente un grupo de conexión de base de datos. Así que necesitas el nombre de usuario / contraseña para estar en la memoria todo el tiempo. Hay poco o ningún beneficio en eliminar la contraseña de la memoria, ya que se cargará en la memoria muy pronto y, en última instancia, se almacena en algún archivo de configuración de todos modos.

En cuanto a cuestionar su propio pensamiento, es bueno hacer esto, pero no le dé a los expertos la máxima autoridad. Ellos no pueden saber su situación específica. Aconsejo precaución al leer consejos generalizados. Puede o no aplicarse a usted. En este caso, Microsoft tiene que dar una respuesta amplia que se aplique a todos, en una amplia gama de usos. Microsoft también tiene que recomendar a cualquiera que desarrolle aplicaciones .net en el escritorio, lo que podría incluir a un usuario simplemente escribiendo una contraseña. Los escritorios tienen un modelo de amenaza completamente diferente al de los servidores. Para un usuario de escritorio que ingresó una contraseña una vez por la mañana y dejó la conexión, sería "malo" si esa contraseña perdurara horas después, y la máquina se vio comprometida por un agujero de seguridad completamente no relacionado.

En otras palabras, es una "mejor práctica" simplemente decirles a todos que usen SQLCredential en lugar de tratar de explicarles a todos los modelos de amenazas, etc. La mayoría de las personas no van a comprender lo que está viendo.

    
respondido por el Steve Sether 24.11.2015 - 23:09
fuente
1

Si establece una contraseña de usuario en la cadena de conexión en lugar de usar la propiedad SqlConnection.Credential (que utiliza internamente SecureString ), un administrador malintencionado puede volcar la memoria de una aplicación en ejecución y leer la contraseña en texto sin cifrar.

    
respondido por el Dejan 29.01.2018 - 00:58
fuente

Lea otras preguntas en las etiquetas