En muchas ocasiones nos veremos en la tarea de desarrollar una web o app en equipo. Si esta web o app depende de una base de datos (en la mayoría de los casos) la primera idea es intalarte una base de datos en el equipo local, donde vas a desarrollar la aplicación.

El principal inconveniente de esto es que cada miembro del equipo tendrá una base de datos distinta. Imaginad un blog creado en Wordpress, donde cada miembro del equipo tiene unos datos distintos en la base de datos. Si quieres datos de prueba, cada miembro del equipo tendrá que dar de alta los datos a mano, por ejemplo creando entradas o páginas, una pérdida de tiempo desde mi punto de vista.

En el  mejor de los casos, los miembros del equipo pueden importarse una copia de una base de datos de algún otro miembro que ya haya dado de alta estos datos. Pero esto seguiría produciendo algunos inconvenientes.

Una posible solución que se ha usado es tener un equipo (PC), físico o virtual, usado como servidor de base de datos y accesible por todos los miembros del equipo de desarrollo.

En este caso, vamos a ver como instalar un MySQL Server 5.7.x en Ubuntu Server (16 o 18) y los pasos posteriores a seguir para conseguir este objetivo.

Instalar MySQL Server

Si tenemos preparado el servidor vamos a por los primeros pasos:

sudo apt-get install update
sudo apt-get install mysql-server mysql-client

Tras la instalación tenemos que lanzar una aplicación de MySQL para segurizar la instalación en la que, por ejemplo, nos pedirá la contraseña para el usuario root de MySQL.

sudo mysql_secure_installation

Nos preguntará varias cosas, entre ellas: si queremos permitir una conexión remota con el usuario administrador, si queremos eliminar o mantener en las bases de datos de prueba y (creo recordar) si queremos mantener algunos usuarios creados tipo test. En todas ellas, para mi le suelo decir que no, aunque esto depende de ti.

Configuración de usuarios

Por defecto, en la instalación de MySQL el usuario administrador (recuerda, es root) en Ubuntu 16.xx y 18.xx solo podrá ser accedido con el usuario con permisos de administrador del Sistema Operativo. ¿Esto qué quiere decir? Pues que tendremos que añadir sudo para poder acceder con el usuario root a la base de datos:

sudo mysql -u root -h localhost -p

¿Podemos cambiar esto? Sí y podéis verlo en el artículo Change user password in MySQL 5.7 with "plugin: auth_socket". Considero que  lo correcto será crear un usuario tipo DBA con acceso a todas las bases de datos con permisos de administrador, pero algunos menos que el usuario root.

Pienso (no lo he comprobado) que esto es debido a que MySQL ha implementado medidas de seguridad para dificultar el acceso a la base de datos, forzandonos a mantener buenas prácticas en este sentido y no permitiendo acceder con root desde cualquier PC o aplicación.

Para mantener estas buenas prácticas, en las siguientes líneas voy a crear dos usuario: uno con el que acceder a la base de datos desde el Sistema Operativo y otro para una supuesta aplicación.

Usuario supersa

Veamos como crear un nuevo usuario con el que podamos crear bases de datos para nuestras aplicaciones. Como ya nos logamos en MySQL con el usuario root, lanzaremos el siguiente comando para crear un usuario:

CREATE USER 'user-name'@'localhost' IDENTIFIED BY 'new-password';

Ahora le concedemos permisos para toooodaaaaas las bases de datos:

GRANT ALL PRIVILEGES ON * . * TO 'user-name'@'localhost';

Y por último refrescamos los permisos concedidos:

FLUSH PRIVILEGES;

Salimos de la consola de MySQL escribiendo el comando exit y ahora podemos volver a logarnos con el usuario creado:

mysql -u user-name -h localhost -p

Ahora sí, sin necesidad de usar permisos de administrador del Sistema Operativo.

Usuario aplicación

Como seguimos logados con el usuario supersa (o el nombre que hayas escogido), primero vamos a crear una base de datos para nuestra aplicación ficticia. Imaginad que queremos crear un base de datos para una aplicación web basada en Drupal:

