2011-11-01 11 views
5

Primero, si hay un duplicado exacto, no lo encontré, así que me disculpo en caso de que ya se haya proporcionado la respuesta.Asegurando las credenciales de inicio de sesión de la base de datos (MySQL) en una aplicación web (pila LAMP)

voy a presentar el problema que estoy enfrentando, con la esperanza de que voy a obtener una idea o una respuesta directa "no es posible".

Cómo proteger las credenciales de base de datos en una aplicación web en caso de que el servidor donde PHP está es comprometida? Supongamos que en el caso de este problema no estamos hablando de alojamiento compartido, VPS ni nada por el estilo, solo hay una persona que tiene acceso al cuadro que almacena información de MySQL.

servidor MySQL en sí está situado en otra caja (remoto) y permite conexiones desde sólo un rango de direcciones IP (unida a la caja de PHP).

¿Cómo garantizar que el usuario malintencionado no pueda obtener los detalles necesarios para la cadena de conexión de MySQL? Supongamos que el usuario ha roto el inicio de sesión raíz del cuadro de Linux que ejecuta PHP.

¿Qué medidas tomaría para proporcionar la mayor seguridad en términos de acceso a la información necesaria para establecer la conexión MySQL en tal caso?

Gracias por leer y comentar con anticipación.

+0

Este tema ya se ha cubierto aquí - http://stackoverflow.com/questions/3710511/best-way-to-connect-to-mysql-with-php-securely – hafichuk

+0

@hafichuk - el enlace proporcionado sugiere ciertas partes de asegurando el acceso, con la mejor respuesta es encriptando el archivo con la contraseña.Sin embargo, si alguien es una raíz, nada les impide modificar el código PHP y hacer eco de las credenciales. Me pregunto si alguien tiene un mejor método para establecer la comunicación entre el servidor de aplicaciones y el servidor de bases de datos, como el cifrado de clave pública o similar, donde el servidor de db participa en la negociación antes de permitir la conexión. – Furicane

Respuesta

2

La mejor solución en este caso, si se trata de una prioridad principal, sería el uso de procedimientos almacenados.

Los procedimientos almacenados almacenar las consultas a la base dentro de la base de datos, por lo tanto, acaba de establecer para arriba, y luego crear un nuevo usuario de MySQL con que acaba de registrar permisos de ejecución procedimiento. De esa manera, incluso si el código de la aplicación se viera comprometido, solo podrían manipular un subconjunto limitado de sus datos, y tampoco obtendrían ningún conocimiento de la estructura de la base de datos subyacente.

Los aspectos negativos de este enfoque son de mantenimiento, debido al hecho de que su mezcla lógica de la aplicación con el sistema de almacenamiento, y puede que no sea a través de plataformas portátiles.

Si desea una solución simple, lo que hafiukuk sugirió que podría ser mejor, simplemente personalícelo para que se ajuste a sus necesidades. Lamentablemente, la secuencia de comandos debe poder acceder a la base de datos, a menos que el servidor web y el servidor de aplicaciones estén en máquinas separadas y se comuniquen a través de algún canal encriptado, como SSH, pero entonces es demasiado complicado. Todo depende de cuán importante es para usted la protección, y qué tan lejos esté dispuesto a hacerlo para garantizarlo.

1

Por desgracia, el código PHP tendrá el nombre de usuario y la contraseña de su sistema MySQL en texto plano. Mi sugerencia es que restrinja los privilegios de ese usuario de la base de datos (está utilizando un usuario de base de datos que no sea root, espero).

Ver http://dev.mysql.com/doc/refman/5.5/en/adding-users.html. Si está utilizando phpmyadmin u otra UI, puede restringir los privilegios de los usuarios de esa manera.

Básicamente, por lo general sólo se quiere otorgar SELECT, UPDATE, INSERT y DELETE para el usuario de MySQL, a menos que su aplicación necesita otros privilegios.

Más allá de eso, es de esperar que alguien más pueda ofrecer una mejor solución.

+0

Gracias por la respuesta, pero el objetivo es evitar que el usuario tenga dificultades o no tenga acceso a la base de datos. Incluso la lectura desde el archivo db se considera una infracción, por lo que el nivel de incumplimiento es el mismo que si alguien eliminara o descartara todo el conjunto de datos. – Furicane

Cuestiones relacionadas