Las 7 Mejores Prácticas de Seguridad de MySQL para Proteger Su Base de Datos

Siete comprobaciones prácticas de seguridad de MySQL para control de acceso, exposición de red, TLS, parches, registro y cifrado.

Las 7 mejores prácticas de seguridad de MySQL para proteger tu base de datos

La seguridad de MySQL comienza con reducir quién puede conectarse, qué pueden hacer y qué queda expuesto si un host se ve comprometido. Las siete comprobaciones a continuación te brindan una base práctica para bases de datos en producción, sin pretender que una sola configuración pueda hacer que MySQL sea "seguro".

1. Gestión segura del acceso de usuarios

Controlar quién puede acceder a tu base de datos y qué puede hacer es la primera línea de defensa. Esto implica crear cuentas de usuario específicas con el principio de mínimo privilegio, lo que significa que los usuarios solo deben tener los permisos necesarios para realizar sus tareas.

Crear cuentas seguras

Evita usuarios de aplicaciones compartidos y contraseñas débiles. Usa mysql_secure_installation en servidores autogestionados para eliminar usuarios anónimos, eliminar la base de datos de prueba cuando corresponda y ajustar la configuración inicial de la cuenta root.

Otorgar privilegios mínimos

Usa sentencias GRANT para la base de datos, tabla y acciones específicas que tu aplicación necesita. Evita ALL PRIVILEGES para cuentas de aplicaciones.

Ejemplo:

CREATE USER 'webapp_user'@'10.0.10.%' IDENTIFIED BY 'use-a-real-secret-here';

GRANT SELECT, INSERT, UPDATE ON mydatabase.* TO 'webapp_user'@'10.0.10.%';

No necesitas FLUSH PRIVILEGES después de sentencias normales CREATE USER o GRANT. MySQL actualiza las tablas de permisos automáticamente para esas sentencias.

Audita las cuentas regularmente:

SELECT user, host, account_locked FROM mysql.user ORDER BY user, host;
SHOW GRANTS FOR 'webapp_user'@'10.0.10.%';

2. Restringir el acceso a la red

Limita las rutas de red hacia MySQL. El valor predeterminado efectivo depende de tu versión de MySQL y paquete, por lo que debes inspeccionar tu servidor en ejecución en lugar de asumir que solo escucha localmente.

Verifica los listeners:

ss -ltnp | grep 3306

Vincula MySQL a localhost cuando solo los clientes locales necesiten acceso:

[mysqld]
bind-address = 127.0.0.1

Si los servidores de aplicaciones se conectan de forma remota, vincula a la interfaz privada y usa grupos de seguridad, firewalls o ACL de red para permitir solo esas fuentes al puerto 3306.

3. Usar TLS para las conexiones

Cifrar los datos en tránsito evita la interceptación y los ataques de intermediario. MySQL admite cifrado SSL/TLS para conexiones cliente-servidor.

La configuración del servidor comúnmente se ve así:

[mysqld]
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem

Ejemplo de cliente:

mysql -h your_host -u your_user -p --ssl-mode=REQUIRED

Para una verificación más estricta, usa --ssl-mode=VERIFY_IDENTITY con un nombre de host que coincida con el certificado. REQUIRED cifra la conexión pero no verifica la identidad del servidor de manera tan sólida.

4. Mantener MySQL actualizado

Las vulnerabilidades de software se descubren y parchean con frecuencia. Ejecutar una versión desactualizada de MySQL puede exponer tu base de datos a exploits conocidos.

Sigue la rama de lanzamiento que ejecutas, aplica actualizaciones de seguridad y prueba las actualizaciones en un entorno de staging antes de producción. Si usas un servicio de base de datos administrado, revisa la política de mantenimiento del proveedor y establece una ventana de mantenimiento que tu equipo realmente supervise.

5. Reforzar la configuración del servidor MySQL

Además de la vinculación de red, varias otras opciones de configuración pueden mejorar la seguridad.

Deshabilita local_infile a menos que tus aplicaciones necesiten LOAD DATA LOCAL INFILE:

[mysqld]
local_infile = 0

Mantén los archivos de configuración, las claves TLS y las credenciales de respaldo legibles solo por los usuarios del sistema adecuados. También revisa los plugins instalados y elimina aquellos que no uses.

6. Auditar y monitorear registros

El registro es crucial para detectar actividad sospechosa y para el análisis forense después de un incidente de seguridad.

MySQL Enterprise incluye un plugin de registro de auditoría. Las implementaciones comunitarias a menudo usan registros del sistema operativo, registros de errores, registros de proxy, funciones de auditoría de bases de datos en la nube o plugins de auditoría de terceros, según tu entorno.

Como mínimo, monitorea:

  • Inicios de sesión fallidos y errores de autenticación.
  • Nuevos usuarios, cambios en permisos y sentencias privilegiadas.
  • Conexiones desde hosts inesperados.
  • Fallos en trabajos de respaldo y fallos en pruebas de restauración.

No dejes habilitado el registro de consultas general en un servidor de producción ocupado a menos que tengas una necesidad específica de solución de problemas a corto plazo. Puede generar una E/S pesada y puede capturar valores de consultas sensibles.

7. Proteger los datos en reposo

Mientras que SSL/TLS protege los datos en tránsito, cifrar los datos en reposo los protege si el almacenamiento subyacente se ve comprometido.

Usa cifrado de almacenamiento o volumen para la línea base amplia. Para campos sensibles, considera el cifrado a nivel de aplicación para que la base de datos no contenga todo lo necesario para descifrar los datos.

MySQL también tiene funciones de cifrado como AES_ENCRYPT() y AES_DECRYPT(), pero no codifiques las claves en SQL ni las almacenes junto a los datos.

Ejemplo simplificado:

UPDATE users
SET sensitive_data = AES_ENCRYPT('user_private_info', @encryption_key)
WHERE user_id = 1;

SELECT AES_DECRYPT(sensitive_data, @encryption_key)
FROM users
WHERE user_id = 1;

Usa un proceso adecuado de gestión de claves para sistemas reales. El cifrado sin rotación de claves, control de acceso y copias de seguridad del material de claves puede convertir un incidente recuperable en una pérdida permanente de datos.

Conclusión

Comienza con los controles que eliminan la mayor parte del riesgo: usuarios con privilegios mínimos, acceso de red privado, TLS, parches y copias de seguridad probadas. Luego agrega registro de auditoría y controles de cifrado que coincidan con tu modelo de cumplimiento y amenazas. Revisa la configuración después de cada cambio importante en el esquema, la infraestructura o el acceso.