set_password required_fields password documentacion change authenticate auth database django security passwords

database - required_fields - ¿Está bien que las credenciales de la base de datos se almacenen en texto plano?



required_fields django (3)

Por defecto, la base de datos / usuario / contraseña de Django se almacenan en el archivo settings.py del proyecto en texto plano.

Parece que no puedo pensar en una mejor manera en este momento, pero esto parece ir en contra de las mejores prácticas para el almacenamiento de contraseñas. Por supuesto, si un atacante tiene acceso al archivo de configuración, es probable que todo ya se haya perdido. Incluso si el archivo estuviera encriptado, el atacante probablemente tendría los medios para descifrarlo para entonces.

¿Esta bien?


Estás en lo correcto. Pero puede aumentar la seguridad mediante:

  • Establecer los permisos correctamente (esto dependerá de su configuración). Idealmente, solo Python debería poder leer el archivo.

  • Almacenar el archivo fuera de la raíz www o htdocs . Si en este punto un atacante aún tiene acceso a ellos, estás atornillado de todos modos.

  • Para mayor seguridad, puede cifrar la configuración de la conexión mediante el cifrado simétrico (por ejemplo: AES). Guarde la llave en otro lugar. Así que incluso si alguien lograba acceder a la configuración de la conexión, todavía tendría que encontrar la clave. El principal inconveniente es que ahora tienes que volver a escribir el método de conexión.


La aplicación de doce factores codificada por Heroku recommends

Separación estricta de la configuración del código.

Esto es particularmente importante para la gestión de credenciales, que idealmente nunca debería comprometerse con el control de la fuente.

La biblioteca django-environ ofrece un buen enfoque para extraer la mayoría de las configuraciones específicas del entorno del archivo settings.py, pero puede hacer un gran recorrido simplemente haciendo referencia a los bits más sensibles con la biblioteca del sistema operativo estándar, por ejemplo, ''PASSWORD'': os.environ[''DBPASS'']

Por supuesto, es probable que aún guarde algunas contraseñas en texto sin formato en alguna parte , pero si ese archivo no está incrustado en su base de código, es mucho menos probable que se filtre.


Sí, es un procedimiento estándar para cualquier programa de comunicación de base de datos. Realmente no hay una "mejor manera" de hacerlo.

Hay formas de evitar que los hosts no válidos se conecten (tablas ip, direcciones ip privadas), pero los detalles reales de la conexión casi siempre son texto sin formato.

Almacenar el archivo fuera de la raíz web ayudará en algo, pero si el atacante tiene acceso al sistema de archivos, no importará.