Un post de
Al contrario de lo que generalmente se cree, administrar usuarios y permisos en MySQL es una tarea sumamente sencilla que está al alcance de cualquier programador o administrador de sistemas. Lo más complejo, es tomar las medidas indicadas realizando el análisis propio de un DBA.
Este post está centrado en el cómo se gestionan los permisos respecto a lo demás, en cuanto a la seguridad, algo a tener en cuenta es que la medida más apropiada es aquella que define una política clara sobre las necesidades reales de los usuarios del sistema.
Creación de usuarios
Para agregar un nuevo usuario , es tan simple como ejecutar la siguiente sentencia:
[color=#000000]
CREATE USER nombre_de_usuario
IDENTIFIED BY 'clave en texto plano';
[/color]
Por ejemplo, para agregar al usuario juanperez con la clave 123456, se utilizaría:
[color=#000000]
CREATE USER juanperez
IDENTIFIED BY '123456';
[/color]
Una muy buena práctica es limitar la conexión de los usuarios por host, para prevenir conexiones desde hosts no deseados. Para ello, se utiliza:
'nombre_de_usuario'@'host'
Por ejemplo, para crear al usuario beatrix y solo permitir su conexión local, la sentencia sería la siguiente:
[color=#000000]
CREATE USER 'beatrix'@'localhost'
IDENTIFIED BY '123456';
[/color]
Si luego se deseara cambiar (o asignar en caso de inexistencia) una contraseña a un determinado usuario, se utilizará SET PASSWORD como se muestra a continuación:
[color=#000000]
SET PASSWORD
FOR usuario = PASSWORD('nueva clave en texto plano');
[/color]
o también:
[color=#000000]
SET PASSWORD
FOR 'usuario'@'host' = PASSWORD('nueva clave en texto plano');
[/color]
Por ejemplo, para agregar p1r0m4n14c0 como contraseña del usuario root, la sentencia sería:
[color=#000000]
SET PASSWORD
FOR 'root'@'localhost' = PASSWORD('p1r0m4n14c0');
[/color]
Otorgar permisos
Para otorgar permisos en MySQL®, se deben considerar:
Permiso: El tipo de consultas que se permitirá efectuar al usuario (SELECT, INSERT, DELETE, UPDATE);
Database: Las bases de datos y/o tablas sobre las cuáles aplicarán dichos permisos;
Usuario: El o los usuarios a los cuáles serán otorgados los permisos aplicados.
La configuración de permisos se realizará con la siguiente sentencia:
[color=#000000]
GRANT permiso
ON database
TO usuario;
[/color]
Por ejemplo, para otorgar permisos de selección sobre la tabla categoria de la base de datos weblibros al usuario juanperez, se ejecutará:
[color=#000000]
GRANT SELECT
ON weblibros.categoria
TO juanperez;
[/color]
Suponiendo que la base de datos weblibros contenga dos tablas:
[color=#000000]
mysql> show tables from weblibros;
+---------------------+
| Tables_in_weblibros |
+---------------------+
| categoria |
| libro |
+---------------------+
2 rows in set (0.00 sec)
[/color]
Si en vez de root la consulta fuese realizada por el usuario juanperez, obtendría lo siguiente:
[color=#000000]
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| weblibros |
+--------------------+
2 rows in set (0.00 sec)
mysql> show tables from weblibros;
+---------------------+
| Tables_in_weblibros |
+---------------------+
| categoria |
+---------------------+
1 row in set (0.00 sec)
[/color]
Y si el usuario juanperez intentara acceder a una tabla no permitida, el acceso le sería
negado:
[color=#000000]
mysql> select * from weblibros.libro;
ERROR 1142 (42000): SELECT command denied to user 'juanperez'@'localhost' for table
'libro'
[/color]
Al momento de escribir las sentencias para otorgar permisos, disponemos de diferentes opciones.
Opciones para indicar el tipo de permisos:
[color=#000000]
GRANT SELECT # un permiso específico
GRANT SELECT, INSERT, UPDATE # varios permisos
GRANT ALL # todos los permisos
[/color]
Opciones para indicar a qué bases de datos/tablas aplicarán los permisos:
[color=#000000]
ON database.table # a una tabla
ON database.table1, # a varias tablas
database.table2,
database2.table
ON database.* # a todas las tablas de la misma DB
[/color]
Opciones para indicar a quién/quiénes aplican los permisos:
[color=#000000]
TO usuario # a un usuario
TO usuario1, usuario2 # a varios usuarios
[/color]
Un ejemplo completo
Suponiendo que en sistema existen las siguientes bases de datos y tablas:
[color=#000000]
DATABASE TABLAS
europioengine categoria, materiaprima, producto
webcursos categoria, libro
[/color]
Crearemos primero 3 usuarios, a los que solo se les permita conectarse de forma local:
[color=#000000]
CREATE USER 'vanina'@'localhost'
IDENTIFIED BY 'v4n1n41974';
CREATE USER 'roxana'@'localhost'
IDENTIFIED BY 'r0x4n4-1275';
CREATE USER 'silvana'@'localhost'
IDENTIFIED BY '33885409sil';
[/color]
Y ahora, otorgaremos permisos de selección y actualización, a todos los usuarios recién creados, para todas las tablas de la base de datos europioengine:
[color=#000000]
GRANT SELECT, UPDATE
ON europioengine.*
TO vanina, roxana, silvana;
[/color]
Conceder permiso de conceder permisos
Cuando otorgamos permisos a un determinado usuario, es posible además, conceder un permiso extra que le permita asignar sus mismos privilegios a otros usuarios. Una situación de ejemplo podría ser la siguiente:
De eso se trata la cláusula WITH GRANT OPTION que se especifica de la siguiente manera:
[color=#000000]
GRANT permisos
ON tablas
TO usuario
WITH GRANT OPTION
[/color]
Si seguimos con el ejemplo anterior, ahora, al usuario vanina, le otorgaremos todos los permisos para la tabla categoria de la base de datos weblibro, permitiéndole conceder dichos permisos a cualquier otro usuario xistente:
[color=#000000]
GRANT ALL
ON weblibros
TO vanina
WITH
GRANT OPTION;
[/color]
Revocando permisos
Revocar permisos es algo similar a concederlos. Solo cambia un poco la sintaxis:
[color=#000000]
GRANT => REVOKE
TO => FROM
[/color]
La sintaxis básica, se vería como la siguente:
[color=#000000]
REVOKE privilegio
ON tabla
FROM usuario
[/color]
Por ejemplo:
[color=#000000]
REVOKE SELECT, INSERT
ON midatabase.tabla_productos
FROM anitamayer;
[/color]
Puedo además, revocar privilegios en cascada, para los casos en los cuáles, el usuario en cuestión, haya otorgado privilegios a terceras personas:
[color=#000000]
REVOKE SELECT, INSERT
ON midatabase.tabla_productos
FROM anitamayer
CASCADE
[/color]
O puedo optar por la alternativa contraria de recibir un error en caso en el cuál, pretender revocar privilegios a un usuario, afecte a otros usuarios:
[color=#000000]
REVOKE SELECT, INSERT
ON midatabase.tabla_productos
FROM anitamayer
RESTRICT
[/color]
_______________________________________________________________________________
_______________________________________________________________________________