Cómo restringir el acceso al puerto de MySQL

GuíasAplicacionesBases de datosLinuxMySQLSistemas

El muchas distribuciones de Linux, el puerto que MySQL utiliza por defecto se queda abierto tras su instalación. En esta guía vamos a ver varios métodos para restringir el acceso a este puerto.

Por defecto y si no lo has cambiado, el puerto que MySQL utiliza es el 3306. En algunas ocasiones puede suponer un agujero de seguridad. Esta guía te resultará útil si solamente usas bases de datos desde tu propio servidor o si quieres restringir aquellas IPs que tendrán acceso al servidor MySQL, evitando así problemas derivados de visitas externas inesperadas.

Método A: Configura reglas en el Firewall

Puedes utilizar iptables para crear reglas en el Firewall y así restringir el acceso al puerto 3306. De este modo puedes agregar o eliminar permisos de acceso a este puerto selectivamente en base a la IP del servidor o cliente que intenta acceder.

En este ejemplo vamos a bloquear por completo el acceso externo al puerto 3306:

iptables -A INPUT -p tcp --dport 3306 -j DROP

Sin embargo, también puedes especificar aquellas IP o bloques de IP que quieres que tengan acceso al puerto. También puedes establecer lo opuesto y seleccionar las IP o bloques de IP cuyo acceso esté bloqueado.

Por ejemplo, para bloquear el acceso a todas las IP a excepción de la 123.456.123.456, utiliza este comando:

iptables -A INPUT -p tcp --dport 3306 -s 123.456.123.456 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

En caso de que quieras permitir el acceso a más direcciones IP, puedes utilizar más órdenes ACCEPT. Lo único que tienes que tener en cuenta es que tendrán que estar antes de la orden DROP. Por ejemplo, para permitir también el acceso a la IP 215.126.145.312, utiliza la siguiente orden antes de la orden DROP del ejemplo anterior:

iptables -I INPUT 1 -p tcp --dport 3306 -s 215.126.145.312 -j ACCEPT

Y esto es todo por ahora.

Método B: Desactiva las funciones de red de MySQL

Si no necesitas tener acceso a MySQL desde otro servidor o desde otro ordenador, siempre tienes la opción de deshabilitar las funciones de red de MySQL. Para hacerlo, sigue estos pasos, que defieren un poco dependiendo de tu distribución de Linux:

Distribuciones Ubuntu y Debian

Si utilizas Ubuntu o Debian, las funciones de red de MySQL están desactivadas por defecto, por lo que el puerto 3306 estará desactivado para conexiones externas. Para asegurarte de que esto es así o para desactivarlo en caso de que esté activo, sigue estos pasos:

  1. Accede a tu servidor mediante SSH
  2. Edita el archivo de configuración de MySQL, localizado en /etc/mysql/my.cnf. En este ejemplo utilizaremos nano, pero puedes utilizar tu editor de texto preferido:
    nano /etc/mysql/my.cnf
  3. En el archivo my.cnf, busca la línea en la que pone bind-address. Si bind-address tiene 0.0.0.0 como valor, significará que las conexiones están abiertas para todas las interfaces externas. Para permitir únicamente el acceso desde el propio servidor local, asegúrate de que tiene el valor 127.0.0.1.
  4. Guarda los cambios. Si usas nano, pulsa CTRL + X y confirma que quieres guardar los cambios con Y.
  5. Ahora reinicia el servidor MySQL con este comando.
    service mysql restart

Y has terminado. El puerto 3306 está cerrado para todas las conexiones externas

Distribuciones CentOS y Fedora

Para deshabilitar las funciones de red en sistema CentOS o Fedora sigue estos pasos:

  1. Accede a tu servidor mediante utilizando SSH.
  2. Abre el archivo de configuración /etc/my.cnf. En este ejemplo utilizaremos nano para editarlo, pero puedes usar cualquier otro editor:
    nano /etc/my.cnf
  3. Busca la línea skip-networking y, si está comentada con un símbolo #, elimínalo para así desactivar el comentario. Debería quedar así:
    skip-networking
  4. Guarda los cambios del archivo y sal del editor de texto. Si usas nano, sal pulsando CTRL + X y escribiendo Y para confirmar el guardado.
  5. Ahora reinicia el servidor MySQL con este comando.
    service mysqld restart

Y ya está todo listo. El puerto 3306 está ahora cerrado.

Conexión remota a MySQL con el puerto cerrado

Aunque el puerto de MySQL esté cerrado, puedes establecer la conexión a través de un túnel SSH. En este caso, se redirige un puerto de nuestro sistema al servidor remoto por medio de una conexión SSH. El tráfico estará encriptado gracias a la naturaleza segura del protocolo SSH. Para hacerlo, puedes consultar esta guía para establecer una conexión remota MySQL a través de un túnel SSH.