MySQL se ha convertido en el motor de bases de datos más usado y potente del mundo opensource. Pero debido a la versatilidad que ofrece, la configuración por defecto en los paquetes de distribución y el suyo propio no considera todos los aspectos de seguridad que se han de contemplar en un entorno controlado.

Las siguientes entradas pretenden enumerar brevemente cuales son los puntos más importantes que se deberían revisar en una implantación segura de esta aplicación.

El archivo de configuración de MySQL se encuentra en el archivo: "C:\Program Files\MySQL\MySQL Server 5.x" en el caso de Windows o /etc/mysql/my.cnf en el caso de sistemas Linux.


1.- Restringir o deshabilitar el acceso mediante red: si el servicio se encuentra en el mismo equipo que la aplicación que realiza las consultas no es necesario que mysql escuche peticiones en todos los interfaces de red. Una de las medidas más importantes es dejar únicamente el puerto abierto en aquellas IPs donde sea estrictamente necesario. Para efectuar este cambio y que solo se pueda conectar localmente, en la sección [mysqld] indicar:

[mysqld]
bind-address=127.0.0.1

Si por el contrario queremos deshabilitar por completo el acceso mediante un socket de red, basta con añadir la directiva skip-network:

[mysqld]
skip-networking

Por último, si se ha de utilizar el servicio en remoto, todos los usuarios de las aplicaciones que conecten deben estar limitados mediante su dirección de origen (host). Desde el prompt de mysql:

mysql> GRANT SELECT, INSERT ON basededatos.* TO 'usuario'@'host';



2.- Eliminar el acceso a la tabla "user" de la base de datos a todos los usuarios excepto los de administración: de esta forma otros usuarios del motor no podrán consultar las contraseñas y accesos que contiene MySQL.

Para ver los privilegios de un usuario:

mysql> SHOW GRANTS FOR 'usuario'@'host';

Para eliminar privilegios:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM usuario;


3.- Deshabilitar el uso de LOCAL INFILE: mediante estos permisos se pueden leer ficheros del sistema operativo desde la base de datos, algo común cuando se explota una inyección de código SQL. Para deshabilitar esta función se configura la variable local-infile a 0:

En MySQL anterior a 5.5
[mysqld]
set-variable=local-infile=0

Para MySQL 5.1 o superior:
[mysqld]
local-infile=0


4.- Cambio de nombre de usuario root y su contraseña: al igual que en los sistemas operativos, se recomienda que el administrador de la base de datos no sea el usuario root y mantenga una contraseña segura. Si MySQL es una versión superior a 5.0.2

mysql> RENAME USER root TO r00tz

En caso de que la versión de MySQL sea inferior:

mysql> use mysql;
mysql> update user set user="nuevousuario" where user="root";
mysql> flush privileges;

Para modificar la contraseña de un usuario se puede utilizar el comando mysqladmin o se puede hacer mediante SQL:

mysql> use mysql;
mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');


5.- Eliminar la base de datos "test": que se distribuye con el servicio y no es necesaria. Para hacerlo directamente en SQL:

mysql> drop database test;

O mediante línea de comandos:

shell> mysqladmin -u username -p drop test


6.- Eliminación de cuentas obsoletas y acceso anónimo: que son creadas en algunas instalaciones de MySQL, para comprobar si existen este tipo de usuarios:

mysql> select * from mysql.user where user="";

Si se muestran usuarios, se pueden eliminar mediante DROP USER (en MySQL 5)

mysql> DROP USER "";

Si la versión de MySQL es inferior a 5.0:

mysql> use mysql;
mysql> DELETE FROM user WHERE user="";
mysql> flush privileges;


Referencias:


Publicado por Alejandro Ramos en http://www.securitybydefault.com/2010/08/fortificacion-de-mysql-13.html