Desbloqueando la Seguridad de la Base de Datos MySQL: Mejores Prácticas
MySQL es una de las bases de datos de código abierto más populares que funciona en una variedad de plataformas. Es relativamente fácil de configurar, simple firewall y muestra buenas características de rendimiento incluso bajo una carga significativa, pero aún tiene una amplia variedad de problemas de configuración relevantes para la seguridad.
Mejores Prácticas de Seguridad de la Base de Datos MySQL
La mejor práctica de gestión de seguridad es ser paranoico y anticipar un ataque en cualquier momento desde todas las direcciones, pero si adoptas algunas medidas de precaución, no será tan difícil. Las siguientes pautas te ayudarán a reducir sustancialmente la superficie de posibles amenazas.
En primer lugar, lee las pautas de seguridad en http://dev.mysql.com/doc/refman/5.7/en/security.html y verifica las actualizaciones regularmente. Se han encontrado recientemente varias vulnerabilidades serias para MySQL RDBMS que tienen exploits disponibles libremente. Aprovecha las actualizaciones que añaden nuevas funciones y, lo más importante, corrigen fallos de seguridad.
Monitorea regularmente las bases de datos de vulnerabilidades. Mantente siempre al tanto de las nuevas amenazas encontradas para tu sistema.
Sistema Operativo
- Apaga los demonios y servicios innecesarios. Cuanto menos componentes puedan acceder los atacantes, menos posibilidades tendrán de encontrar un fallo que pueda ser utilizado para acceder al sistema. Manteniendo la configuración del host simple reduces el esfuerzo necesario para gestionar el sistema y mitigar el riesgo de omisiones de seguridad.
- Asegúrate de que los usuarios de MySQL no puedan acceder a archivos fuera de un conjunto limitado de directorios. Los archivos de datos de MySQL no deben ser leídos por ningún usuario excepto las cuentas de root o administrador.
- Deshabilita o restringe el acceso remoto. En caso de que necesites que tu MySQL sea accesible de forma remota, configura la declaración GRANT, que se usa para configurar el usuario, para requerir SSL.
- Asegúrate de que ningún usuario que no sea el usuario de MySQL pueda leer los archivos de configuración y registro de MySQL. Los archivos my.cnf, my.ini y master.info comúnmente tienen nombres de usuario y contraseñas sin cifrar. Si hay un archivo de registro de consultas, es probable que contenga contraseñas también. Algunos archivos de configuración de MySQL también pueden contener nombres de usuario y contraseñas en texto claro. Asegúrate de que estos archivos estén protegidos contra usuarios no deseados.
- Ejecuta MySQL con la opción –chroot. Proporciona una excelente mitigación al poder del privilegio de archivo. Chroot se utiliza para restringir el acceso a archivos por parte de un proceso a un directorio dado. Incluso con la opción chroot, un atacante que obtenga privilegios de archivo podrá leer todos los datos de MySQL y probablemente aún podrá ejecutar UDF’s.
- Borra regularmente tu archivo .mysql_history o enlázalo permanentemente a /dev/null. Por defecto, en sistemas Unix, encontrarás un archivo .mysql_history en tu directorio de inicio. Contiene un registro con todas las consultas que has escrito en el cliente de línea de comandos de MySQL. Ejecuta el siguiente comando para borrar el historial:
cat /dev/null > ~/.mysql_history
Usuarios
Después de configurar el sistema operativo, necesitas construir un modelo de privilegios y asignar cuentas de usuario.
- Durante la fase de configuración inicial, elimina todos los usuarios no-root de MySQL, para que sepas dónde te encuentras en términos de usuarios que tienen acceso a la base de datos. La mejor manera es empezar desde cero y crear usuarios a medida que los necesites.
- Cambia el nombre de usuario root y cambia la contraseña usando diferentes números y caracteres. Puedes cambiar el nombre de usuario del administrador con el siguiente comando en la consola de MySQL:
mysql> RENAME USER root TO nuevo_nombre;
- No otorgues privilegios de cuenta que realmente no necesiten, especialmente File_priv, Grant_priv y Super_priv. Considera crear una cuenta de MySQL separada que tu aplicación pueda usar para interactuar con el sistema de archivos dentro de MySQL. Ten en cuenta que este usuario tendrá acceso a todos los datos de MySQL, incluidas las contraseñas hashed.
- Si es posible, crea un usuario de MySQL para cada aplicación web o para cada rol dentro de cada aplicación web. Dentro de esta aplicación, asigna privilegios de usuario solo para los comandos requeridos. Puede parecer tedioso, pero tiene sentido cuando se trata de establecer un sistema de seguridad integral.
- En caso de que se habiliten las conexiones remotas, especifica REQUIRE SSL en la declaración GRANT utilizada para configurar el usuario. Algunos scripts de exploits no funcionarán ya que no tienen soporte SSL. Además, el protocolo SSL garantiza la confidencialidad de una secuencia de respuesta de contraseña. También puedes establecer restricciones basadas en un certificado del lado del cliente que se utiliza para autenticar con SSL. Otra medida de seguridad útil, el conocimiento de una contraseña no será suficiente, también se requerirá un certificado especificado.
- No le des a nadie acceso a la tabla mysql.user (excepto a los usuarios con privilegios de root).
Configuración de MySQL
- Deshabilita el comando LOAD DATA LOCAL INFILE. Es una construcción que ayuda a importar archivos locales en una tabla, tiene una peculiaridad que bajo ciertas circunstancias puede llevar a la recuperación del contenido del archivo /etc/passwd. El exploit para esto ha estado disponible libremente desde 2013. Agrega set-variable=local-infile=0 al archivo my.cnf.
- Deshazte de cualquier UDF no utilizada. Las UDF también representan amenazas para la seguridad de la base de datos. Si ves UDF no utilizadas en la tabla mysql.func, elimínalas.
- Si estás utilizando solo conexiones locales y no hay necesidad de que los hosts remotos se conecten a MySQL, deshabilita las conexiones TCP/IP mediante la opción –skip-networking.
- Elimina la base de datos de prueba. Hay una base de datos de prueba por defecto a la que puede acceder cualquiera. Elimínala o restringe los privilegios.
- Elimina las cuentas anónimas. No dejes usuarios con contraseñas en blanco.
Puedes encontrar usuarios anónimos con este comando:
select * from mysql.user where user=””;
- Asegúrate de que el tráfico de MySQL esté cifrado.
- Habilita el registro mediante la opción –log. Según la documentación de MySQL, el “registro general de consultas” es una característica de depuración, pero también puedes usarlo como una medida de seguridad. Registra conexiones exitosas y consultas ejecutadas. Por defecto, el registro de consultas está deshabilitado, puedes activarlo usando la opción –log.
Ten en cuenta que los registros de consultas y los registros de errores son una fuente de información para un atacante también. Asegúrate de que el archivo de registro sea visible solo para el administrador o la cuenta root del sistema. Además, no registra los resultados de las consultas y datos recuperados, pero existen soluciones especiales de monitoreo de actividad de bases de datos para ese propósito.
Monitorea regularmente los registros de consultas y busca ataques de inyección SQL y uso de la sintaxis load_file, infile y outfile del sistema de archivos.
Instala software antivirus y antispam. Despliega un firewall para controlar el tráfico entrante y saliente de la red y proteger contra ataques.
El sistema integral de seguridad de bases de datos MySQL se construye combinando una gran cantidad de cambios de configuración discretos. Cada detalle es importante. No hay manera de garantizar un 100% de seguridad, pero la búsqueda de la máxima protección es una obligación en la era de los delitos cibernéticos.