¿Es una buena práctica establecer cadenas de conexión en una configuración web?

14

Recientemente tuve una discusión con algunos de mis colegas en mi trabajo porque dijeron que es mejor tener en un .DLL una conexión de cadena encriptada. Y dije ¿por qué simplemente no usar la conexión de cadena definida en el cifrado web.config? es lo mismo y es mejor porque el marco de la entidad, por ejemplo, busca el nombre de la conexión en la configuración web de la aplicación, ¿Ahora quiero saber desde un punto de seguridad qué es mejor o cuál es la mejor práctica?

Jorge
fuente
2
Por supuesto, puede hacer que la aplicación se ejecute como usuario de dominio y solo permitir que ese usuario acceda a la base de datos. Luego necesitan acceso a LDAP para entrar en su base de datos.
pdr
@pdr: la cadena de conexión aún revelará cierta información que preferiría que no se revelara si el servidor web estuviera en peligro, por ejemplo, el nombre del servidor de la base de datos y el nombre de la base de datos.
Carson63000

Respuestas:

18

No hay una diferencia sustancial, excepto que tendrá que construir un binario si desea realizar un cambio de configuración si lo coloca en un archivo DLL, mientras que un administrador podría modificar la configuración con herramientas estándar bien entendidas si está en la configuración Ya existe un mecanismo para encriptar cadenas de configuración y orientación adicional sobre MSDN . Las versiones actuales de Asp.Net pueden tener mecanismos alternativos, por lo tanto, haga una investigación adicional antes de comprometerse con un enfoque.

El hecho de que algo esté en una DLL no lo hace más seguro. Un editor de texto también puede abrir archivos binarios, herramientas como Reflector pueden proporcionar una interfaz más agradable para navegar por un DLL .Net; una DLL no proporcionará ningún cifrado "extra".

JasonTrue
fuente
La prueba es binaria, binaria son números, si alguien puede leer los 1 y 0, su seguridad física y de software ha fallado.
Ramhound
12

No importa dónde se almacenan los datos cifrados, importa cómo se cifran.

Las secciones encriptadas en un web.config normalmente están encriptadas con la API de protección de datos , que es extremadamente difícil de descifrar sin comprometer toda la máquina. También puede usar un contenedor de claves RSA, que es similar (difícil de sacar de la máquina).

Supongo que si desea almacenar la cadena encriptada en la DLL, está bien, aunque no es inherentemente más segura que una web.config encriptada (cualquiera puede mirar esa DLL con Reflector ), y obviamente es más difícil de cambiar (usted necesitaría recompilar). Pero nuevamente, lo que es mucho más importante es cómo se generó esa cadena encriptada; presumiblemente no estás usando los mismos proveedores que usarías para un web.config encriptado, entonces, ¿qué estás usando?

Un esquema de cifrado es tan fuerte como la clave privada o el secreto compartido. Si esa clave también se almacena en su ensamblaje, entonces es posible que no tenga cifrado en absoluto. Si está almacenado en alguna base de datos externa, entonces plantea la cuestión de cómo se asegura la cadena de conexión de esa base de datos. Esto realmente solo puede conducir a una seguridad más débil en general.

Por otro lado, si usted fuera un proveedor de servicios y la cadena de conexión estuviera encriptada con una contraseña de usuario , eso sería más seguro que usar una clave de máquina estática. Por otra parte, si está utilizando contraseñas de usuario para cifrar, es bastante improbable que codifique los datos cifrados en su ensamblado, ya que debe generarse y almacenarse en respuesta a la acción del usuario (no del desarrollador).

Realmente no puedo pensar en demasiadas situaciones en las que codificar una cadena de conexión (encriptada) en la DLL sea más segura que encriptar la sección web.config relevante. En el mejor de los casos, solo agrega inconvenientes, en el peor de los casos, depende de una seguridad personalizada torpemente escrita llena de agujeros. Hazte un favor y haz lo que Microsoft recomienda: solo encripta tu web.config si hay datos confidenciales allí.

Aaronaught
fuente
2

La mejor práctica para ASP.NET es colocar todas las configuraciones / configuraciones en el archivo web.config o en el archivo app.config (para otros tipos de proyectos).

Sobre el cifrado y la razón para usarlo en sus cadenas de conexión tiene que ser un caso muy especial. Debido a que en la mayoría de los casos hasta el 99%, no necesita cifrar las cadenas de conexión. Las propias aplicaciones empresariales de Microsoft tienen su cadena de conexión expuesta en el archivo web.config / app.config. Creo que has terminado de complicar la seguridad.

Una cosa más, codificar sus cadenas de conexión es una mala práctica. Por ejemplo, no coloque ninguna cadena de conexión (también conocida como cadena de conexión) en un archivo DLL o .aspx / .ascx / .cshtml o código subyacente.

William Chang
fuente
1
Nunca debe tener una contraseña en texto claro en un archivo de configuración. El hecho de que sea una aplicación empresarial detrás de firewalls no significa que sea seguro y que pueda olvidarse de la seguridad.
Ryan M