language agnostic - ¿Cómo evito tener la contraseña de la base de datos almacenada en texto plano en el código fuente?
language-agnostic passwords (6)
- Crear un usuario de O / S
- Coloque la contraseña en una variable de entorno O / S para ese usuario
- Ejecute el programa como ese usuario
Ventajas:
- Solo root o ese usuario puede ver las variables de entorno de O / S de ese usuario
- Sobrevive el reinicio
- Nunca accidentalmente verifica la contraseña en el control de la fuente
- No necesita preocuparse por arruinar los permisos de archivos
- No necesita preocuparse por dónde almacena una clave de cifrado
- Works x-platform
En la aplicación web que estoy desarrollando, actualmente uso una solución ingenua cuando me conecto a la base de datos:
Connection c = DriverManager.getConnection("url", "username", "password");
Esto es bastante inseguro. Si un atacante obtiene acceso al código fuente, también obtiene acceso a la base de datos. ¿Cómo puede mi aplicación web conectarse a la base de datos sin almacenar la contraseña de la base de datos en texto plano en el código fuente?
A menos que me falta el punto de que la conexión debe ser administrada por el servidor a través de un grupo de conexiones, por lo tanto, las credenciales de conexión son retenidas por el servidor y no por la aplicación.
Tomando esto más en cuenta generalmente construyo una convención donde la aplicación web frontend (en una DMZ) solo habla con la base de datos a través de un servicio web (en el dominio), por lo tanto, proporciona una separación completa y una seguridad de DB mejorada.
Además, nunca dé privilegios a la cuenta db más allá de lo que es esencialmente necesario.
Un enfoque alternativo es realizar todas las operaciones a través de procedimientos almacenados y otorgar a la aplicación acceso de usuario solo a estos procesos.
En .NET, la convención es almacenar las conexiones en un archivo de configuración separado.
Ahí, el archivo de configuración puede ser encriptado .
Si está utilizando Microsoft SQL Server, todo esto se vuelve irrelevante si utiliza una cuenta de dominio para ejecutar la aplicación, que luego utiliza una conexión de confianza a la base de datos. La conexión no contendrá nombres de usuario y contraseñas en ese caso.
Puede almacenar la cadena de conexión en Web.config o en el archivo App.config y encriptar la sección que lo contiene. Aquí hay un artículo muy bueno que utilicé en un proyecto anterior para encriptar la cadena de conexión:
http://www.ondotnet.com/pub/a/dotnet/2005/02/15/encryptingconnstring.html
Puedo recomendar estas técnicas para programadores .NET:
- Encriptar contraseña / cadena de conexión en archivo de configuración
- Configure la conexión de confianza entre el cliente y el servidor (es decir, use la autenticación de Windows, etc.)
Aquí hay artículos útiles de CodeProject:
Suponiendo que está utilizando MS SQL, puede aprovechar la autenticación de Windows que no requiere nombre de usuario / pase en ningún lugar en el código fuente. De lo contrario, tendría que estar de acuerdo con los otros carteles que recomiendan app.config + encryption.