Usuario MySQL: cómo crear, borrar y asignar privilegios

En esta entrada vamos a ver cómo gestionar usuarios MySQL desde la línea de comandos/shell de MySQL. Lo más básico que debemos saber al respecto es crear, borrar y modificar los usuarios así como saber el modo de manejar y asignar o revocar los privilegios que cada usuario va a tener respecto a las bases de datos instaladas en el servidor.

La gestión de usuarios también se puede realizar desde herramientas gráficas y aplicaciones web como por ejemplo phpMyAdmin o el administrador gráfico de MySQL, en este caso vamos a lo que siempre tendremos a mano, la shell de MySQL.

Lo primero que debemos hacer es acceder a la shell de MySQL con un usuario que tenga privilegios de administración, en este caso lo hacemos como root y desde el propio host por línea de comandos:

# mysql -u root -p
 Enter password: **********
 Welcome to the MySQL monitor. Commands end with ; or \g.
 Your MySQL connection id is 12
 Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
 affiliates. Other names may be trademarks of their respective
 owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

Crear usuario MySQL con CREATE USER

El comando “CREATE USER” de MySQL nos va a permitir crear usuarios y asignarles una contraseña con el parámetro “IDENTIFIED BY“. Más adelante veremos que este paso lo podemos evitar utilizando directamente el comando “GRANT” para la creación del usuario y asignación de privilegios en un único paso.

La sintaxis es la siguiente:

CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']

Así pues, si quisieramos crear un usuario llamado “foo” y con clave “mipassword” ejecutaríamos el siguiente comando:

mysql> CREATE USER foo IDENTIFIED BY 'mypassword';
Query OK, 0 rows affected (0.01 sec)

Tenemos la opción de especificar la contraseña con su valor en hash. Este valor debe ser generado anteriormente con la función PASSWORD() de MySQL:

mysql> SELECT PASSWORD('mipassword');
+-------------------------------------------+
| PASSWORD('mipassword')                    |
+-------------------------------------------+
| *CEE870801502ACAD44FA46CA2CA4F58C2B721A67 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> CREATE USER foo IDENTIFIED BY PASSWORD '*CEE870801502ACAD44FA46CA2CA4F58C2B721A67';
Query OK, 0 rows affected (0.01 sec)

Eliminar usuario MySQL

Eliminar un usuario MySQL es sencillo, el comando a utilizar es “DROP USER” seguido del usuario a eliminar:

mysql> DROP USER foo;
Query OK, 0 rows affected (0.00 sec)

Asignar privilegios al usuario con GRANT

Cuando creamos un usuario utilizando CREATE USER, efectivamente la creación es satisfactoria, pero veréis que el usuario únicamente puede conectarse y visualizar ciertos parámetros del servidor. La verdad es que podemos crear directamente los usuarios con el comando GRANT y a la vez asignar los privilegios que queramos respecto a las bases de datos del sistema. Básicamente GRANT asigna privilegios al usuarios indicado, y si no existe lo crea.

La sintaxis y modo de uso del comando sería la siguiente:

GRANT ON privilegios TO 'usuario'@'host_de_conexion'
-> IDENTIFIED BY 'password' WITH GRANT OPTION;

En el siguiente ejemplo, asignamos todos los privilegios posibles al usuario “foo” (si no existe se crea) sobre todas las bases de datos y tablas, para conexiones desde localhost únicamente y además le concedemos el permiso GRANT para que tenga la opción de asignar permisos a otros usuarios:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'foo'@'localhost'
-> IDENTIFIED BY 'mipassword' WITH GRANT OPTION;

Los privilegios disponibles son los siguientes:

ALL PRIVILEGES, ALTER, ALTER ROUTINE, CREATE TABLE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE USER (Permite utilizar CREATE USER, DROP USER, RENAME USER, y REVOKE ALL PRIVILEGES), CREATE VIEW, DELETE, DROP, EXECUTE, FILE, INDEX, INSERT, LOCK TABLES, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHOW DATABASES, SHOW VIEW, SHUTDOWN, SUPER, UPDATE, USAGE, GRANT OPTION.

En la documentación oficial de MySQL encontraréis información y detalle de cada privilegio.

Recordad que el comando HELP de la shell de MySQL os mostrará la ayuda relativa a cada comando. Para encontrar ayuda de GRANT usamos HELP GRANT y vemos que además de la información relativa al comando aparecen varios ejemplos de uso:

mysql> HELP GRANT
[...]
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
[...]

Como podéis observar, cuando los privilegios hacen referencia a bases de datos, tablas o hosts distintos se ejecuta un comando por cada uno de ellos, no se puede englobar todo en una única ejecución ya que se almacena en registros distintos dentro de la tabla de privilegios.

Si quisieramos asignar privilegios a un usuario que va a conectar desde distintos hosts, lo haríamos de modo individual, es decir:

mysql> GRANT ALL ON db1.* TO 'foo'@'host1';
mysql> GRANT ALL ON db1.* TO 'foo'@'host2';

