Cómo instalar el motor de base de datos MySQL Server en un equipo con sistema operativo Linux Ubuntu Server 22.04. Cómo configurar las opciones de seguridad básicas de MySQL Server y cómo crear un usuario con privilegios de administrador. Cómo configurar MySQL Server para permitir conexiones externas y cómo crear un usuario con privilegios reducidos para una base de datos concreta y unas IP concretas.

Requisitos para montar servidor de base de datos con MySQL Server en Linux Ubuntu Server

Necesitaremos disponer de un equipo con el sistema operativo Linux Ubuntu Server 22. En el siguiente artículo explicamos cómo instarlo:

Dispondremos de acceso por SSH a este servidor y un usuario y contraseña del sistema operativo Linux con privilegios de superusuario.

El servidor debe tener acceso a Internet para descargar los paquetes necesarios para la instalación de MySQL Server.

Actualizar lista de paquetes de Linux Ubuntu y paquetes pendientes de actualizar

Antes de la instalación de MySQL Server, es recomendable (no obligatorio) actualizar la lista de paquetes disponibles. Para ello, desde una consola de shell de comandos del servidor Linux, ejecutaremos el siguiente comando:

Si hay algún paquete pendiente de actualizar, que podemos listar con el comando:

Los podremos actualizar con el comando:

Instalar MySQL Server en Linux Ubuntu Server 22

Para instalar MySQL Server, ejecutaremos el siguiente comando:

Puede que nos muestre el siguiente mensaje, pulsaremos OK:

Instalar MySQL Server en Linux Ubuntu Server 22

Tras la instalación de MySQL, verificaremos que el servicio está iniciado, con el comando:

Devolverá algo así como:

También podremos comprobar que el servicio de MySQL está activo ejecutando el comando:

Que nos devolverá: active.

Para configurar el autoarranque del servicio de MySQL, para que arranque automáticamente cuando el equipo se inicie, ejecutaremos el siguiente comando:

Que devolverá

Securizar MySQL Server, establecer contraseña para root

Tras la instalación de MySQL Server, es recomendable aplicar algunos mecanismos de seguridad. Empezaremos por ejecutar el siguiente comando, que nos permitirá aplicar varias medidas de seguridad de forma automática:

Nos irá haciendo varias preguntas, empezaremos por:

Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD component? Press y|Y for Yes, any other key for No: y

Responderemos «y» a esta pregunta si queremos que MySQL Server establezca reglas de fortaleza de contraseñas para sus usuarios, de forma que no permita usuarios con contraseñas «débiles». Si respondemos «yes», nos preguntará qué nivel de validación queremos aplicar:

There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

En nuestro caso, elegiremos el nivel MEDIUM (1).

Securizar MySQL Server, establecer contraseña para root

La siguiente pregunta será:

By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

Nos pregunta si queremos eliminar el usuario anómino que MySQL Server crea en su instalación. Por seguridad es recomendable eliminarlo, por lo que responderemos «yes».

Securizar MySQL Server, establecer contraseña para root

La siguiente pregunta:

Normally, root should only be allowed to connect from ‘localhost’. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
También por seguridad, es recomendable que el usuario root no tenga acceso remoto, por lo que responderemos «yes».

Securizar MySQL Server, establecer contraseña para root

La siguiente pregunta:

By default, MySQL comes with a database named ‘test’ that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No): y

MySQL Server, en su instalación inicial, crea una base de datos de pruebas (test), por seguridad, es recomendable eliminarla, por lo que respondremos «yes» a la pregunta.

Securizar MySQL Server, establecer contraseña para root

La última pregunta:

Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

Puesto que hemos hecho cambios en los permisos de los usuarios, respondremos «yes» a la pregunta para recargar los cambios en los privilegios.

Securizar MySQL Server, establecer contraseña para root

A continuación, estableceremos una contraseña para el superusuario root de MySQL Server. para ello, ejecutaremos el siguiente comando:

Veremos que se accede sin que nos pida usuario y contraseña, esto es normal en una instalación inicial de MySQL Server, para establecer una contraseña para el superusuario root, introduciremos el siguiente comando en la cosola de MySQL Server:

Lo que hace el comando anterior es establecer para el usuario «root», en local del equipo (localhost) la contraseña «la_contraseña» (introduciremos una contraseña de fortaleza alta, segura, para el superusuario root, que contenga números, letras, mayúsculas, minúsculas y caracteres especiales).

Reestableceremos la configuración de seguridad con el comando:

Y cerraremos la consola de MySQL con el comando:

Securizar MySQL Server, establecer contraseña para root

Ahora, si intentamos acceder a MySQL Server con el comando anterior:

