5.2. Usuanos y privilegios
5.2. Usuanos y privilegios Dataprix 8 October, 2009 - 12:13El 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 October, 2009 - 15:45La 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 October, 2009 - 16:06MySQL 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 October, 2009 - 16:18Despué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´;
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 October, 2009 - 12:55A 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 October, 2009 - 13:08MySQL 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 October, 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 October, 2009 - 13:42Los 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 October, 2009 - 13:45El 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 October, 2009 - 13:47Antes 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 October, 2009 - 13:51MySQL 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.
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.