CREATE DATABASE drupal;

Una vez tenemos la base de datos, ahora toca crear un usuario específico para manejar esta base de datos:

CREATE USER 'user-drupal'@'%' IDENTIFIED BY 'password-user-drupal';

En esta ocasión, con el uso del % le indicamos que podremos acceder con este usuario desde cualquier lugar (otro PC o servidor), no solo la máquina local. Esto es inseguro por naturaleza. Por ello podríamos modificar este comando por algo que nos permita cierto equilibrio entre seguridad y flexibilidad. Por ello, en lugar de usar el % podemos usar una IP:

CREATE USER 'user-drupal'@'IP-Server' IDENTIFIED BY 'password-user-drupal';

También podríamos usar un rango de IP's, por ejemplo en un servidor interno:

CREATE USER 'user-drupal'@'10.1.0.*' IDENTIFIED BY 'password-user-drupal';

Ahora vamos a dar permisos a este usuario para acceder a la base de datos antes creada. La forma en la que hayamos creado el usuario también la usaremos a la hora de conceder estos permisos:

GRANT ALL PRIVILEGES ON drupal.* TO 'user-drupal'@'[localhost] o [%] o [IP-Server]';

De esta forma hemos dado todos los permisos que nos han sido posibles para esta base de datos. También podemos limitar estos permisos con una sentencia similar a esta:

GRANT SELECT,DELETE,INSERT,UPDATE ON drupal.* TO 'user-drupal'@'[localhost] o [%] o [IP-Server]';

y por último, al igual que hicimos con el usuario supersa lo hacemos con este usuario:

FLUSH PRIVILEGES;

Eliminar permisos a un usuario de base de datos

Para eliminar permisos a un usuario de base de datos usaremos la sentencia REVOKE. La sentencia es similar a como lo hicimos con la sentencia GRANT.

REVOKE ALL PRIVILEGES ON  schemaName.* TO 'userName'@'[localhost] o [%] o [IP-Server]';

Por ejemplo, para eliminar todos los permisos que dimos al usuario user-drupal al esquema de base de datos de drupal, ejecutaremos la siguiente sentencia:

REVOKE ALL PRIVILEGES ON drupal.* TO 'user-drupal'@'[localhost] o [%] o [IP-Server]';

Si lo que deseamos es solo eliminar uno o varios permisos del usuario, podemos modificar la sentencia como sigue:

REVOKE SELECT,DELETE,INSERT,UPDATE ON drupal.* TO 'user-drupal'@'[localhost] o [%] o [IP-Server]';

y por último, al igual que hacemos cada vez que modificamos los permisos de usuario, refrescamos los permisos o privilegios del usuario ejecutando la siguiente sentencia:

FLUSH PRIVILEGES;

Eliminar un usuario

Si es el caso y queremos eliminar un usuario de base de datos podemos o debemos ejecutar la sentencia DROP.

DROP USER '[nameuser]'@'[localhost] o [%] o [IP-Server]';

Para nuestro caso de ejmplo, con el usuario user-drupal sería así:

DROP USER 'user-drupal'@'%';

Configuración de MySQL para acceso remoto

Por último, debemos configurar MySQL Server para permitir el acceso remoto. Para ello vamos debemos editar un fichero de configuración de MySQL. En mi distribución es el siguiente:

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

En otras distribuciones también puede ser:

sudo vi /etc/mysql/my.cnf

En tal caso hay que buscar lo siguiente:

# 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

y comentar la línea bind-address con #, quedando algo así:

# 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

Por último debemos reiniciar el servicio de MySQL:

sudo service mysql restart

Y con esto ya tenemos preparado nuestro servidor de desarrollo de MySQL con acceso remoto.

Ya desde nuestra máquina, y teniendo instalado un cliente MySQL:

sudo apt-get install mysql-client

podemos testear la conexión a la base de datos con el usuario asignado:

mysql -u user-drupal -h IP-Server-MySQL -p

Enlaces realcionados