5.2. Usuanos y privilegios

5.2. Usuanos y privilegios Dataprix 8 Octubre, 2009 - 12:13

El acceso al servidor MySQL está controlado por usuarios y privilegios. Los usuarios  del  servidor  MySQL  no  tienen  ninguna  correspondencia  con  los usuarios del sistema operativo. Aunque en la práctica es común que algún administrador de MySQL asigne los mismos nombres que los usuarios tienen en el sistema, son mecanismos totalmente independientes y suele ser aconsejable en general.

El usuario administrador del sistema MySQL se llama root. Igual que el superusuario de los sistemas tipo UNIX.

Además del usuario root, las instalaciones nuevas de MySQL incluyen el usuario anónimo, que tiene permisos sobre la base de datos test. Si queremos, también podemos restringirlo asignándole una contraseña. El usuario anónimo de MySQL se representa por una cadena vacía. Vemos otra forma de asignar contraseñas a un usuario, desde el cliente de mysql y como usuario root:

mysql> set password for ''@'localhost' = password('nuevapasswd');

La administración de privilegios y usuarios en MySQL se realiza a través de las sentencias:

•    GRANT. Otorga privilegios a un usuario, en caso de no existir, se creará el usuario.

•    REVOKE. Elimina los privilegios de un usuario existente.

•    SET PASSWORD. Asigna una contraseña.

•    DROP USER. Elimina un usuario.

5.2.1. La sentencia GRANT

5.2.1. La sentencia GRANT Dataprix 8 Octubre, 2009 - 15:45

La sintaxis simplificada de grant consta de tres secciones. No puede omitirse ninguna, y es importante el orden de las mismas:

•    grant lista de privilegios
•    on base de datos.tabla
•    to usuario

Ejemplo

Creación de un nuevo usuario al que se otorga algunos privilegios

mysql> grant update, insert, select
-> on demo.precios
-> to visitante@localhost;

En la primera línea se especifican los privilegios que serán otorgados, en este caso se permite actualizar (update), insertar (insert) y consultar (select). La segunda línea especifica que los privilegios se aplican a la tabla precios de la base de datos demo. En la última línea se encuentra el nombre del usuario y el equipo desde el que se va a permitir la conexión.

El comando grant crea la cuenta si no existe y, si existe, agrega los privilegios especificados. Es posible asignar una contraseña a la cuenta al mismo tiempo que se crea y se le otorgan privilegios:

mysql> grant update, insert, select
-> on demo.precios
-> to visitante@localhost identified by ´nuevapasswd´;

En la misma sentencia es posible también otorgar permisos a más de un usuario y asignarles, o no, contraseña:

mysql> grant update, insert, select
-> on demo.precios
-> to visitante@localhost,
-> yo@localhost identified by ´nuevapasswd´,
-> tu@equipo.remoto.com;

5.2.2. Especificacion de lugares origen de la conexion

5.2.2. Especificacion de lugares origen de la conexion Dataprix 8 Octubre, 2009 - 16:06

MySQL proporciona mecanismos para permitir que el usuario realice su conexión desde diferentes equipos dentro de una red específica, sólo desde un equipo, o únicamente desde el propio servidor.

mysql> grant update, insert, select
-> on demo.precios
-> to visitante@´%.empresa.com´;

El carácter % se utiliza de la misma forma que en el comando like: sustituye a cualquier cadena de caracteres. En este caso, se permitiría el acceso del usuario 'visitante' (con contraseña, si la tuviese definida) desde cualquier equipo del dominio 'empresa.com'. Obsérvese que es necesario entrecomillar el nombre del equipo origen con el fin de que sea aceptado por MySQL. Al igual que en like, puede utilizarse el carácter ’_’.

Entonces, para permitir la entrada desde cualquier equipo en Internet, escribiríamos:

-> to visitante@´%´

Obtendríamos el mismo resultado omitiendo el nombre del equipo origen y escribiendo simplemente el nombre del usuario:

-> to visitante

Los anfitriones válidos también se pueden especificar con sus direcciones IP.

to visitante@192.168.128.10
to visitante@´192.168.128.%´

Los caracteres ’ %’ y ’_’ no se permiten en los nombres de los usuarios.

5.2.3. Especificacion de bases de datos y tablas

5.2.3. Especificacion de bases de datos y tablas Dataprix 8 Octubre, 2009 - 16:18

Después de analizar las opciones referentes a los lugares de conexión permitidos, veamos ahora cómo podemos limitar los privilegios a bases de datos, tablas y columnas.

En el siguiente ejemplo otorgamos privilegios sobre todas las tablas de la base de datos demo.

mysql> grant all
-> on demo.*
-> to ´visitante´@´localhost´;

Podemos obtener el mismo resultado de esta forma:

mysql> use demo;
mysql> grant all
-> on *
-> to ´visitante´@´localhost´;

De igual modo, al especificar sólo el nombre de una tabla se interpretará quepertenece a la base de datos en uso:

mysql> use demo;
mysql> grant all
-> on precios
-> to ´visitante´@´localhost´;

 

Opciones para la clausula on del comando grant

Opción Significado
*.* Todas las bases de datos y todas las tablas
base.* Todas las tablas de la base de datos especificada
tabla Tabla especificada de la base de datos en uso
* Todas las tablas de la base de datos en uso

 

5.2.4. Especificacion de columnas

5.2.4. Especificacion de columnas Dataprix 9 Octubre, 2009 - 12:55

A continuación presentamos un ejemplo donde se especifican las columnas sobre las que se otorgan privilegios con el comando grant:

