Mejores Prácticas de Seguridad en MySQL

MySQLBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a mejorar la seguridad de su base de datos MySQL. Cubriremos las mejores prácticas de seguridad esenciales, que incluyen establecer una contraseña para el usuario root, crear usuarios dedicados según el principio de menor privilegio, administrar permisos de usuario y eliminar cuentas anónimas. Al final de este laboratorio, tendrá una mejor comprensión de cómo proteger su servidor MySQL de vulnerabilidades comunes.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 94%. Ha recibido una tasa de reseñas positivas del 89% por parte de los estudiantes.

Asegurar la Cuenta Root

Una instalación predeterminada de MySQL a menudo permite que el usuario root se conecte sin contraseña desde la máquina local. Su primer paso para asegurar MySQL es establecer una contraseña segura para la cuenta root.

Primero, abra la terminal desde su escritorio.

Conéctese al servidor MySQL como usuario root. En este entorno de laboratorio, puede usar sudo para conectarse sin contraseña.

sudo mysql -u root

Una vez conectado, verá el prompt de MySQL (mysql>).

Ahora, establezca una contraseña para el usuario root. La sentencia ALTER USER se utiliza para modificar cuentas de usuario. Reemplace YourStrongPassword! con una contraseña de su elección.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword!';

Este comando establece una contraseña para el usuario root al conectarse desde localhost. Debería ver la siguiente salida, confirmando que el comando fue exitoso:

Query OK, 0 rows affected (0.01 sec)

A continuación, aplique los cambios de privilegios inmediatamente usando el comando FLUSH PRIVILEGES.

FLUSH PRIVILEGES;

La salida será:

Query OK, 0 rows affected (0.00 sec)

Ahora ha establecido con éxito una contraseña para el usuario root. Si bien aún puede usar sudo mysql -u root para conectarse, cualquier intento de conexión directa con mysql -u root -p ahora requerirá la contraseña que acaba de establecer. Este es un primer paso crítico para asegurar su base de datos.

Crear un Usuario y Base de Datos Dedicados

Usar la cuenta root para aplicaciones es un riesgo de seguridad porque tiene permisos ilimitados. Una buena práctica es crear usuarios dedicados con privilegios limitados para cada aplicación. En este paso, creará una nueva base de datos y un usuario con acceso solo a esa base de datos.

Ahora, cree una nueva base de datos para su aplicación. La llamaremos app_db.

CREATE DATABASE app_db;

Debería ver esta confirmación:

Query OK, 1 row affected (0.01 sec)

A continuación, cree un nuevo usuario que su aplicación utilizará para conectarse a la base de datos. Llamaremos a este usuario app_user y le asignaremos una contraseña.

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'UserPassword123';

La salida será:

Query OK, 0 rows affected (0.01 sec)

Ahora, otorgue los privilegios necesarios a app_user. Para este ejemplo, otorgaremos permisos SELECT e INSERT en todas las tablas dentro de la base de datos app_db. Esto sigue el principio de menor privilegio, dando al usuario solo los permisos que necesita.

GRANT SELECT, INSERT ON app_db.* TO 'app_user'@'localhost';

Aplique los cambios vaciando los privilegios.

FLUSH PRIVILEGES;

Puede verificar los privilegios que acaba de otorgar ejecutando:

SHOW GRANTS FOR 'app_user'@'localhost';

La salida mostrará los permisos exactos para app_user:

+------------------------------------------------------------------+
| Grants for app_user@localhost                                    |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                     |
| GRANT SELECT, INSERT ON `app_db`.* TO `app_user`@`localhost`     |
+------------------------------------------------------------------+
2 rows in set (0.00 sec)

Ha creado con éxito una base de datos y un usuario dedicados con los permisos apropiados.

Gestionar Privilegios de Usuario

Los requisitos de las aplicaciones pueden cambiar, y es posible que necesite ajustar los permisos de los usuarios en consecuencia. En este paso, practicará la modificación de privilegios revocando un permiso existente del app_user.

