Permitir acceso externo a MySQL o MariaDB en Linux CentOS 7 Minimal

Mostramos paso a paso cómo habilitar el acceso externo a una base de datos MySQL (o MariaDB), instalada sobre un equipo con el sistema operativo Linux CentOS 7 Minimal. Con este «truco» podremos acceder desde cualquier equipo de nuestra red LAN e incluso desde cualquier equipo de Internet (si se realiza el NAT oportuno en el router). Lo explicamos para Linux CentOS pero es válido para otras distribuciones de Linux.

Requisitos para acceso externo a MySQL o MariaDB en equipo Linux CentOS 7

Necesitaremos disponer de un equipo con el sistema operativo Linux CentOS 7, aunque lo explicado en este artículo puede servir para otras distribuciones de Linux como RedHat o incluso otras versiones (como la 6 de CentOS) y con unas pequeñas variaciones servirá para otras distribuciones como Ubuntu. Dicho servidor tendrá instaldo MySQL Server o MariaDB.

Deberemos tener usuario y contraseña del sistema operativo Linux con permisos de administrador, también usuario y contraseña de un usuario administrador de MySQL Server o MariaDB.

Si queremos habilitar el acceso desde fuera de nuestra red LAN, desde Internet, tendremos que mapear el puerto de MySQL/MariaDB (por defecto el 3306) en el router o cortafuegos de nuestra red hacia la IP del equipo con MySQL/MariaDB. Para un router «normal», accederemos vía web a su configuración y en el menú «Internet» – «Redirección de puertos»:

Requisitos para acceso externo a MySQL o MariaDB en equipo Linux CentOS 7

Añadiremos una nueva redirección (NAT o mapeo), indicando la IP de destino, que debe ser la del servidor con Linux CentOS y MySQL y el puerto que mapearemos (que si no se ha establecido otro por defecto para MySQL y MariaDB es 3306):

Requisitos para acceso externo a MySQL o MariaDB en equipo Linux CentOS 7

Configurar el cortafuegos de Linux CentOS para permitir conexiones por el puerto de MySQL o MariaDB

Deberemos habilitar una regla en el cortafuegos de Linux CentOS 7 para permitir conexiones a través del puerto 3306 (o el que hayamos establecido para MySQL/MariaDB). Para ello ejecutaremos en la línea de comandos de Linux CentOS 7 lo siguiente:

firewall-cmd –permanent –add-port=3306/tcp

Y este otro para recargar las reglas:

firewall-cmd –reload

No debemos olvidar que en muchos casos tendremos habilitado (enforcing) el SELinux de CentOS, por lo tanto debemos configurarlo también para que permita las conexiones de MySQL/MariaDB, ejecutando este comando:

semanage port -a -t mysqld_port_t 3306 -p tcp

Si nos aparece el mensaje:

-bash: semanage: no se encontró la orden

deberemos instalar el paquete policycoreutils-python con este comando:

yum install policycoreutils-python

y volver a probar.

En definitiva deberemos configurar apropiadamente el cortafuegos que tengamos habilitado en nuestro equipo Linux, sea de la distribución que sea, abriendo el puerto de MySQL o MariaDB.

En otras distribuciones podremos usar el siguiente comando para abrir el puerto de MySQL:

iptables -I INPUT -p tcp –dport 3306 -m state –state NEW,ESTABLISHED -j ACCEPT

service iptables save

Configurar MySQL o MariaDB para permitir el acceso externo

Deberemos revisar la configuración de MySQL o MariaDB, que en el caso de Linux CentOS se encuentra en el fichero:

/etc/my.cnf

Para el caso de otras distribuciones como Linux Ubuntu 18 se puede encontrar en:

/etc/mysql/mysql.conf.d/mysqld.cnf

Editaremos este fichero de configuración con cualquier editor (vi, nano, etc.), descomentaremos (si está comentada) la línea:

skip-external-locking

y la línea:

bind_address = 127.0.0.1

la cambiaremos por:

bind_address = 0.0.0.0

Si tenemos la línea:

skip-networking

La comentaremos y dejaremos:

#skip-networking

Configurar MySQL o MariaDB para permitir el acceso externo

Configuración del usuario de MySQL para acceso externo

Con lo anterior ya tendremos acceso de forma externa a nuestro servidor MySQL, desde cualquier otro equipo de nuestra red LAN o desde Internet. Por último nos quedaría configurar el usuario con el que vamos a acceder a MySQL, para permitirle conexiones externas. Podemos realizar este paso desde la línea de comandos, conectándonos a MySQL con el comando:

