MySQL
MySQL es un sistema de gestión de bases de datos relacionales de código abierto. Esta guía le mostrará cómo proteger y auditar un servidor MySQL. El nombre es una combinación de "My", el nombre de la hija del cofundador Michael Widenius, y "SQL", la abreviatura de Structured Query Language.
Antes de comenzar
-
Asegúrese de haber seguido las guías Primeros pasos y Protección de su servidor. Asegúrese de que el nombre de host de Linode esté configurado.
Verifique el nombre de host de su Linode. El primer comando debe mostrar su nombre de host abreviado y el segundo debe mostrar su nombre de dominio completo (FQDN).
hostname hostname -f
Nota Si tiene un nombre de dominio registrado para su sitio web, agregue el dominio al servidor Linode en el que planea instalar la pila LAMP. Si no tiene un nombre de dominio registrado, reemplace
example.com
con la dirección IP del servidor Linode en las siguientes instrucciones. -
Actualice su sistema:
sudo yum update
Nota Esta guía está escrita para un usuario no root. Los comandos que requieren privilegios elevados tienen el prefijo
sudo
. Si no está familiarizado consudo
comando, puede consultar nuestra guía de Usuarios y Grupos. -
Para proteger y auditar MySQL, debe tener un servidor Linux con el
MySQL Server
servicios funcionando. Para obtener información sobre la instalación de MySQL, consulte Instalar MySQLNota Las instrucciones de esta guía se basan en Ubuntu 18.04, aunque todos los pasos son independientes de la distribución con la excepción de los nombres de los paquetes y los administradores de paquetes.
Uso del instalador seguro de MySQL
El paquete mysql-server viene preconfigurado con una utilidad llamada mysql_secure_installation
que se utiliza para configurar un punto de partida seguro para el servidor MySQL, eliminando usuarios anónimos y permitiéndole especificar la política de seguridad de contraseña deseada.
mysql_secure_installation
es un script de shell disponible en los sistemas Unix y le permite asegurar la instalación de MySQL permitiéndole:
- establecer una contraseña para las cuentas raíz
- eliminar las cuentas raíz a las que se puede acceder desde fuera del host local
- eliminar cuentas de usuarios anónimos
- eliminar la base de datos de prueba, a la que pueden acceder de forma predeterminada los usuarios anónimos
Comience el proceso de seguridad ejecutando esta utilidad inmediatamente después de instalar mysql-server.
-
Invoque la utilidad ejecutando el siguiente comando:
sudo mysql_secure_installation
-
Comienza el proceso de configuración y la utilidad le solicita que especifique si desea habilitar el complemento de validación de contraseña que se utiliza para probar contraseñas y mejorar la seguridad. Se recomienda habilitar esta función.
Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD PLUGIN can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD plugin? Press y|Y for Yes, any other key for No: y
-
Después de habilitar el complemento de contraseña, especifique su política de validación de contraseñas según el nivel de seguridad de las contraseñas deseadas.
There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2 Please set the password for root here. New password: Re-enter new password: Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
-
Eliminar usuarios anónimos. Esta es una opción de seguridad importante, ya que los atacantes pueden aprovechar a los usuarios anónimos para obtener acceso al servidor de la base de datos.
By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
-
Deshabilite el inicio de sesión raíz de forma remota, esta es una configuración de seguridad extremadamente importante, ya que evita que los atacantes se autentiquen de forma remota en el servidor MySQL como raíz o realicen ataques de fuerza bruta de contraseña. La autenticación remota también se puede deshabilitar por completo, veremos cómo hacerlo en la siguiente sección.
Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
-
Elimine la base de datos de prueba creada durante el proceso de instalación del servidor mysql, esta base de datos se crea con fines de prueba, como buena práctica, se recomienda eliminar esta base de datos.
By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
-
Vuelva a cargar las tablas de privilegios para asegurarse de que todos los cambios se apliquen y tengan efecto.
Ahora tiene una base segura para trabajar, en la siguiente sección, encuentre las instrucciones para cambiar la raíz predeterminada nombre de usuario y contraseña.Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y Success. All done!
Modificando el usuario “raíz”
Por defecto, el servidor MySQL viene predefinido con un superuser/admin
cuenta que tiene acceso a todos los privilegios y funcionalidades de las bases de datos y usuarios de bases de datos. Dado este control y acceso incomparables, es importante bloquear y proteger la cuenta raíz, ya que los atacantes suelen apuntar a la cuenta raíz en un servidor MySQL porque tiene el potencial de proporcionar acceso completo a las bases de datos y a los usuarios de las bases de datos.
El primer paso para proteger al usuario "raíz" es cambiar el nombre de usuario de root
a algo más inflexible, el objetivo es hacer que el nombre de usuario raíz sea tan difícil de adivinar o de fuerza bruta para los atacantes. Después de lo cual, también se recomienda cambiar la root
contraseña de la cuenta regularmente como una buena práctica.
-
Inicie sesión en el servidor MySQL con el siguiente comando:
sudo mysql -u root
-
Cambie el nombre de usuario de la cuenta "raíz" ejecutando la siguiente consulta:
rename user 'root'@'localhost' to '<new-username>'@'localhost';
-
Cambiar la
root
contraseña de la cuenta a algo fuerte y difícil de adivinar, se recomienda utilizar un generador de contraseñas. Si habilitó el complemento de verificación de contraseña durante el proceso de instalación segura, debe proporcionar una contraseña que cumpla con los requisitos de la política en términos de seguridad.ALTER USER 'example_username'@'localhost' IDENTIFIED BY '<new-password>';
-
Vuelva a cargar la tabla de privilegios para asegurarse de que todos los cambios se guarden y activen ejecutando el siguiente comando:
flush privileges;
-
Para confirmar si la
root
se cambian el nombre de usuario y la contraseña, ejecute la siguiente consulta:use mysql; select user,host,authentication_string from mysql.user;
Esto muestra las tablas de usuario almacenadas en la base de datos mysql y debería reflejar los cambios realizados.
+------------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+------------------+-----------+-------------------------------------------+
| example_user | localhost | *A2550B00C6DF81DACE33551E8293462F6CAE33DA |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *241DC5A20F017D55EE82E46E7996784ED4A5CD8A |
+------------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)
Creando un Nuevo Usuario
Una buena práctica de seguridad es el concepto de segregación por funciones o roles. Esto significa que para cada base de datos o aplicación que use la base de datos, cree un nuevo usuario que tenga permisos CRUD para esa base de datos en particular. Esto garantiza que, en cualquier momento, solo un usuario tenga acceso a una base de datos a la vez y los usuarios no puedan acceder a otras bases de datos.
-
Crear una
Test
base de datos, ejecutando la siguiente consulta dentro de MYSQL:create database Test;
-
Cree el usuario responsable de administrar esta base de datos de prueba:
CREATE USER '<username>'@'localhost' IDENTIFIED BY '<password>';
-
Asigne los permisos CRUD apropiados al usuario para la
Test
base de datos:GRANT SELECT,UPDATE,DELETE ON Test.* TO '<username>'@'localhost';
-
Es importante tener en cuenta que estos privilegios se aplican solo a la
Test
base de datos, si está creando un usuario para una aplicación comophpMyAdmin
, debe proporcionar al usuarioroot
permisos. -
Si decide eliminar un usuario en particular, ejecute la siguiente consulta:
drop user '<username>'@'localhost';
-
Vuelva a cargar la tabla de privilegios para asegurarse de que los cambios realizados se apliquen y activen ejecutando la siguiente consulta:
flush privileges;
Configuración personalizada de MySQL
Ahora puede configurar una configuración personalizada segura para MySQL que proporciona opciones de configuración de seguridad adicionales.
-
El archivo de configuración global de MySQL se encuentra en
/etc/mysql/my.cnf
, todas las configuraciones globales personalizadas deben establecerse en el archivo de configuración. -
La configuración personalizada debe especificarse para mysqld (demonio MySQL), las opciones que se muestran en la imagen son configuraciones de seguridad personalizadas.
-
Después de agregar las configuraciones personalizadas, debe reiniciar
mysql
servicio para garantizar que se apliquen todos los cambios.systemctl restart mysql
Auditando la seguridad de MySQL
Ahora puede auditar la seguridad del servidor MySQL usando una herramienta llamada MySAT. MySAT realiza varias pruebas para analizar las configuraciones de la base de datos y las políticas de seguridad. MySAT ayuda a evaluar y, por lo tanto, a aumentar la seguridad de la base de datos MySQL. MySAT es un script SQL simple, fácil de entender y fácil de mantener. Los resultados de MySAT se muestran en formato HTML.
-
Clone el repositorio MySAT Github ejecutando el siguiente comando:
git clone https://github.com/meob/MySAT.git
-
Después de clonar el directorio, navegue al directorio MySAT, donde se encuentra el
mysat.sql
se encuentra el archivo y se usa junto con el servidor MySQL para enviar los resultados a unMySAT.htm
archivo. -
Audite la seguridad ejecutando el siguiente comando:
mysql --user=<root-user> -p<password> --skip-column-names -f < mysat.sql > MySAT.htm
-
Como se indica, MySAT requiere acceso de root a MySQL para ejecutar las pruebas requeridas, después de ejecutar el comando, se genera el archivo MySAT.htm, copie el archivo MySAT.htm y el
mysat.css
archivo a un servidor Apache o NGINX, o descárguelos localmente conscp
, para que puedas analizar los resultados de la auditoría. -
Los resultados tienen un formato fácil de leer y comprender, donde las configuraciones se verifican y los resultados están codificados por colores según su configuración actual y cómo afecta la seguridad del servidor mysql. Por ejemplo, una verificación de configuración fallida tiene un código de color naranja y una verificación aprobada tiene un código de color verde.
-
El informe de auditoría revela qué configuraciones deben cambiarse o modificarse y le presenta una imagen de alto nivel de la seguridad general del servidor MySQL.