Supongamos que app_user ahora solo debe poder leer datos (SELECT) pero no agregar nuevos datos (INSERT). Necesita revocar el privilegio INSERT.

Utilice la sentencia REVOKE para eliminar el privilegio INSERT de app_user en la base de datos app_db.

REVOKE INSERT ON app_db.* FROM 'app_user'@'localhost';

Verá la siguiente confirmación:

Query OK, 0 rows affected (0.00 sec)

Aplique los cambios vaciando los privilegios.

FLUSH PRIVILEGES;

Ahora, verifique que el privilegio ha sido revocado revisando nuevamente las concesiones del usuario.

SHOW GRANTS FOR 'app_user'@'localhost';

La salida ahora debería mostrar que app_user solo tiene el privilegio SELECT en app_db. El privilegio INSERT ha desaparecido.

+--------------------------------------------------------------+
| Grants for app_user@localhost                                |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                 |
| GRANT SELECT ON `app_db`.* TO `app_user`@`localhost`         |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)

Esto demuestra cómo gestionar eficazmente los permisos de los usuarios para adaptarse a los requisitos de seguridad cambiantes.

Eliminar Cuentas de Usuario Anónimas

Por defecto, algunas instalaciones de MySQL crean cuentas de usuario anónimas, que tienen un nombre de usuario vacío. Estas cuentas representan un riesgo de seguridad porque pueden permitir acceso no autorizado. Es una práctica de seguridad crítica verificar y eliminarlas si existen.

Puede identificar usuarios anónimos consultando la tabla mysql.user en busca de entradas con un nombre de usuario en blanco.

SELECT User, Host FROM mysql.user WHERE User = '';

Si existen usuarios anónimos, esta consulta los listará. Una instalación nueva en Ubuntu podría incluir uno, pero las versiones más recientes de MySQL/MariaDB a menudo no tienen usuarios anónimos por defecto.

Si ve resultados como:

+------+-----------+
| User | Host      |
+------+-----------+
|      | localhost |
+------+-----------+
1 row in set (0.00 sec)

Entonces debería eliminar el usuario anónimo con la sentencia DROP USER, especificando tanto el nombre de usuario (que es una cadena vacía '') como el host:

DROP USER ''@'localhost';

Debería ver esta confirmación:

Query OK, 0 rows affected (0.01 sec)

Sin embargo, si su consulta devuelve un conjunto vacío como:

Empty set (0.00 sec)

Esto significa que no hay usuarios anónimos en su base de datos, lo cual ya es seguro. En este caso, si intenta eliminar un usuario anónimo inexistente, obtendrá un error:

ERROR 1396 (HY000): Operation DROP USER failed for ''@'localhost'

Este error es esperado si no existe ningún usuario anónimo, y puede proceder con seguridad.

Después de verificar la existencia de usuarios anónimos y eliminarlos si es necesario, vacíe los privilegios para asegurar que se apliquen los cambios:

FLUSH PRIVILEGES;

Verifique nuevamente que no queden usuarios anónimos ejecutando la consulta SELECT:

SELECT User, Host FROM mysql.user WHERE User = '';

Esta consulta debería devolver un conjunto vacío, confirmando que no existen usuarios anónimos:

Empty set (0.00 sec)

Ha verificado y abordado con éxito una posible vulnerabilidad de seguridad en su servidor. Ahora puede salir del shell de MySQL.

exit;

Resumen

En este laboratorio, ha aprendido y aplicado varias prácticas recomendadas esenciales de seguridad en MySQL. Ha asegurado con éxito la cuenta root con una contraseña, ha creado un usuario de aplicación dedicado con permisos limitados basado en el principio de menor privilegio, ha gestionado el acceso de los usuarios revocando privilegios y ha verificado y abordado posibles cuentas de usuario anónimas.

Al implementar estas medidas de seguridad fundamentales, puede mejorar significativamente la postura de seguridad de su base de datos MySQL y protegerla del acceso no autorizado y de posibles amenazas.