Veremos que nos da el error:

ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: NO)

Indicando que ya no podemos acceder a MySQL Server sin contraseña. Para acceder a partir de ahora, deberemos introducir el comando:

Que solicitará la contraseña por consola.

Crear usuario administrador en MySQL Server de acceso local

Por seguridad, es recomendable NO usar el usuario root para tareas de administración de MySQL Server. Y, menos aún, permitir acceso externo al usuario root. Por ello, se recomienda crear un usuario administrador para MySQL Server, diferente del usuario root.

Para crear un usuario en MySQL Server, accederemos a su consola, con el comando:

Introduciremos la contraseña del usuario root y ejecutaremos el siguiente comando, para crear un usuario con privilegios de administrador para MySQL Server, de momento con acceso exclusivamente desde el servidor local. Para crear el usuario «ges» con contraseña «la_contraseña», ejecutaremos el siguiente comando:

Para establecer los permisos de aministrador sobre todas las bases de datos, para el usuario anterior «ges», introduciremos el siguiente comando:

Aplicaremos los cambios con:

Y cerraremos sesión con:

Crear usuario administrador en MySQL Server y permitir acceso externo

Probaremos el nuevo usuario creado, accediendo a MySQL Server con él, con el comando:

Nos solicitará la contraseña para el usuario anterior, la introduciremos y comprobaremos que tenemos acceso a MySQL Server, por ejemplo, podremos listar todas las bases de datos de MySQL Server, con el comando:

Acceder a una de ellas:

Y listar todas sus tablas:

Crear usuario administrador en MySQL Server y permitir acceso externo

Este usuario, como hemos indicado, de momento, no tendría acceso externo (únicamente desde el servidor local localhost).

Crear usuario administrador de MySQL Server de acceso externo

En primer lugar, crearemos el usuario correspondiente, proceso similar al anterior, crearemos el usuario «gesex» (crearemos el usuario para acceso únicamente desde la IP 192.168.1.150):

Estableceremos todos los privilegios (ALL PRIVILEGES) sobre todas las bases de datos y sus tablas (*.*) para el usuario «gesex», como modificación del usuario creado en el punto anterior, en este caso, para permitir el acceso externo, indicaremos la dirección IP a la que le permitiremos el acceso externo para el usuario «gesex»:

Como podemos comprobar en el comando anterior, lo que hacemos es dar privilegios al usuario «gesex» para acceso desde la IP externa 192.168.1.150. Con esto, permitiremos acceder a este usuario desde el equipo de la red con la IP 192.168.1.150.

Si queremos permitir el acceso desde cualquier equipo de la red (NO recomendable por seguridad), introduciremos el siguiente comando:

Para permitir las conexiones externas al servidor de MySQL Server, tendremos que editar el fichero /etc/mysql/mysql.conf.d/mysqld.cnf, con el comando:

En la sección [mysqld] buscaremos la línea:

Que comentaremos añadiendo un «#» delante, quedando:

Y añadiremos la línea:

Que será la que permita el acceso externo. Guardaremos los cambios pulsando Control + X y cerraremos la edición pulsando Control + X.

Crear usuario administrador de MySQL Server de acceso externo

Reiniciaremos el servicio de MySQL para que se apliquen los cambios, con el comando:

Si tenemos activo el cortafuegos de Linux, seguramente tengamos que abrir el puerto de MySQL. En nuestro caso, hemos dejado el puerto por defecto 3306 (aunque lo recomendable por seguridad es cambiarlo a otro puerto). Para abrir el puerto en el cortafuegos de Linux, para una IP concreta, ejecutaremos el siguiente comando:

El comando anterior abrirá el puerto 3306 para la IP externa 192.168.1.150. NO es recomendable abrir el puerto para todos los equipos de la red, salvo que fuese estrictamente necesario. Si queremos abrir el puerto para todos los equipos de lared, ejecutaremos el siguiente comando:

A partir de ahora podremos acceder desde el equipo externo con IP 192.168.1.150 y el usuario «gesex» al servidor de MySQL Server.

Crear usuario con permisos limitados para acceso externo a una determinada base de datos

Como ejemplo, vamos a crear un usuario llamado «extlim», que pueda acceder desde un equipo con IP 192.168.1.180 y que pueda acceder únicamente a la base de datos «facturacion», a las tablas «facturas» y «clientes» y que únicamente pueda hacer INSERT (insertar registros), UPDATE (modificar registros) y SELECT (listar registros). Para ello, en primer lugar crearemos el usuario, desde la línea de comandos de MySQL Server (como en los casos anteriores), con:

Le asignaremos los permisos con: