GNU/Linux, Open Source, Cloud Computing, DevOps y más...

ᐈ Cómo crear un usuario en MySQL/MariaDB y concederle permisos para una base de datos desde la línea de comandos

14 comentarios

Logos de MariaDB y MySQLLa tarea de crear un usuario en MySQL o en MariaDB y asignarle privilegios para poder acceder a una base de datos específica y poder escribir información en ella es una tarea muy habitual que es necesario realizar cada vez que instalamos una aplicación destinada a correr sobre plataforma LAMP. Ya sea un simple WordPress, o una aplicación más compleja desarrollada a medida, de un modo u otro siempre vas a tener que llevar a cabo estos pasos en algún momento antes de poder ponerla en funcionamiento.

Estos comandos son válidos para ser ejecutados tanto desde la consola o línea de comandos del cliente genérico de MySQL como desde cualquier herramienta que nos permita ejecutar comandos SQL sobre una instalación de MySQL como phpMyAdmin o MySQL Workbench. También sirven para conseguir el mismo objetivo en MariaDB.

1. Creación de la base de datos

mysql> CREATE DATABASE `mibd`;

2. Creación del usuario

mysql> CREATE USER 'miusuario'@localhost IDENTIFIED BY 'mipassword';

3. Conceder permisos para poder acceder y usar el servidor MySQL

Para sólo permitir el acceso local desde el propio servidor (localhost). Esta será la configuración más segura y más habitual que usaremos para una aplicación web:

mysql> GRANT USAGE ON *.* TO 'miusuario'@localhost IDENTIFIED BY 'mipassword';

Para permitir el acceso desde cualquier otra máquina que tenga acceso al servidor MySQL desde la red:

mysql> GRANT USAGE ON *.* TO 'miusuario'@'%' IDENTIFIED BY 'mipassword';

En MySQL 8 o superior no pondremos la parte IDENTIFIED BY ‘mipassword’.

4. Conceder todos los privilegios sobre la base de datos al usuario

MySQL 5.7 y versiones anteriores:

mysql> GRANT ALL privileges ON `mibd`.* TO 'miusuario'@localhost IDENTIFIED BY 'mipassword';

MySQL 8 y versiones superiores:

mysql> GRANT ALL ON `mibd`.* TO 'miusuario'@localhost;

Al igual que en punto anterior, si queremos que el usuario pueda trabajar con la base de datos desde cualquier ubicación tendremos que sustituir localhost por ‘%’.

5. Aplicar los cambios realizados

Para que sean efectivos los nuevos permisos que hemos asignado debemos finalizar con el siguiente comando:

mysql> FLUSH PRIVILEGES;

6. Verificar que nuestro nuevo usuario tiene los permisos correctos

mysql> SHOW GRANTS FOR 'miusuario'@localhost;     
+--------------------------------------------------------------+ 
| Grants for miusuario@localhost                                | 
+--------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'miusuario'@'localhost'                 | 
| GRANT ALL PRIVILEGES ON `mibd`.* TO 'miusuario'@'localhost' | 
+--------------------------------------------------------------+ 
2 rows in set (0,00 sec)

Si nos hemos equivocado en algún punto podemos deshacer todos los pasos ejecutando los siguientes comandos, teniendo la precaución de sustituir localhost por ‘%’ si también lo cambiaste en los pasos anteriores. Luego podrás volver de nuevo a crear tu usuario MySQL volviendo al principio:

DROP USER miusuario@localhost;
DROP DATABASE midb;

A continuación dejo un pequeño script muy simple para Bash que nos permite hacer esto en Linux de una forma mucho más rápida y directa, cambiando simplemente el nombre de nuestro usuario y de nuestra base de datos:

#! /bin/bash 
 
newUser='testuser'
newDbPassword='testpwd'
newDb='testdb'
host=localhost
#host='%'

# MySQL 5.7 and earlier versions
#commands="CREATE DATABASE \`${newDb}\`;CREATE USER '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';GRANT USAGE ON *.* TO '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';GRANT ALL privileges ON \`${newDb}\`.* TO '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';FLUSH PRIVILEGES;"

# MySQL 8 and higher versions
commands="CREATE DATABASE \`${newDb}\`;CREATE USER '${newUser}'@'${host}' IDENTIFIED BY '${newDbPassword}';GRANT USAGE ON *.* TO '${newUser}'@'${host}';GRANT ALL ON \`${newDb}\`.* TO '${newUser}'@'${host}';FLUSH PRIVILEGES;"

