¿Cómo cifrar las credenciales de conexión de base de datos en un servidor web?

25

OWASP recomienda no almacenar las credenciales de la base de datos en texto sin formato:

enlace

Sin embargo, no proporcionan sugerencias sobre cómo cifrar las credenciales de acceso a la base de datos, dónde almacenar las claves, cómo administrar el acceso a las claves, etc.

¿Alguien tiene experiencia en el mundo real de implementar una solución de este tipo que pueda sugerir una arquitectura en una pila LAMP (ubuntu 10, PHP 5.3)?

PD: no estoy buscando respuestas como "no te preocupes, si alguien obtiene acceso de root, es demasiado tarde", etc.

    
pregunta tom 18.10.2012 - 18:18
fuente

3 respuestas

16

Las otras respuestas aquí son todas correctas en un par de aspectos clave. El archivo que contiene su cadena de conexión no debe guardarse en un lugar legible para todo el mundo y, como observa, no puede impedir que alguien acceda a la clave si ha comprometido su servidor. Aun así, hay otras razones para cifrar la clave (o el archivo). Parte de la razón por la que OWASP recomienda no almacenar en texto sin formato es para evitar la divulgación accidental de credenciales a quienes no las necesitan.

Si bien muchos señalan que cifrar la cadena de conexión en el sistema en ejecución proporciona poco valor real (seguridad por oscuridad), esto es cierto principalmente en el contexto del sistema en vivo. Asumiendo una configuración LAMP tradicional, los permisos basados en archivos evitarían la lectura de cualquier otro usuario que no sea el usuario del script en el que se está ejecutando el proceso php / apache. Tener el archivo fuera de la ubicación de la raíz proporciona un poco más de seguridad potencial (en caso de controladores MIME mal configurados o .htaccess) pero no es estrictamente necesario.

El mayor valor en la configuración de la conexión de separación es que los datos de autenticación y los datos ya no necesitan ser entregados a los desarrolladores / evaluadores u otras personas que puedan tener una necesidad real de conectarse al servidor. 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.

Un segundo beneficio es la distribución y copia de seguridad de la fuente. Ciertamente, una práctica recomendada sería transferir solo archivos con información confidencial de conexión y de cuenta, pero por muchas razones, esto no siempre es práctico. 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.

De esta forma, en Apache / php tienes varias opciones.

1.) No ponga la cadena de conexión en el código php en absoluto. Puede poner estos valores en su archivo httpd.conf o hosts virtuales. La conexión entonces no requiere parámetros cuando se usa mysql_connect() ... el uso más detallado está disponible aquí: enlace

2.) Incluya el archivo de configuración configfile.php como de costumbre, pero mueva el archivo de conexión fuera de webroot si puede, y cifre el archivo en sí. El SA puede configurar el descifrado del sistema operativo para el proceso que accederá al archivo. Uso alternativo Si no puede mover el archivo fuera de webroot (alojamiento compartido), asegure el archivo con .htaccess

<files configfile> 
     order allow,deny 
     deny from all 
</files> 

Para Microsoft IIS con ASP.NET, la cadena de conexión se almacena en el archivo application.config o web.config y el cifrado utilizado puede ser una clave de máquina estática, almacenada en cualquiera de estos archivos, o una clave generada por IIS en sí, que no se almacena en una ubicación accesible. Los detalles están disponibles en MSDN, con lo que no haré esta respuesta ya que su pregunta fue específica para LAMP.

También debo tener en cuenta que, cuando sea posible, mi preferencia es evitar el problema por completo mediante el uso de la autenticación integrada. La asignación del usuario del sistema operativo a un usuario de base de datos elimina los requisitos de protección del contexto de esta pregunta casi por completo.

    
respondido por el iivel 19.10.2012 - 16:57
fuente
1

Tengo muy poca experiencia con esto, pero siempre he escuchado que lo dejas en texto sin formato (de todos modos, ¿cuál es el punto de cifrado si la clave está ahí?) y deja las credenciales en un archivo de inclusión y luego pongo un control de acceso muy estricto en ese archivo.

en mi experiencia con cosas web ... hay muchas maneras de hacer las cosas ... y pocas formas de hacer las cosas bien.

(desde mi teléfono disculpe mi brevedad)

    
respondido por el Rell3oT 19.10.2012 - 00:57
fuente
0

Hay poco uso para cifrar su contraseña de base de datos. En el caso de PHP, incluso se requiere código criptográfico para ejecutarse en cada solicitud, eso es solo una pérdida de tiempo de CPU. Además de eso, hay muchas otras razones por las que no es una buena idea:

  • Su aplicación necesita descifrar los datos. Dado que los archivos de configuración de PHP son probablemente también los archivos de PHP, es probable que alguien con acceso al archivo de configuración también tenga acceso al archivo que contiene el código / clave de descifrado.
  • pérdida de tiempo de CPU para descifrar la contraseña.
  • Si la base de datos está configurada correctamente con la contraseña no le da ninguna ventaja: el acceso debe estar restringido a localhost (o al host en el que se ejecute el servidor web) y, en caso de que herramientas como phpMyAdmin estén en el servidor, deben estar protegidas. con una contraseña diferente. En realidad, en el caso de por ejemplo. Es posible que PostgreSQL se ejecute localmente, es posible que no necesite una contraseña, ya que simplemente puede otorgar a un usuario del sistema acceso a una base de datos determinada, por lo que si su código PHP se ejecuta como ese usuario, evitará almacenar la contraseña de cualquier para la base de datos.

Entonces ... ¿qué puede hacer que tenga sentido? Bastante simple, no coloque más archivos dentro de la raíz del documento de lo absolutamente necesario. Como las aplicaciones generalmente buenas usan URL limpias enrutadas a través de un solo archivo .php, solo se coloca ese archivo en la raíz del documento. Cualquier otra cosa, es decir, el otro código de aplicación, los archivos de configuración, etc. deben estar fuera de la raíz del documento. De esa manera, una configuración incorrecta del servidor (por ejemplo, el motor PHP está deshabilitado y, por lo tanto, envía código simple al usuario) solo le dará acceso al usuario a un solo archivo PHP que probablemente no contenga mucho más que una llamada require y alguna llamada de función.

También asegúrate de que tus archivos no se puedan escribir o leer en todo el mundo (especialmente cuando tienes que usar hosting compartido). Con un servidor configurado correctamente (php NO se ejecuta como www-data o un usuario similar, pero su usuario) puede deshabilitar completamente el acceso "mundial" y posiblemente el "grupo" a sus archivos.

    
respondido por el ThiefMaster 19.10.2012 - 01:35
fuente

Lea otras preguntas en las etiquetas