Hasta ahora hemos usado sólo el usuario 'root', que es el
administrador, y que dispone de todos los privilegios disponibles
en MySQL.
Sin embargo, normalmente no será una buena práctica dejar
que todos los usuario con acceso al servidor tengan todos los privilegios. Para
conservar la integridad de los datos y de las estructuras será conveniente que
sólo algunos usuarios puedan realizar determinadas tareas, y que otras, que
requieren mayor conocimiento sobre las estructuras de bases de datos y tablas,
sólo puedan realizarse por un número limitado y controlado de usuarios.
Los conceptos de usuarios y privilegios están íntimamente
relacionados. No se pueden crear usuarios sin asignarle al mismo tiempo privilegios.
De hecho, la necesidad de crear usuarios está ligada a la necesidad de limitar
las acciones que tales usuarios pueden llevar a cabo.
MySQL permite definir diferentes usuarios, y además,
asignar a cada uno determinados privilegios en distintos niveles o categorías
de ellos.
En MySQL existen cinco niveles distintos de
privilegios:
Globales: se aplican al conjunto de todas las bases de
datos en un servidor. Es el nivel más alto de privilegio, en el sentido de que
su ámbito es el más general.
De base de datos: se refieren a bases de datos
individuales, y por extensión, a todos los objetos que contiene cada base de
datos.
De tabla: se aplican a tablas individuales, y por lo
tanto, a todas las columnas de esas tabla.
De columna: se aplican a una columna en una tabla
concreta.
De rutina: se aplican a los procedimientos almacenados.
Aún no hemos visto nada sobre este tema, pero en MySQL se pueden
almacenar procedimietos consistentes en varias consultas SQL.
Aunque en la versión 5.0.2 de MySQL existe una
sentencia para crear usuarios, CREATE USER, en
versiones anteriores se usa exclusivamente la sentenciaGRANT para
crearlos.
En general es preferible usar GRANT, ya que si se
crea un usuario mediante CREATE USER,
posteriormente hay que usar una sentencia GRANT para
concederle privilegios.
Usando GRANT podemos
crear un usuario y al mismo tiempo concederle también los privilegios que
tendrá. La sintaxis simplificada que usaremos paraGRANT, sin
preocuparnos de temas de cifrados seguros que dejaremos ese tema para capítulos
avanzados, es:
GRANT priv_type [(column_list)] [, priv_type
[(column_list)]] ...
ON
TO user
[IDENTIFIED BY [PASSWORD] 'password']
[, user
[IDENTIFIED BY [PASSWORD] 'password']] ...
La primera parte priv_type [(column_list)] permite
definir el tipo de privilegio concedido para determinadas columnas. La
segunda ON {tbl_name | * | *.* | db_name.*}, permite conceder privilegios
en niveles globales, de base de datos o de tablas.
Para crear un usuario sin privilegios usaremos la sentencia:
mysql> GRANT USAGE ON *.* TO anonimo IDENTIFIED BY
'clave';
Query OK, 0 rows affected (0.02 sec)
Hay que tener en cuenta que la constraseña se debe
introducir entre comillas de forma obligatoria.
Un usuario 'anonimo' podrá abrir una
sesión MySQL mediante una orden:
C:\mysql -h localhost -u anonimo -p
Pero no podrá hacer mucho más, ya que no tiene privilegios.
No tendrá, por ejemplo, oportunidad de hacer selecciones de datos, de crear
bases de datos o tablas, insertar datos, etc.
Para que un usuario pueda hacer algo más que consultar
algunas variables del sistema debe tener algún privilegio. Lo más simple es
conceder el privilegio para seleccionar datos de una tabla concreta. Esto se
haría así:
La misma sentencia GRANT se usa para
añadir privilegios a un usuario existente.
mysql> GRANT SELECT ON prueba.gente TO anonimo;
Query OK, 0 rows affected (0.02 sec)
Esta sentencia concede al usuario 'anonimo' el privilegio de
ejecutar sentencias SELECT sobre la
tabla 'gente' de la base de datos 'prueba'.
Un usuario que abra una sesión y se identifique como
'anonimo' podrá ejecutar estas sentencias:
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| prueba |
+----------+
1 row in set (0.01 sec)
mysql> USE prueba;
Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_prueba |
+------------------+
| gente
|
+------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM gente;
+----------+------------+
| nombre |
fecha |
+----------+------------+
| Fulano |
1985-04-12 |
| Mengano |
1978-06-15 |
| Tulano |
2001-12-02 |
| Pegano |
1993-02-10 |
| Pimplano | 1978-06-15 |
| Frutano |
1985-04-12 |
+----------+------------+
6 rows in set (0.05 sec)
mysql>
Como se ve, para este usuario sólo existe la base de datos
'prueba' y dentro de esta, la tabla 'gente'. Además, podrá hacer consultas
sobre esa tabla, pero no podrá añadir ni modificar datos, ni por supuesto,
crear o destruir tablas ni bases de datos.
Para conceder privilegios globales se usa ON *.*, para
indicar que los privilegios se conceden en todas las tablas de todas las bases
de datos.
Para conceder privilegios en bases de datos se usa ON
nombre_db.*, indicando que los privilegios se conceden sobre todas las tablas
de la base de datos 'nombre_db'.
Usando ON nombre_db.nombre_tabla, concedemos
privilegios de nivel de tabla para la tabla y base de datos especificada.
En cuanto a los privilegios de columna, para concederlos se
usa la sintaxis tipo_privilegio (lista_de_columnas), [tipo_privilegio
(lista_de_columnas)].
Otros privilegios que se pueden conceder son:
ALL: para conceder todos los privilegios.
CREATE: permite crear nuevas tablas.
DELETE: permite usar la sentencia DELETE.
DROP: permite borrar tablas.
INSERT: permite insertar datos en tablas.
UPDATE: permite usar la sentencia UPDATE.
Para ver una lista de todos los privilegios existentes
consultar la sintaxis de la sentencia GRANT.
Se pueden conceder varios privilegios en una única
sentencia. Por ejemplo:
mysql> GRANT SELECT, UPDATE ON prueba.gente TO
anonimo IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.22 sec)
mysql>
Un detalle importante es que para crear usuarios se debe
tener el privilegio GRANT OPTION, y que sólo se pueden conceder
privilegios que se posean.
Para revocar privilegios se usa la sentencia REVOKE.
REVOKE priv_type [(column_list)] [, priv_type
[(column_list)]] ...
ON
FROM user [,
user] ...
La sintaxis es similar a la de GRANT, por ejemplo,
para revocar el privilegio SELECT de nuestro usuario 'anonimo',
usaremos la sentencia:
mysql> REVOKE SELECT ON prueba.gente FROM anonimo;
Query OK, 0 rows affected (0.05 sec)
Podemos ver qué privilegios se han concedido a un usuario
mediante la sentencia SHOW GRANTS. La
salida de esta sentencia es una lista de sentenciasGRANT que se
deben ejecutar para conceder los privilegios que tiene el usuario. Por ejemplo:
mysql> SHOW GRANTS FOR anonimo;
+--------------------------------------------------------------------+
| Grants for anonimo@%
|
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY
PASSWORD '*5...' |
| GRANT SELECT ON `prueba`.`gente` TO
'anonimo'@'%' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql>
Como podemos ver por la salida de la sentencia SHOW GRANTS, el
nombre de usuario no se limita a un nombre simple, sino que tiene dos partes.
La primera consiste en un nombre de usuario, en nuestro ejemplo 'anonimo'. La
segunda parte, que aparece separada de la primera por el carácter '@' es un
nombre de máquina (host). Este nombre puede ser bien el de una máquina, por
ejemplo, 'localhost' para referirse al ordenador local, o cualquier otro
nombre, o bien una ip.
La parte de la máquina es opcional, y si como en nuestro
caso, no se pone, el usuario podrá conectarse desde cualquier máquina. La
salida de SHOW
GRANTS lo indica usando el comodín '%' para el nombre de la máquina.
Si creamos un usuario para una máquina o conjunto de máquinas
determinado, ese usuario no podrá conectar desde otras máquinas. Por ejemplo:
mysql> GRANT USAGE ON * TO anonimo@localhost
IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.00 sec)
Un usuario que se identifique como 'anonimo' sólo podrá
entrar desde el mismo ordenador donde se está ejecutando el servidor.
En este otro ejemplo:
mysql> GRANT USAGE ON * TO anonimo@10.28.56.15
IDENTIFIED BY 'clave';
Query OK, 0 rows affected (0.00 sec)
El usuario 'anonimo' sólo puede conectarse desde un
ordenador cuyo IP sea '10.28.56.15'.
Aunque asignar una constraseña es opcional, por motivos de
seguridad es recomendable asignar siempre una.
La contraseña se puede escribir entre comillas simples
cuando se crea un usuario, o se puede usar la salida de la función PASSWORD() de forma
literal, para evitar enviar la clave en texto legible.
Si al añadir privilegios se usa una clave diferente en la
cláusula IDENTIFIED BY, sencillamente se sustituye la contraseña por la
nueva.
Para eliminar usuarios se usa la sentencia DROP USER.
No se puede eliminar un usuario que tenga privilegios, por
ejemplo:
mysql> DROP USER anonimo;
ERROR 1268 (HY000): Can't drop one or more of the
requested users
mysql>
Para eliminar el usuario primero hay que revocar todos sus
privilegios:
mysql> SHOW GRANTS FOR anonimo;
+--------------------------------------------------------------------+
| Grants for anonimo@% |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'anonimo'@'%' IDENTIFIED BY
PASSWORD '*5...' |
| GRANT SELECT ON `prueba`.`gente` TO
'anonimo'@'%' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> REVOKE SELECT ON prueba.gente FROM anonimo;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP USER anonimo;
Query OK, 0 rows affected (0.00 sec)
mysql>
No hay comentarios:
Publicar un comentario