mysql -u root -p

(o bien cambiando root por un usuario con permisos de DBA o administrador de MySQL)

Crearemos un usuario con los permisos que queramos, usando esta orden en la línea de comandos de MySQL:

grand all privileges on nombre_bd.* to ‘nombre_usuario’@’%’ identified by ‘contraseña_usuario’ with grant option;

Configuración del usuario de MySQL para acceso externo

Teniendo en cuenta lo siguiente:

  • nombre_bd.*: dará permisos para la base de datos nombre_bd y para todas sus tablas (*). Si queremos darle permisos a todos los esquemas/bases de datos podremos usar *.* y si queremos darle permisos para una única tabla de la base de datos usaremos nombre_bd.nombre_tabla.
  • ‘nombre_usuario’@’%’: con esto indicaremos el nombre del usuario al que permitiremos el acceso y desde qué IP o rango de IP. Y si queremos permitirle el acceso desde cualquier IP pondremos %. Por ejemplo, si solo queremos darle acceso desde cualquier IP del rango 192.168.1.x pondremos ‘nombre_usuario’@’192.168.1.%’.
  • identified by ‘contraseña_usuario’: introduciremos aquí la contraseña que se establecerá para este usuario.

Si nos da este error:

ERROR 1827 (HY000): The password hash doesn’t have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.

Puede deberse a que tenemos establecida una política de seguridad para la contraseña. Para establecerla debemos generarla previamente con con la orden (siempre ejecutando desde la línea de comandos de MySQL):

select PASSWORD(‘miclave’);

(Cambiando «miclave» por la contraseña que queramos para el usuario)

Por lo tanto sería esta la contraseña que introduciríamos en el comando anterior:

grand all privileges on nombre_bd.* to ‘nombre_usuario’@’%’ identified by ‘*9DFEE097279EFB6742DD80AF8809C3C6DD57CD08’ with grant option;

Ejecutaremos en esta misma consola el siguiente comando para hacer efectivos los permisos:

flush privileges;

Y reiniciaríamos el servicio de MySQL para que se apliquen los posibles cambios que hayamos hecho en el fichero de configuración con:

systemctl restart mysql

En otras distribuciones podremos usar:

service mysql restart

o también:

/etc/init.d/mysql restart

Herramienta mytop para comprobar conexiones a servidor MySQL en tiempo real

Recomendamos una herramienta interesante para comprobar y ver las conexiones que se van produciendo a MySQL Server en tiempo real, se trata de mytop y se puede instalar con:

yum install mytop

o también para Ubuntu:

apt-get install mytop

Una vez instalada la ejecutaremos con:

mytop

Y nos mostrará, en tiempo real y actualizándose, las conexiones que se van produciendo a nuestro servidor MySQL, incluso la consulta SQL que se ejecuta y otros datos interesantes para posibles depuraciones y comprobaciones:

Herramienta mytop para comprobar conexiones a servidor MySQL en tiempo real

Como vemos en la imagen, obtiene datos tan interesantes como:

  • Versión del servidor de MySQL, en nuestro caso MySQL 5.7.22.
  • Queries: número de consultas que se han ejecutado en el servidor.
  • qps: número de consultas por segundo de media.
  • Slow: número de consultas lentas que se han ejecutado.
  • qps now: consultas ejecutándose por segundo actualmente.
  • Slow qps: consultas lentas ejecutándose por segundo actualmente.
  • Threads: hilos de ejecución activos y sleeping (durmiendo).
  • Bps: bytes recibidos (in) y enviados (out) en general y Now actuales.
  • Lista de usuarios conectados con el ID, el nombre de usuario, la IP, la base de datos y la última consulta SQL ejecutada.

Anexo – Ejemplo de contenido de fichero my.cnf o mysqld.cnf

# The MySQL database server configuration file.
# You can copy this to one of:
# – «/etc/mysql/my.cnf» to set global options,
# – «~/.my.cnf» to set user-specific options.
# One can use all long options that the program supports.
# Run program with –help to get a list of available options and with
# –print-defaults to see which it would actually understand and use.
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain «#» chars…
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
# * Basic Settings
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
bind_address = 0.0.0.0
# * Fine Tuning
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover-options = BACKUP
#max_connections = 100

alonsojpd

alonsojpd

Presidente y fundador de Proyecto A y AjpdSoft

También te podría gustar...

1 respuesta

Deja una respuesta