5.2.10. La base de datos de privilegios: mysql

MySQL almacena la información sobre los usuarios y sus privilegios en una base de datos como cualquier otra, cuyo nombre es mysql. Si exploramos su estructura, entenderemos la manera como MySQL almacena la información de sus usuarios y privilegios:


Es posible realizar modificaciones directamente sobre estas tablas y obtener los mismos resultados que si utilizáramos los comandos grant, revoke, set password o drop user:

mysql> update user
-> set Password = password(´nuevapasswd´)
-> where User =´visitante´ and Host = ´localhost´;
mysql> flush privileges;

El comando flush privileges solicita a MySQL que vuelva a leer las tablas de privilegios. En el momento de ejecutarse, el servidor lee la información de estas tablas sobre privilegios. Pero si se han alterado las tablas manualmente, no se enterará de los cambios hasta que utilicemos el comando flush privileges.

 

 

Tablas de la base de datos mysql
Tabla Contenido
user Cuentas de usuario y sus privilegios globales
db Privilegios sobres bases de datos
tables_priv Privilegios sobre tablas
columns_priv Privilegios sobre columnas
host Privilegios de otros equipos anfitriones sobre bases de datos

El acceso directo a las tablas de privilegios es útil en varios casos; por ejemplo, para borrar un usuario del sistema en las versiones de MySQL anteriores a la 4.1.1:

mysql> delete from user
-> where User = ´visitante´ and Host = ´localhost´;
mysql> flush privileges;

No es posible eliminar mediante un solo comando revoke todos los privilegios de un usuario.

Ejemplo

Se otorgan derechos a un usuario con dos comandos grant.

Observando el contenido de la base de datos de privilegios, podemos entender el comportamiento de los comandos grant y revoke. Primero asignamos privilegios para usar el comando select al usuario visitante con dos comandos grant: el primero de ellos le permite el ingreso desde el servidor nuestra-ong.org y el segundo le otorga el mismo tipo de privilegio, pero desde cualquier equipo en Internet.

mysql> grant select
-> on *.*
-> to visitante@nuestra-ong.org;
Query OK, 0 rows affected (0.01 sec)
mysql> grant select
-> on *.*
-> to visitante@´%´;
Query OK, 0 rows affected (0.00 sec)

Consultando la tabla user de la base de datos de privilegios, podemos observar los valores ’Y’ en la columna del privilegio select.

mysql> select user,host,select_priv from user
-> where user = ´visitante´;
+-----------+----------------------+----------------+
| user      | host                 | select_priv    |
+-----------+----------------------+----------------+
| visitante | nuestra-ong.org      | Y              |
| visitante |        %             | Y              |
+-----------+----------------------+----------------+
2 rows in set (0.00 sec)

Ahora solicitamos eliminar el privilegio select de todas las bases de datos y de todos los equipos en Internet.

mysql> revoke all
-> on *.*
-> from visitante@´%´;
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host,select_priv from user
-> where user = ´visitante´;
+-----------+------------------+-------------+
| user      | host             | select_priv |
+-----------+------------------+-------------+
| visitante | nuestra-ong.org  |       Y     |
| visitante |        %         |       N     |
+-----------+------------------+-------------+
2 rows in set (0.01 sec)

En la tabla user observamos que, efectivamente, se ha eliminado el privilegio para visitante@’%’ pero no para 'visitante@nuestra-ong.org'. MySQL considera que son direcciones diferentes y respeta los privilegios otorgados a uno cuando se modifica otro.