MySQL es uno de los sistemas de administración de bases de datos relacionales más populares que es un premio gordo para los atacantes que intentan colarse en las bases de datos. Un servidor de base de datos MySQL recién instalado puede tener muchas vulnerabilidades y lagunas. Dado que la seguridad de los datos es de gran importancia, es obligatorio comprender todos los aspectos de la seguridad de MySQL.
Este artículo se centra en la auditoría y la seguridad de su base de datos MySQL y proporciona nueve consejos para fortalecer su seguridad.
1. Evite las concesiones de privilegios innecesarias
mysql permite varias declaraciones de privilegios que, cuando se asignan innecesariamente a un usuario sin privilegios, pueden conducir a la lectura/escritura de archivos y subvertir otros privilegios de usuario. Algunas de las declaraciones de privilegios potencialmente más riesgosas son FILE, GRANT, SUPER, ALTER, DELETE, SHUTDOWN, etc. Puede leer más sobre esto en la documentación oficial de MySQL. Por lo tanto, no asigne privilegios de superusuario como ARCHIVO, GRANT, SUPER y PROCESO a cuentas no administrativas. Puede revocar estos permisos globales, de base de datos y de nivel de tabla innecesarios de la siguiente manera:
REVOQUE TODO EN *.* DESDE 'user_name'@'host_name'; #Privilegios globales
REVOQUE CREATE, DROP ON nombre_base_datos.* DESDE 'nombre_usuario'@'nombre_host'; #Privilegios de base de datos
REVOQUE INSERTAR, ACTUALIZAR, ELIMINAR EN nombre_base_datos.nombre_tabla DESDE 'nombre_usuario'@'nombre_host'; #Privilegios de mesa
privilegios de vaciado;
2. Restringir inicios de sesión remotos
El acceso remoto facilita el trabajo de los administradores de bases de datos, pero pone en riesgo el servidor frente a posibles vulnerabilidades y explotaciones. Puede deshabilitar el acceso remoto para todos los tipos de cuentas de usuario de MySQl agregando una variable de omisión de redes al archivo de configuración principal y reiniciando el servicio.
[mysqld]
omitir redes
reiniciar servicio sudo mysql
De manera similar, debe deshabilitar el acceso a la cuenta raíz, si no todos, para restringir los inicios de sesión remotos de la cuenta raíz. Esta precaución evita la fuerza bruta de la cuenta raíz de MySQL.
mysql> delete from mysql.user where user='root' and host not in ('localhost', '127.0.0.1', '::1'); mysql> privilegios de vaciado;
3. Deshabilitar funciones (load_file, outfile, dumpfile)
Otra precaución para proteger MySQL contra la inyección de archivos locales es deshabilitar las funciones accesibles solo a través del privilegio de concesión de ARCHIVO. El ARCHIVO es una opción que permite a los usuarios con privilegios bajos con opciones de comandos globales leer o escribir archivos en el servidor.
- cargar archivo
La función load_file carga el contenido del archivo desde el servidor como una cadena. Por ejemplo, el siguiente comando cargará todo el contenido del /etc/passwd archivo de la siguiente manera:
seleccione cargar_archivo('/etc/passwd')
- perfilar
De manera similar, la función outfile escribe contenido en los archivos del servidor local. Los atacantes pueden usar esta función para escribir una carga útil en el archivo del servidor, de la siguiente manera:
seleccione 'Inyección SQL de archivo local' en el archivo de salida '/tmp/file.txt';
cat /tmp/archivo.txt
Producción:
Inyección SQL de archivo local
- archivo de volcado
Esta función utiliza la causa seleccionada para escribir en el archivo sin devolver la salida a la pantalla.
cat /tmp/archivo.txt
selecciona '¡Hola mundo!' en el archivo de volcado '/tmp/world';
Producción:
Consulta OK, 1 fila afectada (0.001 seg)
Puede deshabilitar estas funciones revocando el privilegio FILE de la siguiente manera:
revocar ARCHIVO en *.* de 'user_name'@'localhost';
Relacionados: Una guía para principiantes de Metasploit en Kali Linux (con ejemplos prácticos)
4. Deshabilitar puerto predeterminado
Sabemos que los servicios de MySQL se ejecutan en el puerto 3306 y los atacantes escanean los puertos para verificar los servicios que se ejecutan en la red. Para agregar seguridad por oscuridad y cambiar el puerto MySQL predeterminado editando la variable del sistema del puerto en su archivo de configuración principal, deberá ingresar lo siguiente:
vim /etc/mysql/my.cnf
puerto=XXXX
reiniciar servicio sudo mysql
5. Evite los comodines en los nombres de cuenta
Los nombres de cuenta en MySQL constan de dos partes que son un usuario y un nombre de host "user_name"@"host_name". Le permite al administrador crear cuentas para los usuarios con el mismo nombre que se conectan desde diferentes hosts. Sin embargo, la parte de host de un nombre de cuenta permite convenciones de comodines que pueden ser un punto de acceso a la base de datos desde cualquier lugar.
El uso opcional del nombre de host o el valor de la dirección IP es equivalente a 'user_name'@'%' donde % coincide con la operación LIKE de coincidencia de patrones de MySQL, y % significa cualquier nombre de host. Mientras tanto, el acceso desde el '192.168.132.%' significa cualquier intento desde la red de clase C. Además, cualquiera puede acceder a la base de datos nombrando la parte del host como '192.18.132.mysql.com'.
Para evitar tales intentos, MySQL permite definir una máscara de red con el valor del host para identificar los bits de red de una dirección IP:
client-ip_add & netmask = host_name
La sintaxis para crear un nombre de host es host_ip/netmask:
CREAR USUARIO 'jhon'@'192.168.132.0/255.255.255.0';
El valor de host anterior permite al usuario Juan para acceder a la base de datos desde cualquier IP dentro del rango de 192.168.132.0-192.168.132.255. De manera similar, los valores de host de 192.168.132.0/255.0.0.0, 192.168.132.0/255.255.0.0 permitirán hosts de las redes de clase A y B. Mientras que 192.168.132.5 solo permitirá el acceso desde la IP específica.
6. Deshabilitar acceso explícito
El nombre de usuario en MySQL es un nombre con el que las bases de datos aceptan conexiones entrantes o un nombre de usuario en blanco "@"host_name" que crea un usuario anónimo. Sin embargo, la presencia de un usuario anónimo puede aprovechar a los atacantes para acceder al servidor de la base de datos. Además, las versiones de MySQL anteriores a MySQL 5.7 crean un conjunto anónimo de usuarios, y la instalación después de la actualización de la versión aún agrega estos usuarios.
seleccione usuario, host, contraseña de mysql.user donde usuario como '';
Puede notar que las columnas de usuario y contraseña están vacías y el acceso está limitado a localhost. Sin embargo, no desea que nadie acceda a la base de datos. Use el siguiente comando para eliminar usuarios anónimos:
soltar usuario " "@"localhost"
privilegios de vaciado;
7. Establecer una cuenta no raíz como propietario o grupo
La configuración de una cuenta de usuario no root no está relacionada con el usuario root de MySQL. La instalación de MySQL en sistemas Linux/Unix desde los paquetes tar y tar.gz permite que cualquier usuario sin privilegios pueda ejecutar el servidor. Este es un inconveniente de seguridad porque cualquier usuario con la opción de concesión de ARCHIVO puede editar o crear archivos en el servidor. Sin embargo, devuelve un error cuando un usuario intenta acceder sin la -usuario=raíz error.
Puede evitar esto practicando la regla general de acceder al servidor de la base de datos como un usuario de Linux independiente. Para ejecutar mysqld como un usuario regular de Linux, detenga el servidor y cambie permisos de lectura/escritura del servidor MySQl a mysql, de la siguiente manera:
chown -R mysql /ruta/a/mysql/datadir
Abra el archivo de configuración principal de MySQL, agregue un nuevo usuario de mysql y reinicie el servicio para evitar el acceso al servidor no requerido:
vim /etc/mysql/my.cnf
usuario=mysql
reiniciar servicio sudo mysql
8. Establecer contraseña para la cuenta raíz
La instalación de MySQL a través de un shell interactivo en las distribuciones de Linux basadas en Debian crea la cuenta de usuario raíz y le pide que establezca una contraseña. Sin embargo, esto no sucede en la instalación de shell no interactivo y las distribuciones basadas en Red-Hat. Como se indicó anteriormente, un usuario no root de una máquina Linux puede acceder a la cuenta de usuario root de mysql utilizando el -usuario=raíz opción. Puede evitar eso configurando la contraseña de la siguiente manera:
sudo mysqladmin contraseña
vim /etc/mysql/my.cnf
contraseña=
reiniciar servicio sudo mysql
9. Garantice el cifrado de datos en tránsito y en reposo
La comunicación predeterminada sin cifrar entre el cliente y el servidor presenta un riesgo de interceptación de datos por parte de cualquier intermediario. Del mismo modo, los datos de usuario no cifrados en la base de datos ponen en riesgo la confidencialidad e integridad del usuario. MySQL admite el cifrado de datos entre el cliente y el servidor a través del protocolo TLS/SSL, mientras que la comunicación no cifrada solo es aceptable cuando ambas partes que se comunican están dentro de la misma red.
MySQL ahora es compatible con el cifrado en reposo para proteger los datos almacenados en el servidor, incluso cuando se viola el sistema.
Seguridad avanzada de MySQL: protéjase
Es fundamental asegurarse de tener los niveles más altos de seguridad en línea, y este artículo le habrá brindado algunos consejos útiles en la dirección correcta. Los pasos anteriores son útiles para proteger su servidor de base de datos, pero también es esencial aprender a asignar permisos mínimos a usuarios no administrativos.
Cree su propia base de datos mySQL con solo un editor de texto y este esquema de estructura básica, o "esquema".
Leer siguiente
- Programación
- Seguridad
- Programación
- Consejos de seguridad
- Seguridad

Rumaisa es escritora independiente en MUO. Ha desempeñado muchas funciones, desde matemática hasta entusiasta de la seguridad de la información, y ahora trabaja como analista de SOC. Sus intereses incluyen leer y escribir sobre nuevas tecnologías, distribuciones de Linux y todo lo relacionado con la seguridad de la información.
Suscríbete a nuestro boletín
¡Únase a nuestro boletín para obtener consejos técnicos, reseñas, libros electrónicos gratuitos y ofertas exclusivas!
Haga clic aquí para suscribirse