SQL - Control de usuarios¶
Propuesta didáctica¶
En esta UT finalizaremos los RA2: Crea bases de datos definiendo su estructura y las características de sus elementos según el modelo relacional y RA4: Modifica la información almacenada en la base de datos utilizando asistentes, herramientas gráficas y el lenguaje de manipulación de datos.
Criterios de evaluación¶
Respecto al RABD.2:
- CE2g: Se han creado los usuarios y se les han asignado privilegios.
- CE2h: Se han utilizado asistentes, herramientas gráficas y los lenguajes de definición y control de datos.
Respecto al RABD.4:
- CE4d: Se han diseñado guiones de sentencias para llevar a cabo tareas complejas.
- CE4e: Se ha reconocido el funcionamiento de las transacciones.
- CE4f: Se han anulado parcial o totalmente los cambios producidos por una transacción.
- CE4g: Se han identificado los efectos de las distintas políticas de bloqueo de registros.
- CE4h: Se han adoptado medidas para mantener la integridad y consistencia de la información.
Contenidos¶
Bases de datos relacionales:
- Usuarios. Privilegios.
- Lenguaje de control de datos (DCL).
Tratamiento de datos:
- Transacciones.
- Políticas de bloqueo. Concurrencia.
Cuestionario inicial
- ¿Qué mecanismos de control de acceso implementan los SGBD?
- ¿Qué sublenguaje de SQL se encarga de gestionar el control de acceso de los usuarios?
- ¿Cómo puedo crear un usuario en MariaDB?
Programación de Aula (8h)¶
Esta unidad es la novena, impartiéndose a mitad de la segunda evaluación, a principios de febrero, con una duración estimada de 8 sesiones lectivas:
Sesión | Contenidos | Actividades | Criterios trabajados |
---|---|---|---|
1 | Gestión de usuarios | AC901 | CE2g, CE2h |
2 | Gestión de permisos | AC902 | CE2g, CE2h |
4 | Transacciones | AC903 | CE3c, CE3e |
5 | Uso de commit | AC903 | CE3c, CE3e |
6 | Deshaciendo transacciones | AC906 | CE3e |
7 | Checkpoints | AC907 | CE3e |
8 | Supuesto | AC912 | CE3c, CE3d, CE3e |
Seguridad¶
La seguridad en un SGBD es fundamental para proteger la integridad, confidencialidad y disponibilidad de la información almacenada.
Para ello, se implementan mecanismos de control de acceso mediante la gestión de usuarios y la asignación de privilegios. Este control permite definir qué operaciones puede realizar cada usuario o rol sobre los distintos objetos de la base de datos, limitando el acceso a información sensible y previniendo acciones no autorizadas.
En SQL, dentro del DCL, las sentencias como GRANT
y REVOKE
permiten otorgar o revocar permisos de acceso y modificación sobre los datos. De esta forma, se establece un entorno seguro donde cada usuario tiene acceso únicamente a los recursos necesarios para sus funciones.
Además del control de acceso, la seguridad de un SGBD también se refuerza mediante el uso de transacciones y políticas de bloqueo y concurrencia. Las transacciones garantizan que las operaciones sobre la base de datos se ejecuten de manera atómica, consistente, aislada y duradera (propiedades ACID), lo que previene inconsistencias en caso de errores o fallos del sistema.
Para manejar el acceso concurrente de múltiples usuarios, los SGBD implementan mecanismos de bloqueo que evitan conflictos y garantizan la integridad de los datos. Estos bloqueos, combinados con estrategias de control de concurrencia, aseguran que las transacciones se gestionen de forma ordenada y segura, minimizando riesgos como condiciones de carrera, lecturas sucias o actualizaciones perdidas. Todo esto contribuye a mantener la coherencia y fiabilidad de la base de datos frente a accesos simultáneos y posibles fallos.
DCL¶
El Data Control Language (DCL- Lenguaje de control de datos) se emplea para gestionar los permisos y privilegios de acceso a los objetos dentro de una base de datos, estableciendo políticas de seguridad que determinan qué usuarios o roles pueden interactuar con los datos y de qué manera.
A través del DCL, los administradores de bases de datos pueden otorgar o revocar permisos, asegurando que cada usuario solo pueda realizar las acciones que le han sido expresamente autorizadas. Este control es esencial para proteger la información sensible, evitar accesos no autorizados y mantener la integridad de los datos.
Usuarios¶
Así pues, el primer paso es la creación de usuarios y sus credenciales.
SQL proporciona comandos específicos para crear, modificar y eliminar usuarios, aunque la sintaxis puede variar ligeramente según el SGBD (como MariaDB, PostgreSQL u Oracle).
Para crear un nuevo usuario se realiza con la sentencia CREATE USER, mediante la sintaxis
CREATE USER nombre_usuario IDENTIFIED BY 'contraseña';
Al indicar la contraseña, esta se encriptará con un hash mediante el algoritmo mysql_native_password
. El hash es irreversible, lo que significa que no se puede recuperar la contraseña original a partir de él.
Además, en MariaDB, podemos especificar el host desde donde se permite la conexión:
CREATE USER 'nombre_usuario'@'localhost' IDENTIFIED BY 'contraseña';
Recuerda que cuando comenzamos a usar MariaDB, el usuario se creó desde Docker, pero podemos crear uno nuevo mediante:
CREATE USER s8abd IDENTIFIED BY 's8a' ;
Usuarios existentes
Para averiguar qué usuarios existen en el sistema, en MariaDB debemos hacer una consulta sobre la tabla mysql.user
:
select host, user, password from mysql.user;
-- +-----------+-------------+-------------------------------------------+
-- | Host | User | Password |
-- +-----------+-------------+-------------------------------------------+
-- | localhost | mariadb.sys | |
-- | localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
-- | % | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
-- | 127.0.0.1 | healthcheck | *FD0D4D1DB5F16AF81D702C8863D5723BA1D87FCD |
-- | ::1 | healthcheck | *FD0D4D1DB5F16AF81D702C8863D5723BA1D87FCD |
-- | localhost | healthcheck | *FD0D4D1DB5F16AF81D702C8863D5723BA1D87FCD |
-- | % | s8a | *3D3F19386045EE9D580D9527B41DF893A95325B7 |
-- | % | s8abd | *DFEDA1CE49CA7F95D9C9EDAF0BFA9A21B2BDF0FD |
-- +-----------+-------------+-------------------------------------------+
-- 8 rows in set (0.002 sec)
La columna host
indica desde dónde nos podemos conectar a la base de datos, de manera que mediante root
sólo nos podemos conectar desde la propia máquina (localhost
), mientras que los usuarios s8a
y s8abd
pueden conectarse desde cualquier lugar (%
hace la función de comodín).
Si necesitamos cambiar la contraseña o actualizar las propiedades de un usuario existente, utilizaremos la instrucción ALTER USER
, con la sintaxis:
ALTER USER nombre_usuario IDENTIFIED BY 'nueva_contraseña';
También se pueden modificar atributos adicionales, como el límite de conexiones o configuraciones de autenticación.
Finalmente, para eliminar usuarios utilizaremos la sentencia DROP USER
, revocando todos sus privilegios y eliminando su acceso a la base de datos.
DROP USER nombre_usuario;
Es recomendable revocar previamente los permisos asignados para asegurar una gestión ordenada.
Permisos¶
Hemos comentado previamente que los usuarios tendrán diferentes permisos sobre los recursos de una base de datos. Para ello, las principales sentencias del DCL son GRANT
y REVOKE
.
La instrucción GRANT
permite asignar permisos específicos a usuarios o roles, como la capacidad de consultar (SELECT
), insertar (INSERT
), actualizar (UPDATE
) o eliminar (DELETE
) datos en tablas o vistas. También se pueden otorgar privilegios sobre procedimientos almacenados o esquemas completos.
Por otro lado, la sentencia REVOKE
se utiliza para retirar esos permisos cuando ya no son necesarios o cuando se detecta un posible riesgo de seguridad.
Además, algunos sistemas permiten incluir la opción WITH GRANT OPTION
, que autoriza a un usuario a conceder los privilegios que ha recibido a otros usuarios. Esta gestión granular de permisos es clave para implementar políticas de seguridad robustas, evitando accesos indebidos y minimizando el riesgo de errores o ataques malintencionados.
Comprobando permisos
¿Cómo puedo saber los permisos que tengo? Para ello, necesitamos ejecutar el comando SHOW GRANTS
:
SHOW GRANTS for CURRENT_USER;
-- +----------------------------------------------------------------------------------------------+
-- | Grants for s8a@% |
-- +----------------------------------------------------------------------------------------------+
-- | GRANT ALL PRIVILEGES ON *.* TO `s8a`@`%` IDENTIFIED BY PASSWORD '*3D...B7' WITH GRANT OPTION |
-- | GRANT ALL PRIVILEGES ON `pruebas`.* TO `s8a`@`%` |
-- +----------------------------------------------------------------------------------------------+
-- 2 rows in set (0.001 sec)
En cambio, si comprobamos los permisos del usuario que hemos creado en esta sesión:
SHOW GRANTS for s8abd;
-- +---------------------------------------------------------------------+
-- | Grants for s8abd@% |
-- +---------------------------------------------------------------------+
-- | GRANT USAGE ON *.* TO `s8abd`@`%` IDENTIFIED BY PASSWORD '*DF...FD' |
-- +---------------------------------------------------------------------+
-- 1 row in set (0.003 sec)
Tras crear un usuario, es necesario asignar permisos mediante el DCL con GRANT
y retirarlos con REVOKE
.
Otorgando permisos¶
Así pues, mediante la sentencia GRANT daremos privilegios a un usuarios sobre uno o más objetos, mediante la siguiente sintaxis:
GRANT privilegio ON objeto TO usuario [WITH GRANT OPTIONS]
Por ejemplo,
GRANT SELECT, INSERT ON empresa TO s8abd;
GRANT SELECT, INSERT ON retail.customers TO s8abd;
Si queremos dar permisos de administración, podemos usar:
GRANT ALL PRIVILEGES ON base_de_datos.* TO nombre_usuario;
Una gestión adecuada de usuarios implica también definir roles, agrupar permisos y establecer políticas de acceso según los principios de mínimos privilegios, donde cada usuario tiene solo los permisos estrictamente necesarios.
Permisos disponibles
SHOW PRIVILEGES
: muestra todos los privilegios posibles.
USAGE
: para usar un objeto específico de la base de datos.SELECT
: para acceder a tablas o vistas.INSERT[(nombre_columna)]:
Si se especifica el nombre_columna, se otorga permiso para insertar en la columna especificada. Si se omite entonces se permite insertar valores en todas las columnas.UPDATE[(nombre_columna)]
: Lo mismo queINSERT
para modificar.DELETE
: para eliminar registros de una tabla o vista.REFERENCES[(nombre_columna)]
: Si se especifica nombre_columna permite referirse a la columna indicada como vínculo de integridad, si se omite se aplica a todas las comunas y también a las que se añadan después.GRANT OPTION
: permite dar permisos a otro usuario.ALL
: otorga todos los permisos menosGRANT OPTION
.
Quitando permisos¶
Revocar privilegios sobre un objeto: REVOKE
REVOKE privilegio ON objeto FROM usuario
CREATE USER 'desarrollador'@'localhost' IDENTIFIED BY 'desarrollador';
GRANT SELECT, UPDATE ON empleado to 'desarrollador'@'localhost';
GRANT SELECT, UPDATE ON oficina to 'desarrollador'@'localhost';
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin';
GRANT ALL PRIVILEGES ON jardineria.* TO 'admin'@'localhost' WITH GRANT OPTION;
SHOW GRANTS FOR CURRENT_USER;
PhpMyAdmin¶
Transacciones¶
Referencias¶
-
Sintaxis SQL oficial de PostgreSQL y MariaDB.
-
Cómo no vender la misma entrada a dos personas diferentes - T3chFest 2023
-
Materiales sobre el módulo de BD:
- Gestió d'usuaris i privilegis i Control de transaccions i concurrencia - Institut Obert de Catalunya.
- Lenguaje de control de datos (DCL) de José Juan Sánchez.
- Introducción a SQL de Jorge Sánchez.
- Realización de consultas de Javier Gutiérrez.
- Consulta de bases de datos de gestionbasesdatos.readthedocs.io
- Introducción a SQL, por Luis Valencia y David Orellana, de la Universidad de Sevilla.
Actividades¶
-
AC901. (RABD.2 // CE2g, CE2h // 3p) Sobre la instalación que tienes de MariaDB, realiza las siguientes operaciones:
- asdf
- AR916. (RABD.3 // CE6b, CE6c, CE6d, CE6e, CE6f, CE6g // 3p) Una vez finalizada la unidad, responde todas las preguntas del cuestionario inicial, con al menos un par de líneas para cada una de las cuestiones.