Ingresar  \/ 
x
 Use Facebook account  Use Google account  Use Microsoft account  Use LinkedIn account
o
x

Cómo Proteger las Bases de Datos MySQL y MariaDB en un Servidor de Linux

asegurar base de datos mariadb myqal

Introducción

Cómo Proteger las Bases de Datos MySQL y MariaDB en un Servidor de Linux. Existen muchas implementaciones del lenguaje de base de datos SQL disponible en sistemas Linux y Unix. MySQL y MariaDB son dos opciones populares para implementar bases de datos relacionales en entornos de servidor.

Sin embargo, como la mayoría del software, estas herramientas pueden ser pasivas en la seguridad si están configuradas incorrectamente. Este tutorial lo guiará a través de algunos pasos básicos que puede seguir para proteger sus bases de datos MariaDB o MySQL, y asegurarse de que no sean una puerta abierta a su servidor.

Para simplicidad utilizaremos el servidor MySQL en una instancia del servidor Ubuntu 12.04. Sin embargo, estas técnicas se pueden aplicar a otras distribuciones de Linux y también se pueden usar con MariaDB.

Paso 1. Configuración Inicial

MySQL le brinda la oportunidad de dar el primer paso hacia la seguridad durante la instalación. Le pedirá que establezca una contraseña de root.

sudo apt-get install mysql-server
 ?????????????????????????? Configuring mysql-server-5.5 ???????????????????????????
 ? While not mandatory, it is highly recommended that you set a password for the   ? 
 ? MySQL administrative "root" user.                                               ? 
 ?                                                                                 ? 
 ? If this field is left blank, the password will not be changed.                  ? 
 ?                                                                                 ? 
 ? New password for the MySQL "root" user:                                         ? 
 ?                                                                                 ? 
 ? _______________________________________________________________________________ ? 
 ?                                                                                 ? 
 ?                                                                             ? 
 ?                                                                                 ? 
 ???????????????????????????????????????????????????????????????????????????????????

Siempre puede configurar la contraseña de root en otro momento, pero no hay razón para omitir este paso, por lo que debe proteger su cuenta de administrador desde el principio.

Una vez que la instalación esté completa, deberíamos ejecutar algunos scripts incluidos. Primero, usaremos el script "mysql_install_db" para crear un diseño de directorio para nuestras bases de datos.

sudo mysql_install_db

A continuación, ejecute el script llamado "mysql_secure_installation". Esto nos guiará a través de algunos procedimientos que eliminarán algunos valores predeterminados que son peligrosos de usar en un entorno de producción.

sudo mysql_secure_installation

Primero le pedirá la contraseña de root que configuró durante la instalación. Inmediatamente después, se le preguntará una serie de preguntas, comenzando por si desea cambiar la contraseña de la raíz.

Esta es otra oportunidad para cambiar su contraseña a algo seguro si aún no lo ha hecho.

Debe responder "Y" (para sí) a todas las preguntas restantes.

Esto eliminará la posibilidad de que alguien inicie sesión en MySQL de manera predeterminada, inhabilite el inicio de sesión de forma remota con la cuenta de administrador, elimine algunas bases de datos de prueba inseguras y actualice la instancia de MySQL en ejecución para reflejar estos cambios.

Consideraciones de Seguridad

El tema general de la seguridad de MySQL (y casi cualquier otro sistema) es que el acceso se debe otorgar solo cuando sea absolutamente necesario. La seguridad de sus datos a veces se reduce a un equilibrio entre comodidad y seguridad.

En este tutorial, nos apoyaremos en el lado de la seguridad, aunque su uso específico del software de la base de datos puede llevarlo a elegir entre estas opciones.

Paso 2. Seguridad a Través del Archivo My.cnf

El archivo de configuración principal para MySQL es un archivo llamado "my.cnf" que se encuentra en el directorio "/ etc / mysql /" en Ubuntu y en el directorio "/ etc /" en algún otro VPS.

Vamos a cambiar algunas configuraciones en este archivo para bloquear nuestra instancia de MySQL.

Abra el archivo con privilegios de root. Cambie la ruta del directorio según sea necesario si está siguiendo este tutorial en un sistema diferente:

sudo nano /etc/mysql/my.cnf