mysql> grant update(precio,empresa)
-> on demo.precios
-> to visitante@localhost;

Podemos especificar privilegios diferentes para cada columna o grupos de columnas:

mysql> grant update(precio), select (precio, empresa)
-> on demo.precios
-> to visitante@localhost;

5.2.5. Tipos de privilegios

5.2.5. Tipos de privilegios Dataprix 9 Octubre, 2009 - 13:08

MySQL proporciona una gran variedad de tipos de privilegios.

•    Privilegios relacionados con tablas: alter, create, delete, drop, index, insert, select, update

•    Algunos privilegios administrativos: file, proccess, super reload, replication client, grant option, shutdown

•    Algunos privilegios para fines diversos: lock tables, show databases, create temporary tables.

El privilegio all otorga todos los privilegios exceptuando el privilegio grant option. Y el privilegio usage no otorga ninguno, lo cual es útil cuando se desea, por ejemplo, simplemente cambiar la contraseña:

grant usage
on *.*
to visitante@localhost identified by ´secreto´;

 

 

Tipos de privilegios en MySQL

Tipo de privilegio Operación que permite
all [privileges] Otorga todos los privilegios excepto grant option
usage No otorga ningún privilegio
alter Privilegio para alterar la estructura de una tabla
create Permite el uso de create table
delete Permite el uso de delete
drop Permite el uso de drop table
index Permite el uso de index y drop index
insert Permite el uso de insert
select Permite el uso de select
update Permite el uso de update
file Permite le uso de select . . . into outfile y load data infile
process Permite el uso de show full procces list
super Permite la ejecución de comandos de supervisión
reload Permite el uso de flush
replication client Permite preguntar la localización de maestro y esclavo
replication slave Permite leer los binlog del maestro
grant option Permite el uso de grant y revoke
shutdown Permite dar de baja al servidor
lock tables Permite el uso de lock tables
show tables Permite el uso de show tables
create temporary tables Permite el uso de create temporary table

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

En entornos grandes, es frecuente encontrarse en la necesidad de delegar el trabajo de administrar un servidor de bases de datos para que otros usuarios, además del administrador, puedan responsabilizarse de otorgar privilegios sobre una base de datos particular. Esto se puede hacer en MySQL con el privilegio grant option:

mysql> grant all, grant option
-> on demo.*
-> to operador@localhost;

El mismo resultado se puede obtener con la siguiente sintaxis alternativa:

mysql> grant all
-> on demo.*
-> to operador@localhost
-> with grant option;

 

De este modo el usuario operador podrá disponer de todos los privilegios sobre la base de datos demo, incluido el de controlar el acceso a otros usuarios.

5.2.6. Opciones de encriptación

5.2.6. Opciones de encriptación Dataprix 9 Octubre, 2009 - 13:36
* Secure Sockets Layer             

MySQL puede establecer conexiones seguras encriptándolas mediante el protocolo SSL*; de esta manera, los datos que se transmiten (tanto la consulta, en un sentido, como el resultado, en el otro) entre el cliente y el servidor estarán protegidos contra intrusos. Para especificar que un usuario debe conectarse obligatoriamente con este protocolo, se utiliza la cláusula require:

mysql> grant all
-> on *.*
-> to visitante@localhost
-> require ssl;

Las conexiones encriptadas ofrecen protección contra el robo de información, pero suponen una carga adicional para el servicio, que debe desencriptar la petición del cliente y encriptar la respuesta (además de un proceso más largo de negociación al conectar), por ello, merman el rendimiento del SGBD.

s

 

5.2.7. Limites de uso

5.2.7. Limites de uso Dataprix 9 Octubre, 2009 - 13:42

Los recursos físicos del servidor siempre son limitados: si se conectan muchos usuarios al mismo tiempo al servidor y realizan consultas o manipulaciones de datos complejas, es probable que pueda decaer el rendimiento notablemente. Una posible solución a este problema es limitar a los usuarios el trabajo que pueden pedir al servidor con tres parámetros:

•    Máximo número de conexiones por hora.

•    Máximo número de consultas por hora.

•    Máximo número de actualizaciones por hora.

La sintaxis de estas limitaciones es como se muestra a continuación:

mysql> grant all
-> on *.*
-> to
-> with MAX_CONECTIONS_PER_HOUR 3
-> MAX_QUERIES_PER_HOUR 300
-> MAX_UPDATES_PER_HOUR 30;

5.2.8. Eliminar privilegios

5.2.8. Eliminar privilegios Dataprix 9 Octubre, 2009 - 13:45

El comando  revoke  permite eliminar privilegios otorgados con  grant a los usuarios. Veamos un ejemplo representativo:

revoke all
on *.*
from visitante@localhost;

Al ejecutar este comando se le retiran al usuario visitante todos sus privilegios sobre todas las bases de datos, cuando se conecta desde localhost.

El comando anterior no retira todos los privilegios del usuario visitante, sólo se los retira cuando se conecta desde localhost. Si el usuario se conecta desde otra localidad (y tenía permiso para hacerlo) sus privilegios permanecen intactos.

5.2.9. Eliminar usuarios

5.2.9. Eliminar usuarios Dataprix 9 Octubre, 2009 - 13:47

Antes de proceder a la eliminación de un usuario, es necesario asegurarse de que se le han quitado primero todos sus privilegios. Una vez asegurado este detalle, se procede a eliminarlo mediante el comando drop user:

mysql> drop user visitante;

5.2.10. La base de datos de privilegios: mysql

5.2.10. La base de datos de privilegios: mysql Dataprix 9 Octubre, 2009 - 13:51

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.