You are on page 1of 6

Usuario MySQL: cmo crear,

borrar y asignar privilegios


SEPTIEMBRE 28, 2014
En esta entrada vamos a ver cmo gestionar usuarios MySQL desde
la lnea de comandos/shell de MySQL. Lo ms bsico 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 gestin de usuarios tambin se puede realizar desde herramientas
grficas y aplicaciones web como por ejemplo phpMyAdmin o el
administrador grfico 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 administracin, en este caso lo
hacemos como root y desde el propio host por lnea 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 contrasea con el parmetro IDENTIFIED
BY. Ms adelante veremos que este paso lo podemos evitar
utilizando directamente el comando GRANT para la creacin del
usuario y asignacin 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 ejecutaramos el siguiente comando:
mysql> CREATE USER foo IDENTIFIED BY 'mypassword';
Query OK, 0 rows affected (0.01 sec)

Tenemos la opcin de especificar la contrasea con su valor en hash.


Este valor debe ser generado anteriormente con la funcin
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 creacin es satisfactoria, pero veris que el usuario nicamente
puede conectarse y visualizar ciertos parmetros 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. Bsicamente GRANT
asigna privilegios al usuarios indicado, y si no existe lo crea.

La sintaxis y modo de uso del comando sera 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 adems le
concedemos el permiso GRANT para que tenga la opcin 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 documentacin oficial de MySQL encontraris informacin 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 adems de la informacin 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 podis 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 ejecucin
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 haramos 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 carcter %. 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 estndar
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 sera la siguiente:
REVOKE privilegios, GRANT OPTION FROM 'usuario'@'host';

La opcin GRANT OPTION slo 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 ms 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 automticamente 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 slo 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 artculo no es


necesario utilizar este modo de recargar los privilegios, slo sera
necesario si crearamos o eliminaramos los usuarios a mano
directamente sin los comandos especficos 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');
BASES DE DATOS BASES DE DATOS, MYSQL, PRIVILEGIOS, USUARIOS. PERMALINK.

You might also like