La primera configuración que deberíamos verificar es la configuración "bind-address" dentro de la sección "[mysqld]". Esta configuración debe configurarse en su dispositivo de red de bucle local, que es "127.0.0.1".

bind-address = 127.0.0.1

Esto asegura que MySQL no acepte conexiones desde cualquier lugar, a excepción de la máquina local.

Si necesita acceder a esta base de datos desde otra máquina, considere conectarse a través de SSH para realizar su consulta y administración de bases de datos localmente y enviar los resultados a través del túnel ssh.

El siguiente hoyo que aplicaremos es una función que permite el acceso al sistema de archivos subyacente desde MySQL. Esto puede tener graves implicaciones de seguridad y debe cerrarse a menos que lo necesite absolutamente.

En la misma sección del archivo, agregaremos una directiva para deshabilitar esta capacidad de cargar archivos locales:

local-infile=0

Esto desactivará la carga de archivos del sistema de archivos para usuarios sin privilegios de nivel de archivo a la base de datos.

Si tenemos suficiente espacio y no operamos una gran base de datos, puede ser útil registrar información adicional para vigilar la actividad sospechosa.

Si registra demasiado puede crear un golpe de rendimiento, por lo que es algo que debe sopesar con cuidado.

Puede establecer la variable de registro dentro de la misma sección "[mysqld]" a la que hemos estado agregando.

log=/var/log/mysql-logfile

Asegúrese de que el registro de MySQL, el registro de errores y el directorio de registro mysql no sean legibles a nivel mundial:

sudo ls -l /var/log/mysql*
-rw-r----- 1 mysql adm    0 Jul 23 18:06 /var/log/mysql.err
-rw-r----- 1 mysql adm    0 Jul 23 18:06 /var/log/mysql.log

/var/log/mysql:
total 28
-rw-rw---- 1 mysql adm 20694 Jul 23 19:17 error.log

Paso 3. Asegurando MySQL desde Adentro

Hay varios pasos que puede seguir al utilizar MySQL para mejorar la seguridad.

Vamos a ingresar los comandos en esta sección en la interfaz de solicitud de MySQL, por lo que debemos iniciar sesión.

mysql -u root -p

Se le pedirá la contraseña de root que configuró anteriormente.

Protección de Contraseñas y Asociaciones Anfitrionas

Primero, asegúrese de que no haya usuarios sin una contraseña o una asociación de host en MySQL:

SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user        | %         |                                           |
| root             | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root             | ::1       | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Como puede ver, en nuestro ejemplo de configuración, el usuario "demo-user" no tiene contraseña y es válido independientemente del host en el que esté. Esto es muy inseguro.

Podemos establecer una contraseña para el usuario con este comando. Cambia " newPassWord " para reflejar la contraseña que deseas asignar.

UPDATE mysql.user SET Password=PASSWORD('newPassWord') WHERE User="demo-user";

Si revisamos la tabla de Usuario nuevamente, veremos que el usuario de demostración ahora tiene una contraseña:

SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user        | %         | *D8DECEC305209EEFEC43008E1D420E1AA06B19E0 |
| root             | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root             | ::1       | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Si miras en el campo "Host", verás que todavía tenemos un "%", que es un comodín que significa cualquier host. Esto no es lo que queremos. Cambiemos eso para ser "localhost":

UPDATE mysql.user SET Host='localhost' WHERE User="demo-user";

Si comprobamos nuevamente, podemos ver que la tabla de Usuario ahora tiene los campos apropiados establecidos.

SELECT User,Host,Password FROM mysql.user;

Si nuestra tabla contiene algún usuario en blanco (no debería en este punto ya que ejecutamos "mysql_secure_installation", pero cubriremos esto de todos modos), deberíamos eliminarlos.

Para hacer esto, podemos usar la siguiente llamada para eliminar a los usuarios en blanco de la tabla de acceso:

DELETE FROM mysql.user WHERE User="";

Una vez que hayamos terminado de modificar la tabla de Usuario, necesitamos ingresar el siguiente comando para implementar los nuevos permisos:

FLUSH PRIVILEGES;

Implementación de usuarios específicos de la aplicación

