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