Cómo crear un nuevo usuario y otorgar permisos en MySQL o MariaDB

MySQL (MariaDB o Percona MySQL) es uno de los sistemas de gestión de bases de datos relacionales de código abierto más populares del mundo. Comúnmente se despliega como parte de la pila LAMP (que significa Linux, Apache, MySQL y PHP) y, en el momento de escribir este artículo, es la base de datos de código abierto más utilizada a nivel global.

Para poder crear un nuevo usuario en MySQL y otorgarle los permisos necesarios, se requiere acceso a una base de datos MySQL. Generalmente, esta base de datos está instalada en un servidor privado virtual que ejecuta un sistema Linux como Ubuntu, aunque los principios descritos en esta guía deberían ser aplicables independientemente de cómo se acceda a la base de datos.

El primer paso es acceder al prompt de MySQL, lo cual se puede hacer usando el usuario root que se crea por defecto durante la instalación. Este usuario tiene privilegios completos sobre el servidor MySQL, lo que significa que tiene control total sobre cada base de datos, tabla, usuario, etc. Por esta razón, es mejor evitar usar esta cuenta fuera de las funciones administrativas.

En los sistemas Ubuntu Linux que ejecutan MySQL 5.7 (y versiones posteriores), el usuario root de MySQL está configurado para autenticarse usando el complemento auth_socket de forma predeterminada en lugar de con una contraseña. Esto significa que es necesario preceder el comando mysql con sudo para invocarlo con los privilegios del usuario root de Ubuntu y así obtener acceso al usuario root de MySQL.

Una vez que se tiene acceso al prompt de MySQL, se puede crear un nuevo usuario con una declaración CREATE USER. La sintaxis general es:

CREATE USER 'nombre_usuario'@'host' IDENTIFIED WITH plugin_autenticacion BY 'contraseña';

Después de CREATE USER, se especifica un nombre de usuario, seguido inmediatamente por un signo @ y luego el nombre de host desde el cual este usuario se conectará. Si solo se planea acceder a este usuario localmente desde el servidor Ubuntu, se puede especificar localhost.

Hay varias opciones al elegir el plugin de autenticación del usuario. El complemento auth_socket mencionado anteriormente puede ser conveniente, ya que proporciona una seguridad sólida sin requerir que los usuarios válidos ingresen una contraseña para acceder a la base de datos. Pero también evita las conexiones remotas, lo que puede complicar las cosas cuando los programas externos necesitan interactuar con MySQL.

Como alternativa, se puede omitir por completo la parte WITH authentication_plugin de la sintaxis para que el usuario se autentique con el complemento predeterminado de MySQL, caching_sha2_password. La documentación de MySQL recomienda este complemento para los usuarios que desean iniciar sesión con una contraseña debido a sus sólidas características de seguridad.

Por ejemplo, se puede ejecutar el siguiente comando para crear un usuario que se autentique con caching_sha2_password:

CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'contraseña';

Después de crear el nuevo usuario, se le pueden otorgar los privilegios apropiados. La sintaxis general para otorgar privilegios de usuario es:

GRANT PRIVILEGIO ON base_datos.tabla TO 'nombre_usuario'@'host';

El valor PRIVILEGIO define qué acciones se le permite realizar al usuario en la base de datos y tabla especificadas. Se pueden otorgar múltiples privilegios al mismo usuario en un solo comando separando cada uno con una coma. También se pueden otorgar privilegios a un usuario de forma global ingresando asteriscos (*) en lugar de los nombres de la base de datos y la tabla.

Por ejemplo, el siguiente comando otorga a un usuario privilegios globales para CREATE, ALTER y DROP bases de datos, tablas y usuarios, así como el poder de INSERT, UPDATE y DELETE datos de cualquier tabla en el servidor:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on . TO 'sammy'@'localhost' WITH GRANT OPTION;

La opción WITH GRANT OPTION permitirá que el usuario de MySQL otorgue cualquier permiso que tenga a otros usuarios en el sistema.

Hay que tener cuidado al otorgar el privilegio ALL PRIVILEGES, ya que proporcionará amplios privilegios de superusuario similares a los privilegios del usuario root. Cualquiera con acceso a este usuario de MySQL tendrá control total sobre cada base de datos en el servidor.

Si es necesario revocar un permiso, la estructura es casi idéntica a la de otorgarlo:

REVOKE tipo_de_permiso ON nombre_base_datos.nombre_tabla FROM 'nombre_usuario'@'host';

Se pueden revisar los permisos actuales de un usuario ejecutando el comando SHOW GRANTS:

SHOW GRANTS FOR 'nombre_usuario'@'host';

Y así como se pueden eliminar bases de datos con DROP, también se puede usar DROP para eliminar un usuario:

DROP USER 'nombre_usuario'@'localhost';

En conclusión, siguiendo este tutorial se ha aprendido cómo agregar nuevos usuarios y otorgarles una variedad de permisos en una base de datos MySQL. A partir de aquí, se podría continuar explorando y experimentando con diferentes configuraciones de permisos para el usuario MySQL, o aprender más sobre algunas configuraciones de MySQL de nivel superior.

La capacidad de gestionar usuarios y permisos de forma granular es fundamental para mantener la seguridad y el control sobre las bases de datos. Limitar los privilegios de cada usuario a solo lo que necesitan para realizar su función ayuda a prevenir accesos no autorizados y modificaciones accidentales o maliciosas de los datos.

MySQL y MariaDB siguen siendo opciones muy populares para todo tipo de aplicaciones web y móviles gracias a su rendimiento, confiabilidad y rica funcionalidad. Dominar la administración de usuarios es una habilidad clave para cualquier desarrollador o administrador de bases de datos que trabaje con estas potentes herramientas de código abierto.