Similar a la práctica de ejecutar procesos dentro de Linux como un usuario aislado, MySQL se beneficia del mismo tipo de aislamiento.

Cada aplicación que usa MySQL debe tener su propio usuario que solo tiene privilegios limitados y solo tiene acceso a las bases de datos que necesita para ejecutarse.

Cuando configuramos una nueva aplicación para usar MySQL, deberíamos crear las bases de datos que necesita esa aplicación:

create database testDB;
Query OK, 1 row affected (0.00 sec)

Luego, deberíamos crear un usuario para administrar esa base de datos y asignarle solo los privilegios que necesita. Esto variará según la aplicación, y algunos usos necesitan más privilegios abiertos que otros.

Para crear un nuevo usuario, use el siguiente comando:

CREATE USER 'demo-user'@'localhost' IDENTIFIED BY 'password';

Podemos otorgar los nuevos privilegios de usuario en la nueva tabla con el siguiente comando. Consulte el tutorial sobre cómo crear un nuevo usuario y otorgar permisos en MySQL para obtener más información sobre privilegios específicos:

GRANT SELECT,UPDATE,DELETE ON testDB.* TO 'demo-user'@'localhost';

Como ejemplo, si luego necesitamos revocar los privilegios de actualización de la cuenta, podríamos usar el siguiente comando:

REVOKE UPDATE ON testDB.* FROM 'demo-user'@'localhost';

Si necesitamos todos los privilegios en una determinada base de datos, podemos especificar eso con lo siguiente:

GRANT ALL ON testDB.* TO 'demo-user'@'localhost';

Para mostrar los privilegios actuales de un usuario, primero debemos implementar los privilegios que especificamos usando el comando "privilegios de descarga". Luego, podemos consultar qué otorga un usuario:

FLUSH PRIVILEGES;
show grants for 'demo-user'@'localhost';
+------------------------------------------------------------------------------------------------------------------+
| Grants for demo-user@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demo-user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT SELECT, UPDATE, DELETE ON `testDB`.* TO 'demo-user'@'localhost'                                            |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Siempre vacíe los privilegios cuando termine de hacer cambios.

Cambio del Usuario Root

Un paso adicional que puede tomar es cambiar el nombre de inicio de sesión raíz. Si un atacante intenta acceder al inicio de sesión de MySQL raíz, necesitará realizar el paso adicional para encontrar el nombre de usuario.

El inicio de sesión raíz se puede cambiar con el siguiente comando:

rename user 'root'@'localhost' to 'newAdminUser'@'localhost';

Podemos ver el cambio utilizando la misma consulta que hemos estado usando para la base de datos del usuario:

select user,host,password from mysql.user;

Nuevamente, debemos eliminar los privilegios para que estos cambios ocurran:

FLUSH PRIVILEGES;

Recuerde que deberá iniciar sesión en MySQL como el nombre de usuario recién creado de ahora en adelante cuando desee realizar tareas administrativas:

mysql -u newAdminUser -p

Conclusión

Aunque esta no es una lista exhaustiva de las prácticas de seguridad de MySQL y MariaDB, debería brindarte una buena introducción a los tipos de decisiones que debes tomar al proteger tus bases de datos.

Se puede encontrar más información sobre la configuración y la seguridad en los sitios web de MySQL y MariaDB, así como en sus respectivas páginas de manual. Las aplicaciones que elija utilizar también pueden ofrecer consejos de seguridad.

Fuente. Artículo traducido y con muy ligeras modificaciones de: https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-debian

 
Sobre el Autor
Pipe Peña
Author: Pipe Peña
Soy un loco enamorado de la vida. Licenciado en Ciencias Sociales y Humanas, amante de la informática y la astrofísica. Me gusta crear e investigar proyectos que enriquezcan la construcción y desarrollo del conocimiento individual y colectivo. Me encantan los videojuegos, el cine, la química, matemáticas, la física cuántica y la música, en donde actualmente soy compositor. Me baso en la idea que toma Baruch Spinoza sobre Dios.

ImprimirCorreo electrónico

Donaciones - Tutoriales y VideoTutoriales Fututel

Dona si crees que lo merecemos. Ésto nos ayudará para seguir publicando y hacerte la vida más fácil :)

Cantidad: