DataSunrise Logra el Estado de Competencia en AWS DevOps en AWS DevSecOps y Monitoreo, Registro, Rendimiento

Desbloqueando la Seguridad de la Base de Datos MySQL

Desbloqueando la Seguridad de la Base de Datos MySQL

MySQL es una de las bases de datos de código abierto más populares que se ejecuta en una variedad de plataformas. Es relativamente fácil de configurar, cuenta con un firewall sencillo y muestra buenas características de rendimiento incluso bajo carga significativa, pero aún presenta una amplia variedad de problemas de configuración relevantes para la seguridad.

Mejores Prácticas de Seguridad en la Base de Datos MySQL

La mejor práctica en la gestión de la 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á un trabajo tan arduo. Las siguientes directrices 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 regularmente si hay actualizaciones. Recientemente se han encontrado varias vulnerabilidades graves en el RDBMS MySQL, para las cuales existen exploits disponibles libremente. Aprovecha las actualizaciones que añaden nuevas funciones y, lo que es más importante, corrigen fallas de seguridad.

Monitorea regularmente las bases de datos de vulnerabilidades. Mantente siempre al tanto de las nuevas amenazas encontradas para tu sistema.

Sistema Operativo

  1. Desactiva los demonios y servicios innecesarios. Cuantos menos componentes puedan ser accedidos por atacantes, menor será la probabilidad de que encuentren una falla que pueda ser utilizada para acceder al sistema. Al mantener la configuración del host simple, reduces el esfuerzo necesario para gestionar el sistema y mitigar el riesgo de omisiones de seguridad.
  2. 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 deberían ser leídos por ningún usuario salvo por las cuentas de root o administrador.
  3. Deshabilita o restringe el acceso remoto. En caso de que necesites que tu MySQL sea accesible de forma remota, configura la sentencia GRANT, que se utiliza para establecer el usuario, para requerir SSL.
  4. Asegúrate de que ningún usuario que no sea el usuario de MySQL pueda leer los archivos de configuración y registros de MySQL. Los archivos my.cnf, my.ini y master.info comúnmente contienen nombres de usuario y contraseñas sin cifrar. Si existe un archivo de registro de consultas, es probable que contenga contraseñas también. Algunos archivos de configuración de MySQL pueden contener nombres de usuario y contraseñas en texto plano. Asegúrate de que estos archivos estén protegidos contra usuarios no deseados.
  5. Ejecuta MySQL con la opción –chroot. Esta opción proporciona una excelente mitigación contra el poder del privilegio de archivos. Chroot se utiliza para restringir el acceso de un proceso a un directorio dado. Incluso con la opción chroot, un atacante que obtenga privilegios sobre archivos podrá leer todos los datos de MySQL y probablemente aún podrá ejecutar UDF’s.
  6. Limpia regularmente tu archivo .mysql_history o enlázalo de forma permanente a /dev/null. Por defecto, en sistemas Unix encontrarás un archivo .mysql_history en tu directorio personal. Este contiene un registro de todas las consultas que has introducido en el cliente de línea de comandos de MySQL. Ejecuta el siguiente comando para limpiar el historial:
cat /dev/null > ~/.mysql_history

Usuarios

Después de configurar el sistema operativo, necesitas construir un modelo de privilegios y asignar las cuentas de usuario.

  1. Durante la fase inicial de configuración, elimina todos los usuarios de MySQL que no sean root, para saber exactamente quién tiene acceso a la base de datos. La mejor forma es comenzar desde cero y crear usuarios según los necesites.
  2. Renombra el nombre de usuario root y cambia la contraseña utilizando 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 new_name;
  3. No otorgues a las cuentas privilegios que realmente no necesiten, especialmente File_priv, Grant_priv y Super_priv. Considera crear una cuenta 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, incluidos los hash de contraseñas.
  4. Si es posible, crea un usuario 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 únicamente para los comandos requeridos. Puede parecer tedioso, pero tiene sentido a la hora de establecer un sistema de seguridad integral.
  5. En caso de que se habiliten conexiones remotas, especifica REQUIRE SSL en la sentencia GRANT utilizada para configurar el usuario. Algunos scripts de explotación no funcionarán, ya que carecen de soporte para 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 autenticarse con SSL. Otra medida de seguridad útil es que, además de conocer la contraseña, se requerirá un certificado específico.
  6. No permitas a nadie el acceso a la tabla mysql.user (excepto a los usuarios con privilegios de root).

Configuración de MySQL

  1. Deshabilita el comando LOAD DATA LOCAL INFILE. Se trata de una construcción que ayuda a importar archivos locales a una tabla, pero tiene la peculiaridad de 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.
  2. Elimina cualquier UDF no utilizada. Las UDF también representan amenazas para la seguridad de la base de datos. Si observas UDF no usadas en la tabla mysql.func, elimínalas.
  3. Si solo utilizas conexiones locales y no es necesario que hosts remotos se conecten a MySQL, deshabilita las conexiones TCP/IP mediante la opción –skip-networking.
  4. Elimina la base de datos de prueba. Por defecto existe una base de datos de prueba que puede ser accedida por cualquier usuario. Elíminala o restringe sus privilegios.
  5. 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=””;
  6. Asegúrate de que el tráfico de MySQL esté cifrado.
  7. Habilita el registro mediante la opción –log. Según la documentación de MySQL, el “registro general de consultas” es una función de depuración, pero también puedes usarlo como medida de seguridad. Registra las conexiones exitosas y las consultas ejecutadas. Por defecto, el registro de consultas está deshabilitado, pero puedes activarlo usando la opción –log.

Ten en cuenta que los registros de consultas y de errores son también una fuente de información para un atacante. Asegúrate de que el archivo de registro sea visible únicamente para el administrador o la cuenta root del sistema. Además, no registra los resultados de las consultas ni los datos recuperados, pero existen soluciones especiales de monitoreo de la actividad de la base de datos para ello.

Monitorea regularmente los registros de consultas y busca ataques de inyección SQL y el uso de la sintaxis del sistema de archivos load_file, infile y outfile.

Instala software antivirus y antispam. Despliega un firewall para controlar el tráfico de red entrante y saliente y protegerte de ataques.

Un sistema integral de seguridad para la base de datos MySQL se construye combinando una gran cantidad de cambios de configuración imperceptibles. Cada detalle es importante. No existe forma de garantizar una seguridad del 100%, pero la búsqueda de la máxima protección es imprescindible en la era de los cibercrímenes.

Siguiente

Interfaz de Línea de Comandos Fácil

Interfaz de Línea de Comandos Fácil

Más información

¿Necesita la ayuda de nuestro equipo de soporte?

Nuestros expertos estarán encantados de responder a sus preguntas.

Información general:
[email protected]
Servicio al Cliente y Soporte Técnico:
support.datasunrise.com
Consultas sobre Asociaciones y Alianzas:
[email protected]