Introduccion
En esta parte del minicursillo de mysql
veremos los permisos en los usuarios en mysql, es muy importante ya que de esta manera podemos especificar cosas como son: si tiene permisos de leer archivos del servidor, si tiene permisos de conectarse tantas veces a la base de datos, de hacer tantas consultas, de ver algunas bases de datos, columnas, filas, etc....
Usuarios Y Privilegios
Empecemos definiendo como esta creado un usuario, es decir, como puede ser identificado por el servidor, de manera que los haya dos usuarios con el mismo nombre pero el servidor pueda identificarlos como dos usuarios diferentes....
Por ejemplo, podemos tener dos usuarios con el nombre
joe:
joe@localhost
joe@192.168.1.2
Con esto indicariamos que hay dos usuarios diferentes llamados joe, uno desde la maquina local y otro desde otra maquina que esta en la subred...
El arroba lo usamos como un tipo de separador!, entonces tenemos dos identificadores en mysql en este caso seria
el user y el host... todo esto se puede conseguir desde la base de datos de mysql.... Por ejemplo:
En el caso de esta imagen, tengo una consulta como la siguiente:
select user,host,password from mysql.user;
me muestra 8 filas.... en este caso solo tengo en realidad 3 usuarios....
¿Por que solo tres usuarios? Pues por que el usuario root es el mismo para todo por que siempre esta indicando al mismo host en este caso localhost, arthusu-PC,127.0.0.1,::1 son el mismo host pero puede interpretarse de diferente manera como lo ves en la imagen....
Tambien podemos encontrar muchas columnas y filas interesantes en la base de datos mysql:
| Nombre tabla |
user |
db |
host |
| Alcance columnas |
Host |
Host |
Host |
| |
User |
Db |
Db |
| |
Password |
User |
|
| Columnas privilegios |
Select_priv |
Select_priv |
Select_priv |
| |
Insert_priv |
Insert_priv |
Insert_priv |
| |
Update_priv |
Update_priv |
Update_priv |
| |
Delete_priv |
Delete_priv |
Delete_priv |
| |
Index_priv |
Index_priv |
Index_priv |
| |
Alter_priv |
Alter_priv |
Alter_priv |
| |
Create_priv |
Create_priv |
Create_priv |
| |
Drop_priv |
Drop_priv |
Drop_priv |
| |
Grant_priv |
Grant_priv |
Grant_priv |
| |
Create_view_priv |
Create_view_priv |
Create_view_priv |
| |
Show_view_priv |
Show_view_priv |
Show_view_priv |
| |
Create_routine_priv |
Create_routine_priv |
|
| |
Alter_routine_priv |
Alter_routine_priv |
|
| |
References_priv |
References_priv |
References_priv |
| |
Reload_priv |
|
|
| |
Shutdown_priv |
|
|
| |
Process_priv |
|
|
| |
File_priv |
|
|
| |
Show_db_priv |
|
|
| |
Super_priv |
|
|
| |
Create_tmp_table_priv |
Create_tmp_table_priv |
Create_tmp_table_priv |
| |
Lock_tables_priv |
Lock_tables_priv |
Lock_tables_priv |
| |
Execute_priv |
|
|
| |
Repl_slave_priv |
|
|
| |
Repl_client_priv |
|
|
| Columnas seguridad |
ssl_type |
|
|
| |
ssl_cipher |
|
|
| |
x509_issuer |
|
|
| |
x509_subject |
|
|
| Columnas recursos control |
max_questions |
|
|
| |
max_updates |
|
|
| |
max_connections |
|
|
| |
max_user_connections |
|
Desde la cual podriamos modificar todo lo que estamos viendo en este minitutorial.... como ver los privilegios, modificarlos, eliminar un usuario, etc todo usando un usuario con los suficientes privilegios y algunas consultas que podemos hacer con lo anteriormente aprendido :) seria una buena forma de dejarles una tarea :D ja!
Otra forma de saberlo seria, por ejemplo si estamos conectados a la base de datos:
select current_user();
Como puedes ver el user que estoy usando actualmente es root@localhost
Crear una cuenta de usuario
Veremos como crear una cuenta de usuario con el comando CREATE USER, para ello veremos primero su sintaxis que es la siguiente:
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
La sintaxis la he tomado desde la pagina oficial de mysql, en este caso solo debo definir algunos puntos....
CREATE USER - el comando para crear un usuario
user - el nombre del usuario en este caso puede ser el que tu quieras, por ejemplo: arthusuBLOG
Luego sigue algo como esto
[] todo lo que este encerrado entre esos corchetes es opcional, es decir, lo ponemos si nosotros queremos pero si no queremos no, es mas bien si lo ocupamos o no....
IDENTIFIED BY [PASSWORD] - especificamos la contraseña que queremos que tenga ese usuario
Entonces ya sabemos como funciona la sintaxis estamos listo para hacer nuestra consulta de crear un usuario, no sin antes decir, que
para poder crear un usuario primero que nada en el usuario que me encuentro en este momento
debe tener privilegios de CREATE USER o INSERT en la base de datos mysql....
podemos ver los privilegios del usuario que deseemos de esta manera:
SHOW GRANTS FOR user;
donde user es el usuario que deseas ver los permisos que tiene o privilegios....
Como podemos ver en este caso tengo todos los privilegios en todas las bases de datos... para saber los privilegios puedo ver la lista:
| Privilegio |
Columna |
Contexto |
CREATE |
Create_priv |
bases de datos, tablas, o índices |
DROP |
Drop_priv |
bases de datos o tablas |
GRANT OPTION |
Grant_priv |
bases de datos, tablas, o procedimientos almacenados |
REFERENCES |
References_priv |
bases de datos o tables |
ALTER |
Alter_priv |
tablas |
DELETE |
Delete_priv |
tablas |
INDEX |
Index_priv |
tablas |
INSERT |
Insert_priv |
tablas |
SELECT |
Select_priv |
tablas |
UPDATE |
Update_priv |
tablas |
CREATE VIEW |
Create_view_priv |
vistas |
SHOW VIEW |
Show_view_priv |
vistas |
ALTER ROUTINE |
Alter_routine_priv |
procedimientos almacenados |
CREATE ROUTINE |
Create_routine_priv |
procedimientos almacenados |
EXECUTE |
Execute_priv |
procedimientos almacenados |
FILE |
File_priv |
acceso a archivos en la máquina del servidor |
CREATE TEMPORARY TABLES |
Create_tmp_table_priv |
administración del servidor |
LOCK TABLES |
Lock_tables_priv |
administración del servidor |
CREATE USER |
Create_user_priv |
administración del servidor |
PROCESS |
Process_priv |
administración del servidor |
RELOAD |
Reload_priv |
administración del servidor |
REPLICATION CLIENT |
Repl_client_priv |
administración del servidor |
REPLICATION SLAVE |
Repl_slave_priv |
administración del servidor |
SHOW DATABASES |
Show_db_priv |
administración del servidor |
SHUTDOWN |
Shutdown_priv |
administración del servidor |
SUPER |
Super_priv |
administración del servidor |
Esta tabla ha sido tomada de la pagina oficial de mysql...
Entonces creo nuestro usuario que en este caso se llamara arthusublog y su host sera localhost y la contraseña sera mipass... en este caso utilice la funcion PASSWORD() para que me generara un hash de mysql v5 y lo pegue tal como texto plano :D
CREATE USER arthusu@localhost IDENTIFIED BY '*EA8CE51785AFEB6794A7F248E0D0F86C9A494E29 ';
Otra cosa que pasa es que este usuario no puede ser usado por que nos mandara un mensaje de error como el siguiente:
Esto se debe a que le usuario existe pero no tiene permisos de nada, ni siquera de entrar... xD
Entonces le asignare todos los permisos, en este caso, aunque podria ser de diferente manera y no asignar solo permisos especificos, pero como en este caso no estamos viendo a profundidad el comando GRANT entonces solo explicaremos que es lo que que hace el siguiente comando:
En este caso le damos
todos los privilegios al usuario arthusu@localhost y despues
actualizamos los privilegios con flush privileges.... esto es muy importante por que si no lo hacemos no nos dejara entrar... ya que los privilegios no serian actualizados y no tomaria la consulta anterior...
con esto podriamos decir que tenemos otro usuario administrativo :P
Entonces accedemos a el, esto lo vimos si no estoy mal de memoria en la primera parte.
mysql -u arthusublog -p mipass
Renombrar un usuario
En este caso veremos como renombrar el usuario que acabamos de crear que en este caso en
arthusublog lo renombraremos a arthusu para eso usaremos el comando
RENAME USER, la sintaxis es la siguiente:
RENAME USER old_user TO new_user
[, old_user TO new_user] ...
RENAME USER - lo que hace es renombrar un usuario
old_user - es el usuario actual
new_user - es el nuevo nombre que le daremos al usuario
[,old_user TO new_user] - esto es opcional podemos indicar mas de 1 usuario a renombrar especificando una coma despues de el otro usuario :P
Veamos en un ejemplo:
Dar privilegios y Quitar Privilegios
Para conceder o dar privilegios usamos el comando
GRANT, su sintaxis es la siguiente:
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject']]
[WITH with_option [with_option] ...]
object_type =
TABLE
| FUNCTION
| PROCEDURE
with_option =
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
Si es un poco larga por que tiene su lista de opcionales :D
Antes de continuar quiero decirles que para poder dar privilegios el usuario que utilices necesita tener activada la opcion
GRANT OPTION.
En este caso explicaremos lo mas utilizado:
GRANT - concede privilegios
priv_type - El tipo de privilegio, por ejemplo: SELECT,ALTER,ALTER,INSERT,UPDATE,etc todo esto lo puedes ver en la segunda tabla de arriba :D
ON - indica que sigue un object_type que es una tabla,funcion o procedimiento, o sigue una tabla o una database... o *.* que seria cualquiera, el simbolo * es el que significa cualquiera o todo....
TO - luego de el sigue el usuario donde tambien si quisieramos modificar la constraseña podriamos indicarla...
WITH - indica algunas cosas interesantes como puede ser lo que el usuario puede hacer, como por ejemplo: maximo de conecciones por hora, el maximo de peticiones por hora, etc...
Veamos un ejemplo, con el usuario que tenemos
arthusuxd no queremos que tenga todo el control sino que solo pueda
realizar select (coger datos) solo en
la base de datos mysql y que solo pueda realizar
5 peticiones por hora....
Pero antes de poder darle privilegios a este usuario primero debemos revocarle o quitarle los permisos que tenia anteriormente que eran todos....
Esto lo hacemos con
REVOKE...Su sintaxis es:
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ...
REVOKE - quita privilegios
priv_type - El tipo de privilegio, por ejemplo:
SELECT,ALTER,ALTER,INSERT,UPDATE,etc todo esto lo puedes ver en la
segunda tabla de arriba :D
ON - indica que sigue un object_type que es una tabla,funcion o
procedimiento, o sigue una tabla o una database... o *.* que seria
cualquiera, el simbolo * es el que significa cualquiera o todo....
FROM user - indica el usuario a revocar o quitar privilegios donde user vendria siendo el usuario al que le quieres quitar privilegios...
En este caso
le quito todos los privilegios que tenia y luego
actualizo la lista de privilegios, con esto
cuando muestro los privilegios de ese usuario solo se queda con
USAGE que en realidad significa que
no tiene ningun privilegio :P
Ahora si le daremos los privilegios que anteriormente queriamos tener:
Estamos listos para probar esos privilegios:
Como puedes ver hemos sobrepasado las 5 peticiones por hora :D
Pero en este caso si quisieramos reiniciar de nuevo las peticiones hacemos una actualizacion en la base de datos mysql en la columna max_questions del usuario arthusu@localhost y lo dejariamos a 10 por ejemplo :D.....
Con esto tendriamos 10 consultas XD....
Eliminar un usuario
Por ultimo si ya no quisieramos usar ese usuario simplemente lo eliminamos :D
La sintaxis es la siguiente:
DROP USER user [, user] ...
DROP USER - indica que se va eliminar un usuario
user- es el nombre del usuario a eliminar
[,user] - es opcional podemos eliminar mas de un usuario
Veamos un ejemplo:
DROP user arthusuxd@localhost;
De esta forma he eliminado el usuario arthusuxd@localhost y puedo comprobarlo viendo el user,host desde mysql.user....
Espero que les haya gustado el minitutorial y esperen el proximo, jeje no habia tenido tiempo de postear algo asi que aqui esta :P XD