Lo mismo para distintas bases de datos o tablas:

mysql> GRANT ALL ON db1.* TO 'foo'@'localhost';
mysql> GRANT ALL ON db2.* TO 'foo'@'localhost';
mysql> GRANT ALL ON db3.tabla1 TO 'foo'@'localhost';
mysql> GRANT ALL ON db4.tabla1 TO 'foo'@'localhost';

Para asignar un “wildcard” de hosts utilizamos el carácter %. Es decir, de este modo el usuario puede conectar a MySQL desde cualquier host:

mysql> GRANT ALL ON db1.* TO 'foo'@'%';

Visualizar privilegios de un usuario con SHOW GRANTS

El comando SHOW GRANTS sirve para visualizar en la salida estándar de la shell de MySQL los privilegios asignados a un usuario:

mysql> SHOW GRANTS for 'foo'@'localhost';
 +-------------------------------------------------------------------------------+
 | Grants for foo@localhost                                                      |
 +-------------------------------------------------------------------------------+
 | GRANT ALL PRIVILEGES ON *.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '...' |
 +-------------------------------------------------------------------------------+
 1 row in set (0.00 sec)

Revocar privilegios al usuario con REVOKE

Para eliminar privilegios que previamente hemos asignado a un usuario MySQL con el comando GRANT, utilizaremos el comando REVOKE. La sintaxis sería la siguiente:

REVOKE privilegios, GRANT OPTION FROM 'usuario'@'host';

La opción “GRANT OPTION” sólo es necesaria si el usuario ha sido configurado con el privilegio “WITH GRANT OPTION”.

Al igual que a la hora de asignar los privilegios se realiza de forma individual por base de datos, host, tabla, etc. A la hora de revocar es lo mismo:

mysql> SHOW GRANTS for 'foo'@'localhost';
+--------------------------------------------------------------------------------+
| Grants for foo@localhost                                                       |
+--------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '*CEE' |
| GRANT SELECT ON `test`.* TO 'foo'@'localhost'                                  |
+--------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> SHOW GRANTS for 'foo'@'host1';
+--------------------------------------------------------------------------------+
| Grants for foo@host1                                                           |
+--------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'foo'@'host1' IDENTIFIED BY PASSWORD '*CEE8707' |
+--------------------------------------------------------------------------------+
1 row in set (0.01 sec)

Una vez visualizados los privilegios con el comando SHOW GRANTS, eliminamos los que estimemos oportuno:

mysql> REVOKE SELECT ON test.* FROM 'foo'@'localhost';
Query OK, 0 rows affected (0.01 sec)

En el caso de ‘foo’@’localhost’ vemos que tiene todos los privilegios para todas las bases de datos, en lugar de eliminar completamente esa entrada de privilegios podemos hacerla más restrictiva, por ejemplo manteniendo todos los permisos excepto INSERT:

mysql> REVOKE INSERT ON *.* FROM 'foo'@'localhost';
 Query OK, 0 rows affected (0.00 sec)

Y vemos como MySQL automáticamente elimina el privilegio INSERT y mantiene el resto:

mysql> SHOW GRANTS for 'foo'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'foo' on host '%'
mysql> SHOW GRANTS for 'foo'@'localhost';
+---------------------------------------------------------------------------+
| Grants for foo@localhost                                                  |
+---------------------------------------------------------------------------+
| GRANT SELECT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS,
 FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, 
CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, 
REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE,
 CREATE USER, EVENT, TRIGGER ON *.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD
'*CEE870801502ACAD44FA46CA2CA4F58C2B721A67' |
+---------------------------------------------------------------------------+
1 row in set (0.01 sec)

FLUSH PRIVILEGES

El comando “FLUSH PRIVILEGES” sirve para recargar la tabla de privilegios pero sólo es necesario cuando se manipulan directamente las tablas de privilegios ejecutando INSERT, DELETE, etc en lugar de usar los comandos GRANT y REVOKE:

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

Es decir, en los casos que he especificado en este artículo no es necesario utilizar este modo de recargar los privilegios, sólo sería necesario si crearamos o eliminaramos los usuarios “a mano” directamente sin los comandos específicos para ello de MySQL:

mysql> INSERT INTO user
-> VALUES('localhost','foo',mipassword'),
-> 'Y','Y','Y','Y','Y','Y','N','N','N','Y','Y','Y','Y','Y');

9 comentarios en “Usuario MySQL: cómo crear, borrar y asignar privilegios

  1. Buenas, muchas Gracias me sirvió mucho. tenia horas tratando de solucionar una conexión a una base de datos y esto me ayudo demasiado. Excelente aporte

  2. Hola. Saben como hacer que GRANT me devuelva un false, o un true. Por ejemplo, que ponga: SI un usuario tiene estos privilegios TRUE, si no, FALSE. ?

  3. Se pueden quitar privilegios a usuarios que están definidos como administradores. Tengo varios usuarios administradores y solo quiero dejar uno, pero no quiero eliminarlos.
    Muchas gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *