You are on page 1of 6

Usuario MySQL: cómo crear

,
borrar y asignar privilegios
SEPTIEMBRE 28, 2014
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:

Query OK. si quisieramos crear un usuario llamado “foo” y con clave “mipassword” ejecutaríamos el siguiente comando: mysql> CREATE USER foo IDENTIFIED BY 'mypassword'. 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.01 sec) Tenemos la opción de especificar la contraseña con su valor en hash. +-------------------------------------------+ | PASSWORD('mipassword') | +-------------------------------------------+ | *CEE870801502ACAD44FA46CA2CA4F58C2B721A67 | +-------------------------------------------+ 1 row in set (0. y si no existe lo crea.00 sec) Asignar privilegios al usuario con GRANT Cuando creamos un usuario utilizando CREATE USER. Query OK.00 sec) mysql> CREATE USER foo IDENTIFIED BY PASSWORD '*CEE870801502ACAD44FA46CA2CA4F58C2B721A67'. pero veréis que el usuario únicamente puede conectarse y visualizar ciertos parámetros del servidor. Este valor debe ser generado anteriormente con la función PASSWORD() de MySQL: mysql> SELECT PASSWORD('mipassword'). 0 rows affected (0. 0 rows affected (0. . 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.CREATE USER user [IDENTIFIED BY [PASSWORD] 'password'] Así pues. Básicamente GRANT asigna privilegios al usuarios indicado. Query OK. efectivamente la creación es satisfactoria.

CREATE TABLE. En la documentación oficial de MySQL encontraréis información y detalle de cada privilegio. tablas o hosts distintos se ejecuta un comando por cada uno de ellos. Si quisieramos asignar privilegios a un usuario que va a conectar desde distintos hosts. En el siguiente ejemplo. y REVOKE ALL PRIVILEGES).* TO 'foo'@'localhost' -> IDENTIFIED BY 'mipassword' WITH GRANT OPTION..] CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'. SHOW VIEW. UPDATE. INSERT. DELETE. EXECUTE. LOCK TABLES. CREATE TEMPORARY TABLES. CREATE VIEW.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. REPLICATION CLIENT. RENAME USER. FILE. 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 [. SHOW DATABASES.] Como podéis observar. Recordad que el comando HELP de la shell de MySQL os mostrará la ayuda relativa a cada comando. DROP. CREATE ROUTINE. no se puede englobar todo en una única ejecución ya que se almacena en registros distintos dentro de la tabla de privilegios.invoice TO 'jeffrey'@'localhost'.* TO 'jeffrey'@'localhost'. SHUTDOWN. USAGE. PROCESS. es decir: . [. Los privilegios disponibles son los siguientes: ALL PRIVILEGES.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90.. CREATE USER (Permite utilizar CREATE USER.. GRANT USAGE ON *. 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 *. lo haríamos de modo individual. DROP USER. asignamos todos los privilegios posibles al usuario “foo” (si no existe se crea) sobre todas las bases de datos y tablas. REPLICATION SLAVE.. GRANT ALL ON db1. GRANT SELECT ON db2. SUPER. ALTER ROUTINE. INDEX. RELOAD. SELECT. GRANT OPTION. cuando los privilegios hacen referencia a bases de datos. ALTER.

* TO 'foo'@'%'. mysql> GRANT ALL ON db2. .tabla1 TO 'foo'@'localhost'.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '.. Lo mismo para distintas bases de datos o tablas: mysql> GRANT ALL ON db1.' | +-------------------------------------------------------------------------------+ 1 row in set (0. +-------------------------------------------------------------------------------+ | Grants for foo@localhost | +-------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *. Para asignar un “wildcard” de hosts utilizamos el carácter %. GRANT OPTION FROM 'usuario'@'host'. mysql> GRANT ALL ON db3. La opción “GRANT OPTION” sólo es necesaria si el usuario ha sido configurado con el privilegio “WITH GRANT OPTION”..00 sec) Revocar privilegios al usuario con REVOKE Para eliminar privilegios que previamente hemos asignado a un usuario MySQL con el comando GRANT.* TO 'foo'@'host2'. 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'.mysql> GRANT ALL ON db1.tabla1 TO 'foo'@'localhost'. La sintaxis sería la siguiente: REVOKE privilegios.* TO 'foo'@'localhost'.* TO 'foo'@'localhost'. de este modo el usuario puede conectar a MySQL desde cualquier host: mysql> GRANT ALL ON db1. mysql> GRANT ALL ON db4. mysql> GRANT ALL ON db1. Es decir.* TO 'foo'@'host1'. utilizaremos el comando REVOKE.

Query OK.01 sec) En el caso de ‘foo’@’localhost’ vemos que tiene todos los privilegios para todas las bases de datos.00 sec) mysql> SHOW GRANTS for 'foo'@'host1'. Query OK. eliminamos los que estimemos oportuno: mysql> REVOKE SELECT ON test. +--------------------------------------------------------------------------------+ | Grants for foo@localhost | +--------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *. . 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 *.* TO 'foo'@'host1' IDENTIFIED BY PASSWORD '*CEE8707' | +--------------------------------------------------------------------------------+ 1 row in set (0. +--------------------------------------------------------------------------------+ | Grants for foo@host1 | +--------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'foo'@'localhost' | +--------------------------------------------------------------------------------+ 2 rows in set (0.Al igual que a la hora de asignar los privilegios se realiza de forma individual por base de datos. A la hora de revocar es lo mismo: mysql> SHOW GRANTS for 'foo'@'localhost'. 0 rows affected (0. ERROR 1141 (42000): There is no such grant defined for user 'foo' on host '%' mysql> SHOW GRANTS for 'foo'@'localhost'.* FROM 'foo'@'localhost'. tabla. 0 rows affected (0.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '*CEE' | | GRANT SELECT ON `test`.01 sec) Una vez visualizados los privilegios con el comando SHOW GRANTS.* FROM 'foo'@'localhost'. etc. host.00 sec) Y vemos como MySQL automáticamente elimina el privilegio INSERT y mantiene el resto: mysql> SHOW GRANTS for 'foo'@'%'.

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'.'N'. CREATE ROUTINE.'Y'. CREATE USER.DELETE.'Y'. DELETE. 0 rows affected (0. FILE.01 sec) Es decir.'Y'. SUPER.'Y'.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '*CEE870801502ACAD44FA46CA2CA4F58C2B721A67' | +---------------------------------------------------------------------------+ 1 row in set (0. PRIVILEGIOS.'N'. UPDATE.+---------------------------------------------------------------------------+ | Grants for foo@localhost | +---------------------------------------------------------------------------+ | GRANT SELECT. .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. USUARIOS. EVENT. EXECUTE. DROP. etc en lugar de usar los comandos GRANT y REVOKE: mysql> FLUSH PRIVILEGES. CREATE TEMPORARY TABLES. Query OK. INDEX.'Y'. CREATE VIEW. SHOW VIEW.'Y'. REPLICATION CLIENT. LOCK TABLES. SHOW DATABASES. en los casos que he especificado en este artículo no es necesario utilizar este modo de recargar los privilegios. ALTER. ALTER ROUTINE. PERMALINK. TRIGGER ON *. PROCESS.'foo'. REFERENCES.'N'. REPLICATION SLAVE.mipassword'). MYSQL.'Y'). RELOAD.'Y'. CREATE.'Y'. -> 'Y'.'Y'. BASES DE DATOS BASES DE DATOS. SHUTDOWN.