lunes, 17 de octubre de 2016

MySQL: Post-instalación en CentOS 6.x


Hace unas semanas atrás había pecado con la posibilidad de que el administrador del Servidor MySQL que estaba revisando, había creado por descuido y/o negligencia algunos usuarios de acceso total a la base sin asignarles su respectiva clave. De todas formas para explotar este acceso en la DB es necesario estar logueados dentro del Servidor Linux, lo cual no es poco probable que se dé, en entornos multiusuarios.

El otro día me tocó instalar a los tiempos MySQL en CentOS y allí caí en cuenta de que el estado de seguridad, en que por defecto queda nuestro recién instalado RDBMS, no es el ḿás óptimo. Es por ello que el presente documento plantea los pasos posteriores que debemos realizar luego de instalar el motor de base de datos MySQL en CentOS 6.x para obtener un mejor nivel de seguridad al que se proporciona en una instalación por defecto.
  • Nota: Epe me hizo caer en cuenta de que existe un script llamado mysql_secure_installation, el cual me permite realizar las siguientes tareas:
    • Puede establecer una contraseña para la cuenta root.
    • Puede eliminar cuentas root que se puede acceder desde fuera del host local.
    • Puede eliminar cuentas de usuario anónimo.
    • Se puede quitar la base de datos de prueba (que por defecto se puede acceder a todos los usuarios, incluso los usuarios anónimos), y los privilegios que permiten a cualquier persona acceder a bases de datos con nombres que comienzan con test.
    Por lo que bien se podría realizar directamente la ejecución de este script en sustitución a lo que propongo ;)
Manos a la obra:
La instalación típica de MySQL es como la que sigue:
yum -y install mysql-server mysql
chkconfig mysqld on
service mysqld restart
Luego de ello lo primero que deberíamos hacer es colocar clave al usuario root de la base de datos:
mysqladmin -u root password 'LaNuevaClave'
Nos conectamos al Servidor de MySQL a través del cliente de consola, y en este momento ya se nos pedirá la clave que acabamos de fijar:
mysql -u root -p
Realizamos un select sobre la tabla de usuarios y podemos observar todos los usuarios que se han creado con el proceso de instalación:
mysql> select * from mysql.user;
+----------------+------+-------------------------------------------+-------------+-------------+-------------+-------------+--
| Host           | User | Password                                  | Select_priv | Insert_priv | Update_priv | Delete_priv |  
+----------------+------+-------------------------------------------+-------------+-------------+-------------+-------------+--
| localhost      | root | *B7DF5040F512CDFBA7A3ADA6DDF2C4E157746666 | Y           | Y           | Y           | Y           |  
| social.iknaxio | root |                                           | Y           | Y           | Y           | Y           |  
| 127.0.0.1      | root |                                           | Y           | Y           | Y           | Y           |  
| localhost      |      |                                           | N           | N           | N           | N           |  
| social.iknaxio |      |                                           | N           | N           | N           | N           |  
+----------------+------+-------------------------------------------+-------------+-------------+-------------+-------------+--
5 rows in set (0.00 sec)
Se han creado cinco usuarios para permitir conexiones desde los nombre de host locales: localhost, social.iknaxio y 127.0.0.1 

social.iknaxio corresponde al hostname del equipo. Aunque solo los tres primeros usuarios tienen permisos para ejecutar sentencias, lo malo es que solo uno tiene clave (al que le asignamos nosotros mismos), por lo que sería fácil para un usuario de sistema ingresar y ejecutar sentencias con solo usar:
mysql -h 127.0.0.1
Por ello vamos a proceder a eliminar a todos los usuarios 'inseguros':
mysql> delete from mysql.user where not(Host='localhost' and User='root');
Query OK, 4 rows affected (0.00 sec)
Verificando nuevamente la tabla de permisos de usuarios;
mysql> select * from mysql.user;
+-----------+------+-------------------------------------------+-------------+-------------+-------------+-------------+--
| Host      | User | Password                                  | Select_priv | Insert_priv | Update_priv | Delete_priv | 
+-----------+------+-------------------------------------------+-------------+-------------+-------------+-------------+--
| localhost | root | *B7DF5040F512CDFBA7A3ADA6DDF2C4E157746666 | Y           | Y           | Y           | Y           | 
+-----------+------+-------------------------------------------+-------------+-------------+-------------+-------------+--
1 row in set (0.00 sec)
Seguimos ahora con la tabla de permisos de bases de datos;
mysql> select * from mysql.db;
+------+---------+------+-------------+-------------+-------------+-------------+--
| Host | Db      | User | Select_priv | Insert_priv | Update_priv | Delete_priv | 
+------+---------+------+-------------+-------------+-------------+-------------+--
| %    | test    |      | Y           | Y           | Y           | Y           | 
| %    | test\_% |      | Y           | Y           | Y           | Y           |
+------+---------+------+-------------+-------------+-------------+-------------+--
2 rows in set (0.00 sec)
Vamos a eliminar los permisos a la base de pruebas test:
mysql> delete from mysql.db;
Query OK, 2 rows affected (0.00 sec)
Verificamos:
mysql> select * from mysql.db;
Empty set (0.00 sec)
Hacemos un flush de los privilegios, para que se vuelvan a cargar.
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
Y finalmente salimos del cliente de MySQL.
mysql> exit
Espero que les sea de utilidad.

Saludos ;)
"Transporta un puñado de tierra todos los días y construirás una montaña" - Confucio