2
MySQL
El Sistema de Derechos de Acceso
Crescencio Bravo
Contenidos
MySQL: El sistema de derechos de acceso
1 Aspectos de seguridad
2 El Sistema de Privilegios
3 Conexión al servidor
4 Control de Acceso
5 Ejercicios
2
1 Aspectos de seguridad
MySQL: El sistema de derechos de acceso
MySQL tiene un sistema de seguridad muy avanzado
Utiliza Listas de Control de Accesos (ACL) en todas las
conexiones, consultas y operaciones
Algunos consejos:
consejos
No dar acceso a la tabla user en la BD mysql
Utilizar GRANT y REVOKE para implantar una política de
seguridad cerrada
No almacenar claves en la BD sin cifrar
Instalar un cortafuegos en el servidor de MySQL
Utilizar passwords para todos los usuarios de MySQL:
mysql –u root mysql
update user set password=PASSWORD(‘nuevaClave’)
where user=‘root’;
flush privileges;
No ejecutar el “demonio” mysqld como usuario root
Comprobar que este usuario es el único con permisos de
lectura/escritura en los directorios de datos
No dar los privilegios PROCESS y FILE a todos los usuarios
3
2 El Sistema de Privilegios (i)
MySQL: El sistema de derechos de acceso
Función del Sistema de Privilegios:
Privilegios
Autentificar a un usuario que se conecta desde un host y
asociarle privilegios de base de datos
“Asegurar que los usuarios hacen aquello que se les permite
hacer”
Identidad:
Host desde el que se conecta el usuario
Nombre del usuario
El sistema concede privilegios de acuerdo a
la identidad (quién, dónde)
lo que se quiere hacer (qué)
4
2 El Sistema de Privilegios (ii)
MySQL: El sistema de derechos de acceso
El control de acceso de MySQL consiste en dos fases:
fases
1 Determinar si el usuario se puede conectar
2 Asumiendo que se puede conectar, comprobar cada
petición y determinar si se tienen suficientes privilegios
para realizarla
Los privilegios se almacenan en las tablas user, db, host,
tables_priv, columns_priv en la BD mysql
Ejercicio 1:
Consultar las tablas donde se almacenan los
privilegios
¿Cuántos usuarios hay definidos?
5
2 El Sistema de Privilegios (iii)
MySQL: El sistema de derechos de acceso
Principales privilegios:
privilegios
SELECT, INSERT, UPDATE y DELETE permiten realizar
operaciones sobre filas de una BD
INDEX permite crear o eliminar índices
ALTER permite modificar una tabla (ALTER TABLE)
CREATE y DROP permiten crear y eliminar BD y tablas
GRANT permite ceder a otro usuario los privilegios que se
poseen
FILE permite leer cualquier fichero del servidor y situarlo en
una tabla, que puede entonces consultarse con select
SHUTDOWN permite detener el servidor
PROCESS permite ver el texto (código) correspondiente a
una consulta en ejecución
6
3 Conexión al servidor
MySQL: El sistema de derechos de acceso
El host por defecto es localhost
El usuario por defecto es el nombre de usuario de Linux
No se proporciona password si no se indica -p
Se pueden indicar valores por defecto en la sección
[client] del fichero de configuración
En Linux, my.cnf o .my.cnf
En Windows, my.ini
7
4 Control de Acceso (i)
MySQL: El sistema de derechos de acceso
Fase 1: Verificación de la conexión
“Identidad = host + nombreUsuario”
El servidor da acceso si
a) una fila en la tabla user coincide con el host y el usuario
b) se suministra la clave (password) correcta
+-----------+---------+------------------+
| host
| user
| password
|
+-----------+---------+------------------+
| localhost | root
| 547d58836f44eb70 |
| %
| root
|
|
| localhost |
| 547d58836f44eb70 |
| %
|
|
|
| %
| user1
| 547d58836f44eb70 |
| localhost | user1
| 547d58836f44eb70 |
| localhost | user2
| 555a3ad2495c04df |
| %
| user2
| 555a3ad2495c04df |
+-----------+---------+------------------+
8
4 Control de Acceso (ii)
MySQL: El sistema de derechos de acceso
Host puede ser un nombre de host, una IP o localhost
Se pueden utilizar comodines:
% se refiere a cualquier cadena
_ se refiere a cualquier carácter
En la columna user no se permiten comodines, pero un
nombre en blanco “coincide” con cualquier nombre y
representa a un usuario anónimo
Si password se deja en blanco representa el hecho de que el
usuario se conecta sin contraseña
Ejemplos:
9
4 Control de Acceso (iii)
MySQL: El sistema de derechos de acceso
Fase 2: Verificación de la petición (consulta)
Se verifica cada petición para ver si el usuario tiene
suficientes privilegios para realizarla
El servidor utiliza las tablas user, db, host, tables_priv y
columns_priv
Se utilizan
GRANT para asignar permisos a los usuarios
REVOKE para retirar permisos
Puesto que sobre estas tablas también se pueden aplicar
derechos, hay que tener precaución
La tabla user se refiere a todas las BD
10
4 Control de Acceso (iv)
MySQL: El sistema de derechos de acceso
GRANT
REVOKE
11
4 Control de Acceso (v)
MySQL: El sistema de derechos de acceso
GRANT y REVOKE permiten crear usuarios y conceder y
revocar derechos a cuatro niveles de privilegio:
privilegio
Global:
Global Se aplican a todas las BD de un servidor dado
Tabla: mysql.user
Base de datos:
datos Se aplican a todas las tablas de una BD
Tablas: mysql.db y mysql.host
Tabla:
Tabla Se aplican a todas las columnas de una tabla
Tablas: mysql.tables_priv
Columna:
Columna Se aplican a determinadas columnas de una tabla
Tablas: mysql.columns_priv
12
4 Control de Acceso (vi)
MySQL: El sistema de derechos de acceso
Todos los permisos (i):
(i)
13
4 Control de Acceso (vii)
MySQL: El sistema de derechos de acceso
Todos los permisos (ii):
14
4 Control de Acceso (viii)
MySQL: El sistema de derechos de acceso
Creación de usuarios:
usuarios
Forma 1: Utilizar GRANT
Forma 2: Manipular las tablas de MySQL directamente
Forma 1: Ejemplos
Forma 2: Ejemplos
15
5 Ejercicios
MySQL: El sistema de derechos de acceso
Utilizando la BD personal (tablas dvds y cuentas)
1 Crear los usuarios tesorero y habitante. El primero
puede acceder a todas las tablas, pero el segundo sólo
a cuentas
2 Crear otro usuario llamado invitado que sólo puede
insertar datos en la tabla dvds (no puede leer, por
ejemplo). Comprobar también que no tiene acceso a
cuentas
3 Ante la sospecha de que los permisos están mal
configurados, revocar todos los privilegios a todos los
usuarios excepto a root
4 ¿Desde dónde se podían conectar los usuarios?
5 Crear un usuario invitado2 que sólo tenga acceso
para lectura (SELECT) a la columna concepto de la
tabla cuentas y solamente conectándose desde el
ordenador local
16
5 Ejercicios: Solución (i)
MySQL: El sistema de derechos de acceso
[ consulta.sql ]
create database personal;
use personal;
create table dvds (
autor varchar(24),
titulo varchar(24),
year smallint
);
insert into dvds (autor,titulo,year) values ('amaral',
'estrella de mar',2003);
insert into dvds (autor,titulo,year) values ('vivaldi',
'las cuatro estaciones',1600);
create table cuentas (
fecha date,
concepto varchar(32),
importe float,
tipo_mov enum('D','H')
);
insert into cuentas (fecha,concepto,importe,tipo_mov) values
('2005-11-25','nomina',1500.0,'D');
insert into cuentas (fecha,concepto,importe,tipo_mov) values
('2005-11-26','compra coche',12000.0,'H');
17
5 Ejercicios: Solución (ii)
MySQL: El sistema de derechos de acceso
[ consulta2.sql ]
use personal;
grant all on personal.* to tesorero@localhost identified by 'tes';
grant all on personal.* to tesorero@'%' identified by 'tes';
grant all on personal.cuentas to habitante@localhost identified by 'hab';
grant all on personal.cuentas to habitante@'%' identified by 'hab';
grant insert on personal.dvds to invitado@localhost identified by 'inv';
grant insert on personal.dvds to invitado@'%' identified by 'inv';
18
5 Ejercicios: Solución (iii)
MySQL: El sistema de derechos de acceso
[ consulta3.sql ]
use personal;
revoke all on personal.* from tesorero@'%';
revoke all on personal.* from tesorero@localhost;
revoke all on personal.cuentas from habitante@'%';
revoke all on personal.cuentas from habitante@localhost;
revoke insert on personal.dvds from invitado@'%';
revoke insert on personal.dvds from invitado@localhost;
19
5 Ejercicios: Solución (iv)
MySQL: El sistema de derechos de acceso
[ consulta4.sql ]
use personal;
grant select(concepto) on personal.cuentas to invitado2@localhost
identified by 'inv2';
grant select(concepto) on personal.cuentas to invitado2@'%‘
identified by 'inv2';
20