Que vamos ver en este artículo
Las pruebas están hechas con Ubuntu 24.04, MySql 8.0.44 y MariaDB 10.11.13 en un entorno dockerizado.
1) Como crear usuarios en MySql y MariaDB
Para crear un usuario en MySql y MariaDB se utiliza la siguiente instrucción:
CREATE USER 'user01'@'localhost' IDENTIFIED BY 'password';
donde:
- user01 - es el usuario
- localhost - es desde donde se podrá conectar el usuario user01
- password - el password de acceso
Tanto a MySql como a MariaDB podemos añadir el tipo de autentificación que queremos utilizar, pero cuidado, no son las mismas para
En MySql de la siguiente forma
CREATE USER 'user02'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'password';
Esto creará un usuario con autenticación mysql_native_password
En MariaDB para crear el mismo usuario con la misma autentificación hay que utilizar la siguiente instrucción
CREATE USER 'user02'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('password');
Cuidado porque en MySql y MariaDB no son los mismo plugins de autentificación, algunos si.
Para ver los plugins disponibles en casa motor de base de datos utilizar
SHOW PLUGINS
o se puede filtrar utilizando la
select plugin_name, plugin_status, plugin_type from information_schema.plugins where plugin_type = 'AUTHENTICATION';
Tipos de usuarios que podemos crear, bueno, más que tipos es desde donde pueden conectarse y básicamente son tres:
SHOW PLUGINS
o se puede filtrar utilizando la
select plugin_name, plugin_status, plugin_type from information_schema.plugins where plugin_type = 'AUTHENTICATION';
- localhost, solo se conecta desde el propio servidor
- %, permite conexiones desde cualquier sito, cuidado en producción
- IP, desde una IP determinada
Por ejemplo
CREATE USER 'user01'@'localhost' IDENTIFIED BY 'password';
Ahora user01 no solo accede desde el propio servidor sino que puede acceder desde cualquier sitio.
Para ver los usuarios que tenemos usamos la base de datos mysql y puedes utilizar esta consulta:
select user, host, authentication_string, plugin from user;
2) Como dar permisos en MySql y MariaDB
Ahora que tenemos a los usuarios creados o por lo menos ya sabemos cómo crearlos vamos a otorgar permisos a cada usuario por separado.Otra opción es crear roles y utilizar los roles para asignar permisos a un grupo de usuarios pero este es otro tema.
A la hora de asignar permisos hay diferentes formas de hacerlo:
- A todo, permiso para todo “en este mundo” con GRANT ALL PRIVILEGES
- Permisos a poder realizar determinadas acciones, por ejemplo solo consultas con GRANT SELECT, UPDATE ...
Vamos a ver algunas de ellas
Para conceder permisos se utiliza la sentencia:
GRANT ON base_de_datos.tabla TO 'usuario'@'IP'
Expliquemos esto un poco
- Permisos son desde ALL PRIVILEGES a filtrar por acción a realizar SELECT,UPDATE,..
- base_de_datos.tabla poco a decir, solo que se pueden sustituir por *.* y dan permiso a todo. Y, si, se ha de crear una sentencia por cada tabla.
- 'usuario'@'IP' donde IP puede ser localhost para permisos en local, una IP o % para cualquier sitio del mundo.
Ejemplos
GRANT ALL PRIVILEGES ON basedatos.* TO 'user01'@'localhost';
Estás sentencia da privilegios al usuario user01 desde la máquina local a la base de datos basedatos y a todas sus tablas.
GRANT ALL PRIVILEGES ON *.* TO 'user01'@'localhost';
Con esta otra hemos dado permisos a todo al usuario user01 desde localhost.
Pero si accedemos desde una máquina remota nos dará este error:
Pero si ahora le damos acceso a mi IP solo a consultas y actualizaciones pero antes de darle permisos hay que crearlo
CREATE USER 'user01'@'172.33.0.1' IDENTIFIED BY 'password';
GRANT SELECT, UPDATE ON *.* TO 'user01'@'172.33.0.1';
FLUSH PRIVILEGES;
Para a los que después de hacer esto no les funcione recordaros que MySql y MariaDB bloquea las IP externas de serie y hay que comentar esta linea: bind-address = 127.0.0.1 en el fichero
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
Y después reiniciar el servicio de MySql sudo service mysql restart
Ahora si probáis ya podréis acceder sin problemas pero solo podréis consultar y actualizar.
Si intentáis borrar o insertar os dará un error como este
mysql> delete from genders where id = 5;
ERROR 1142 (42000): DELETE command denied to user 'user01'@'172.33.0.1' for table 'genders'
Para MariaDB es lo mismo salvo que el fichero a modificar para quitar el bind-address = 127.0.0.1 es
/etc/mysql/mariadb.conf.d/50-server.cnf
Para ver los permisos de los usuarios puedes utilizar esta consulta:
SHOW GRANTS;
O
SHOW GRANTS FOR 'user01'@’localhost’ :
3) Como quitar permisos y borrar usuarios en MySql y MariaDB
Los permisos los podemos quitar poco a poco igual que los damos para determinadas acciones en determinadas bases de datos y tablas de la siguiente manera: Si antes dimos permisos de SELECT y UPDATE en todas las bases de datos ahora quitamos el permiso de actualizar
REVOKE UPDATE ON *.* FROM 'user01'@'172.33.0.1';
O podemos quitar todos los permisos de golpe
REVOKE ALL PRIVILEGES ON *.* FROM 'user01'@'172.33.0.1';
En MariaDB el proceso es el mismo. Para borrar usuarios utilizamos el comando DROP de la siguiente forma:
DROP USER 'user01'@'?localhost?';
Este es un usuario que he creado mal y si os fijáis en la imagen he puesto la secuencia de borrado.
Y he creado mal el usuario porque siempre va entre comillas simples, a veces al hacer copy & paste se puede pegar otra cosas como acentos y se creará mal el usuario.
Recordar que después del ON viene la base de datos (un * para todas) y la tabla (un * para todas) si quereis dar permisos en un base de datos a varias tablas tiene que hacerse una a una:
GRANT SELECT, UPDATE ON appdb.clientes TO 'user01'@'172.33.0.1';
GRANT SELECT, UPDATE ON appdb.pedidos TO 'user01'@'172.33.0.1';
GRANT SELECT, UPDATE ON appdb.facturas TO 'user01'@'172.33.0.1';
GRANT SELECT, UPDATE ON appdb.direcciones TO 'user01'@'172.33.0.1';
En MariaDB es igual el proceso.
4) Conclusión
Como se puede ver trabajar con usuarios y darles permisos es bastante sencillo y solo hay que tener en cuenta las diferencias entre MySql y MariaDB que no son muchas.Recordar también que los usuarios y los permisos que se les otorga son unitarios es decir … a un usuario se le asigna una cosa que puede hacer o todas, por ejemplo …
Este usuario que hemos creado 'user01'@’172.33.0.1’ solo puede acceder desde esa IP y por ejemplo el usuario 'user01'@’localhost’ solo podrá acceder desde la propia máquina y además podemos asignarle un password diferente. Son dos usuarios diferentes aunque tengan el mismo nombre.
Con los permisos pasa igual a cada usuario se le pueden asignar permisos diferentes.
... y esto es todo amig@s!!! hasta la próxima ...
Saludos
Alex
:-)
/