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.
- Actualizar lista de paquetes de Linux Ubuntu y paquetes pendientes de actualizar.
- Instalar MySQL Server en Linux Ubuntu Server 22.
- Securizar MySQL Server, establecer contraseña para root.
- Crear usuario administrador en MySQL Server de acceso local.
- Crear usuario administrador de MySQL Server de acceso externo.
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:
1 |
sudo apt update |
Si hay algún paquete pendiente de actualizar, que podemos listar con el comando:
1 |
apt list --upgradable |
Los podremos actualizar con el comando:
1 |
sudo apt upgrade |
Instalar MySQL Server en Linux Ubuntu Server 22
Para instalar MySQL Server, ejecutaremos el siguiente comando:
1 |
sudo apt install mysql-server -y |
Puede que nos muestre el siguiente mensaje, pulsaremos OK:
Tras la instalación de MySQL, verificaremos que el servicio está iniciado, con el comando:
1 |
sudo systemctl status mysql |
Devolverá algo así como:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2023-11-09 06:59:36 UTC; 14min ago Process: 20304 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/S Main PID: 20316 (mysqld) Status: "Server is operational" Tasks: 37 (limit: 9389) Memory: 365.3M CPU: 6.957s CGroup: /system.slice/mysql.service └─20316 /usr/sbin/mysqld nov 09 06:59:35 svmysql systemd[1]: Starting MySQL Community Server... nov 09 06:59:36 svmysql systemd[1]: Started MySQL Community Server. |
También podremos comprobar que el servicio de MySQL está activo ejecutando el comando:
1 |
systemctl is-active mysql |
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:
1 |
sudo systemctl enable mysql |
Que devolverá
1 2 |
Synchronizing state of mysql.service with SysV service script with /lib/systemd/systemd-sysv-inst Executing: /lib/systemd/systemd-sysv-install enable mysql |
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:
1 |
sudo mysql_secure_installation |
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).
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».
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».
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.
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.
A continuación, estableceremos una contraseña para el superusuario root de MySQL Server. para ello, ejecutaremos el siguiente comando:
1 |
sudo mysql |
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:
1 |
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'la_contraseña'; |
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:
1 |
flush privileges; |
Y cerraremos la consola de MySQL con el comando:
1 |
exit |
Ahora, si intentamos acceder a MySQL Server con el comando anterior:
1 |
sudo mysql |
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:
1 |
mysql -u root -p |
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:
1 |
sudo mysql -u root -p |
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:
1 |
CREATE USER 'ges'@'localhost' IDENTIFIED BY 'la_contraseña'; |
Para establecer los permisos de aministrador sobre todas las bases de datos, para el usuario anterior «ges», introduciremos el siguiente comando:
1 |
GRANT ALL PRIVILEGES ON *.* TO 'ges'@'localhost' WITH GRANT OPTION; |
Aplicaremos los cambios con:
1 |
flush privileges; |
Y cerraremos sesión con:
1 |
exit; |
Probaremos el nuevo usuario creado, accediendo a MySQL Server con él, con el comando:
1 |
mysql -u ges -p |
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:
1 |
show databases; |
Acceder a una de ellas:
1 |
use mysql; |
Y listar todas sus tablas:
1 |
show tables; |
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):
1 |
CREATE USER 'gesex'@'192.168.1.150' IDENTIFIED BY 'la_contraseña'; |
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»:
1 |
GRANT ALL PRIVILEGES ON *.* TO 'gesex'@'192.168.1.150' WITH GRANT OPTION; |
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:
1 |
GRANT ALL PRIVILEGES ON *.* TO 'gesex'@'%' WITH GRANT OPTION; |
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:
1 |
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf |
En la sección [mysqld] buscaremos la línea:
1 |
bind-address = 127.0.0.1 |
Que comentaremos añadiendo un «#» delante, quedando:
1 |
#bind-address = 127.0.0.1 |
Y añadiremos la línea:
1 |
bind-address = 0.0.0.0 |
Que será la que permita el acceso externo. Guardaremos los cambios pulsando Control + X y cerraremos la edición pulsando Control + X.
Reiniciaremos el servicio de MySQL para que se apliquen los cambios, con el comando:
1 |
sudo systemctl restart mysql |
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:
1 |
sudo ufw allow from 192.168.1.150 to any port 3306 |
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:
1 |
sudo ufw allow 3306 |
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:
1 |
CREATE USER 'extlim'@'localhost' IDENTIFIED BY 'la_contraseña'; |
Le asignaremos los permisos con:
1 2 |
GRANT SELECT, INSERT, UPDATE ON facturacion.facturas TO 'extlim'@'192.168.1.180'; GRANT SELECT, INSERT, UPDATE ON facturacion.clientes TO 'extlim'@'192.168.1.180'; |