echo "${commands}" | /usr/bin/mysql -u root -p


 

Sobre el autor

Daniel López Azaña
Arquitecto de soluciones Cloud AWS & Linux Sysadmin Freelance

Emprendedor, generador de ideas y mente inquieta. Apasionado de las nuevas tecnologías, especialmente de los sistemas Linux y del software libre. Me gusta escribir además sobre actualidad tecnológica, Cloud Computing, AWSi, DevOps, DevSecOps, seguridad, desarrollo web y programación, SEO, ciencia, innovación, emprendimiento, etc.

Danielᐈ Cómo crear un usuario en MySQL/MariaDB y concederle permisos para una base de datos desde la línea de comandos

Artículos relacionados

14 comentarios

Unirte a la conversación
  • Ch - 25/07/2018 responder

    En versiones más recientes este código tal vez funcione mejor, saludos

    Tuyo:
    GRANT ALL privileges ON `mibd`.* TO ‘miusuario’@localhost;

    Mío:
    GRANT ALL PRIVILEGES ON mibd.* TO ‘miusuario’@’%’ WITH GRANT OPTION;

    Aldair - 15/08/2018 responder

    Muchas gracias a ambos, al del post y a Ch.

    Luis - 25/10/2018 responder

    NO utilizar «WITH GRANT OPTION» ya que le dara todos los privilegios de root al otro usuario.

    Leonel - 24/09/2019 responder

    Negativo, al agregar «WITH GRANT OPTION;» le estas dando privilegios de superusuario lo cual puede no ser seguro.

  • José - 31/10/2018 responder

    Muchas gracias por el artículo. Me gustaría saber qué lenguaje utilizar si quiero crear usuarios dinámicamente. Gracias desde ya.

    Daniel - 08/11/2018 responder

    Cualquier lenguaje que disponga de un driver o extensión para acceder a MySQL, y eso en la práctica es cualquier lenguaje de programación, pues MySQL es una base de datos ampliamente extendida.

    Francisco Jose Muñoz - 07/08/2019 responder

    Muchas Gracias Daniel. Tu aporte me ha sido de gran ayuda.

  • María - 08/06/2019 responder

    Un millón de gracias !!!

  • Mario González - 15/02/2020 responder

    Bueno dias
    En la version de MariaDB 10.4.8 y posteriores (actualmente tengo instalada la 10.4.12)
    Al realizar el proceso arriba indicado; en la Tabla user, en el campo Password; NO se guarda la password.
    ahora se puede ver que, en el campo:
    plugin= ‘mysql_native_password’ y, en el campo contiguo
    authentication_string= la password encriptada

    Ahora bien. Al intentar ingresar con el nuevo usuario y clave; no lo acepta, mostrando el msj: acceso denegado para el usuario…

    Si hago:
    SET PASSWORD FOR ‘usuario’@’localhot’ = PASSWORD(‘passw’);
    Ocurre lo arriba explicado

    Cual es la forma?

    Daniel - 17/02/2020 responder

    Si se usa el comando SET PASSWORD hay que pasarle la contraseña como una cadena en texto plano, ya que si se usa la función PASSWORD() se estará cifrando la misma dos veces: la primera por la función PASSWORD() y la segunda por MySQL/MariaDB de forma interna. La función PASSWORD() la podemos usar si hacemos directamente un UPDATE de la columna password de la tabla de usuarios, pero no con el comando SET PASSWORD.

  • Matías - 29/05/2020 responder

    Hola Daniel. Este tal vez sea el artículo más sencillos que leí sobre Linux en español y en relación a mariadb.

    Instalé hace unos días Debian para gestionar mi primer proyecto online, y esta guía me pareció super didáctica.

    Saludos desde Argentina y muchas gracias!!

  • Elizabeth - 15/04/2021 responder

    Es valido crear los usuarios y después las bases de datos? son muchas bases de datos y pocos usuarios.

    Daniel - 15/04/2021 responder

    Perfectamene válido.

  • Elizabeth - 13/05/2021 responder

    Debo crear un usuario para la herramienta de backup y restauraciones BD. Como asigno este rol o permisos especificos al nuevo usuario?

Deja una respuesta

Tu dirección de correo electrónico no será publicada.