12 prácticas recomendadas de seguridad de MySQL/MariaDB para Linux


MySQL es el sistema de base de datos de código abierto más popular del mundo y MariaDB (una bifurcación de MySQL) es el sistema de base de datos de código abierto de más rápido crecimiento en el mundo. Después de instalar el servidor MySQL, no es seguro en su configuración predeterminada y asegurarlo es una de las tareas esenciales en la administración general de bases de datos.

Esto contribuirá a fortalecer y aumentar la seguridad general del servidor Linux, ya que los atacantes siempre escanean las vulnerabilidades en cualquier parte de un sistema, y las bases de datos han sido en el pasado áreas de objetivo clave. Un ejemplo común es el uso de la fuerza bruta de la contraseña de root para la base de datos MySQL.

En esta guía, explicaremos las prácticas recomendadas de seguridad de MySQL/MariaDB útiles para Linux.

1. Instalación segura de MySQL

Este es el primer paso recomendado después de instalar el servidor MySQL, para proteger el servidor de la base de datos. Este script facilita la mejora de la seguridad de su servidor MySQL al pedirle que:

  • establezca una contraseña para la cuenta raíz, si no la estableció durante la instalación.
  • deshabilite el inicio de sesión de usuario raíz remoto eliminando las cuentas raíz a las que se puede acceder desde fuera del host local.
  • elimine las cuentas de usuarios anónimos y la base de datos de prueba a la que todos los usuarios pueden acceder de forma predeterminada, incluso los usuarios anónimos.

# mysql_secure_installation

Después de ejecutarlo, configure la contraseña de root y responda la serie de preguntas ingresando [Yes/Y] y presione [Enter].

2. Vincular el servidor de la base de datos a la dirección de bucle invertido

Esta configuración restringirá el acceso desde máquinas remotas, le dice al servidor MySQL que solo acepte conexiones desde dentro del localhost. Puede configurarlo en el archivo de configuración principal.

# vi /etc/my.cnf	                   [RHEL/CentOS]	
# vi /etc/mysql/my.conf                    [Debian/Ubuntu] 
OR
# vi /etc/mysql/mysql.conf.d/mysqld.cnf    [Debian/Ubuntu] 

Agregue la siguiente línea debajo de la sección [mysqld] .

bind-address = 127.0.0.1

3. Deshabilite LOCAL INFILE en MySQL

Como parte del fortalecimiento de la seguridad, debe deshabilitar local_infile para evitar el acceso al sistema de archivos subyacente desde MySQL utilizando la siguiente directiva en la sección [mysqld] .

local-infile=0

4. Cambiar el puerto predeterminado de MYSQL

La variable Port establece el número de puerto MySQL que se utilizará para escuchar en conexiones TCP/IP. El número de puerto predeterminado es 3306 pero puede cambiarlo en la sección [mysqld] como se muestra.

Port=5000

5. Habilite el registro de MySQL

Los registros son una de las mejores formas de comprender lo que sucede en un servidor; en caso de cualquier ataque, puede ver fácilmente cualquier actividad relacionada con intrusiones desde los archivos de registro. Puede habilitar el registro de MySQL agregando la siguiente variable en la sección [mysqld] .

log=/var/log/mysql.log

6. Establezca el permiso apropiado en archivos MySQL

Asegúrese de tener los permisos adecuados establecidos para todos los archivos y directorios de datos del servidor mysql. El archivo /etc/my.conf solo debe poder escribirse en root. Esto impide que otros usuarios cambien las configuraciones del servidor de bases de datos.

# chmod 644 /etc/my.cnf

7. Eliminar el historial de shell de MySQL

Todos los comandos que ejecuta en el shell MySQL son almacenados por el cliente mysql en un archivo histórico: ~/.mysql_history. Esto puede ser peligroso, porque para cualquier cuenta de usuario que cree, todos los nombres de usuario y contraseñas escritos en el shell se registrarán en el archivo de historial.

# cat /dev/null > ~/.mysql_history

8. No ejecute comandos de MySQL desde la línea de comandos

Como ya sabe, todos los comandos que escribe en la terminal se almacenan en un archivo de historial, dependiendo del shell que esté utilizando (por ejemplo, ~/.bash_history para bash). Un atacante que logre acceder a este archivo histórico puede ver fácilmente las contraseñas registradas allí.

No se recomienda encarecidamente escribir contraseñas en la línea de comandos, algo como esto:

# mysql -u root -ppassword_

Cuando revise la última sección del archivo de historial de comandos, verá la contraseña escrita arriba.

# history 

La forma adecuada de conectar MySQL es.

# mysql -u root -p
Enter password:

9. Definir usuarios de bases de datos específicos de la aplicación

Para cada aplicación que se ejecute en el servidor, solo dé acceso a un usuario que esté a cargo de una base de datos para una aplicación determinada. Por ejemplo, si tiene un sitio de WordPress, cree un usuario específico para la base de datos del sitio de WordPress de la siguiente manera.

# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE osclass_db;
MariaDB [(none)]> CREATE USER 'osclassdmin'@'localhost' IDENTIFIED BY '[email protected]%!2';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON osclass_db.* TO 'osclassdmin'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit

y recuerde eliminar siempre las cuentas de usuario que ya no administren ninguna base de datos de aplicaciones en el servidor.

10. Utilice bibliotecas y complementos de seguridad adicionales

MySQL incluye una serie de complementos de seguridad para: autenticar los intentos de los clientes de conectarse al servidor mysql, validar la contraseña y proteger el almacenamiento de información confidencial, todos disponibles en la versión gratuita.

Puede encontrar más aquí: https://dev.mysql.com/doc/refman/5.7/en/security-plugins.html

11. Cambie las contraseñas de MySQL con regularidad

Este es un consejo de seguridad de información/aplicación/sistema común. La frecuencia con la que lo haga dependerá por completo de su política de seguridad interna. Sin embargo, puede evitar que los "fisgones" que hayan estado rastreando su actividad durante un largo período de tiempo obtengan acceso a su servidor mysql.

MariaDB [(none)]> USE mysql;
MariaDB [(none)]> UPDATE user SET password=PASSWORD('YourPasswordHere') WHERE User='root' AND Host = 'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

12. Actualice el paquete del servidor MySQL con regularidad

Se recomienda encarecidamente actualizar los paquetes mysql/mariadb con regularidad para mantenerse al día con las actualizaciones de seguridad y las correcciones de errores, desde el repositorio del proveedor. Normalmente, los paquetes de los repositorios predeterminados del sistema operativo están desactualizados.

# yum update
# apt update

Después de realizar cualquier cambio en el servidor mysql/mariadb, siempre reinicie el servicio.

# systemctl restart mariadb		#RHEL/CentOS
# systemctl restart mysql		#Debian/Ubuntu

¡Eso es todo! Nos encanta saber de usted a través del formulario de comentarios a continuación. Comparta con nosotros cualquier consejo de seguridad de MySQL/MariaDB que falte en la lista anterior.