language-agnostic passwords database-connection

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)

  1. Crear un usuario de O / S
  2. Coloque la contraseña en una variable de entorno O / S para ese usuario
  3. Ejecute el programa como ese usuario

Ventajas:

  1. Solo root o ese usuario puede ver las variables de entorno de O / S de ese usuario
  2. Sobrevive el reinicio
  3. Nunca accidentalmente verifica la contraseña en el control de la fuente
  4. No necesita preocuparse por arruinar los permisos de archivos
  5. No necesita preocuparse por dónde almacena una clave de cifrado
  6. 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.



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.