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).

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:

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.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# 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 un comentario