6. Seguridad y Control de Accesos (DCL)
Introducción
Section titled “Introducción”El Lenguaje de Control de Datos (DCL - Data Control Language) es un componente esencial de SQL que permite gestionar los aspectos de seguridad y control de acceso a las bases de datos. A través de comandos DCL, los administradores pueden controlar quién tiene acceso a qué datos y qué operaciones pueden realizar sobre ellos.
6.1. Crear usuarios (CREATE USER)
Section titled “6.1. Crear usuarios (CREATE USER)”La creación de usuarios es el primer paso para establecer un sistema de control de acceso. Cada usuario tendrá sus propias credenciales y permisos específicos.
-- Sintaxis básicaCREATE USER 'nombre_usuario'@'host' IDENTIFIED BY 'contraseña';
-- Ejemplos-- Crear usuario que puede conectarse desde cualquier hostCREATE USER 'usuario1'@'%' IDENTIFIED BY 'password123';
-- Crear usuario que solo puede conectarse desde localhostCREATE USER 'usuario2'@'localhost' IDENTIFIED BY 'password456';
-- Crear usuario con política de contraseñaCREATE USER 'usuario3'@'%' IDENTIFIED BY 'password789'PASSWORD EXPIRE INTERVAL 90 DAYFAILED_LOGIN_ATTEMPTS 3PASSWORD HISTORY 5;-- Sintaxis básicaCREATE USER nombre_usuario IDENTIFIED BY contraseña[DEFAULT TABLESPACE tablespace][TEMPORARY TABLESPACE tablespace][QUOTA {size | UNLIMITED} ON tablespace][PROFILE perfil][CONTAINER = {CURRENT | ALL}];
-- Ejemplos-- Crear usuario básicoCREATE USER usuario1 IDENTIFIED BY password123;
-- Crear usuario con tablespace y cuotaCREATE USER usuario2 IDENTIFIED BY password456DEFAULT TABLESPACE usersTEMPORARY TABLESPACE tempQUOTA 100M ON users;
-- Crear usuario con perfil y cuenta bloqueadaCREATE USER usuario3 IDENTIFIED BY password789PROFILE app_userACCOUNT LOCK;Modificar usuarios
Section titled “Modificar usuarios”-- Cambiar contraseñaALTER USER 'usuario1'@'%' IDENTIFIED BY 'nueva_contraseña';
-- Expirar contraseñaALTER USER 'usuario1'@'%' PASSWORD EXPIRE;
-- Bloquear cuentaALTER USER 'usuario1'@'%' ACCOUNT LOCK;
-- Desbloquear cuentaALTER USER 'usuario1'@'%' ACCOUNT UNLOCK;-- Cambiar contraseñaALTER USER usuario1 IDENTIFIED BY nueva_contraseña;
-- Cambiar tablespace por defectoALTER USER usuario1 DEFAULT TABLESPACE users;
-- Modificar cuotaALTER USER usuario1 QUOTA UNLIMITED ON users;
-- Bloquear cuentaALTER USER usuario1 ACCOUNT LOCK;
-- Desbloquear cuentaALTER USER usuario1 ACCOUNT UNLOCK;Eliminar usuarios
Section titled “Eliminar usuarios”DROP USER 'usuario1'@'%';-- Eliminar usuarioDROP USER usuario1;
-- Eliminar usuario y todos sus objetosDROP USER usuario1 CASCADE;6.2. Conceder permisos (GRANT)
Section titled “6.2. Conceder permisos (GRANT)”El comando GRANT permite asignar privilegios específicos a usuarios o roles sobre objetos de la base de datos.
-- Sintaxis básicaGRANT tipo_privilegio [(columnas)] ON [objeto] TO 'usuario'@'host' [WITH GRANT OPTION];
-- Ejemplos-- Conceder todos los privilegios en todas las tablas de una base de datosGRANT ALL PRIVILEGES ON base_datos.* TO 'usuario1'@'%';
-- Conceder privilegios específicos en una tablaGRANT SELECT, INSERT, UPDATE ON base_datos.tabla1 TO 'usuario2'@'localhost';
-- Conceder privilegios a nivel de columnaGRANT SELECT (id, nombre), UPDATE (nombre) ON base_datos.empleados TO 'usuario3'@'%';
-- Conceder privilegios con opción de concesión (permite al usuario conceder estos privilegios a otros)GRANT SELECT ON base_datos.productos TO 'usuario4'@'%' WITH GRANT OPTION;
-- Conceder privilegios globales (a nivel de servidor)GRANT CREATE USER ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;-- Sintaxis básicaGRANT privilegio [, privilegio...]ON objetoTO {usuario | rol | PUBLIC}[WITH ADMIN OPTION];
-- Ejemplos-- Conceder privilegios en una tablaGRANT SELECT, INSERT, UPDATE ON empleados TO usuario1;
-- Conceder privilegios a nivel de columnaGRANT SELECT (id, nombre), UPDATE (nombre) ON empleados TO usuario2;
-- Conceder privilegios con opción administrativaGRANT SELECT ON productos TO usuario3 WITH ADMIN OPTION;
-- Conceder privilegios de sistemaGRANT CREATE SESSION, CREATE TABLE TO usuario4;
-- Conceder todos los privilegiosGRANT ALL PRIVILEGES ON ventas TO usuario5;
-- Conceder privilegios a todos los usuariosGRANT SELECT ON informes_publicos TO PUBLIC;Tipos de privilegios comunes
Section titled “Tipos de privilegios comunes”Privilegios a nivel de tabla
Section titled “Privilegios a nivel de tabla”SELECT: Permite leer datosINSERT: Permite insertar datosUPDATE: Permite modificar datosDELETE: Permite eliminar datosREFERENCES: Permite crear claves foráneasALTER: Permite modificar la estructura de la tablaINDEX: Permite crear índicesALL PRIVILEGES: Concede todos los privilegios
Privilegios a nivel de sistema (varían según el motor)
Section titled “Privilegios a nivel de sistema (varían según el motor)”CREATE USER: Permite crear usuariosCREATE TABLE: Permite crear tablasCREATE VIEW: Permite crear vistasCREATE PROCEDURE: Permite crear procedimientosGRANT OPTION: Permite conceder privilegios a otros usuarios
6.3. Revocar permisos (REVOKE)
Section titled “6.3. Revocar permisos (REVOKE)”El comando REVOKE permite quitar privilegios previamente concedidos a usuarios o roles.
-- Sintaxis básicaREVOKE tipo_privilegio [(columnas)] ON [objeto] FROM 'usuario'@'host';
-- Ejemplos-- Revocar todos los privilegios en todas las tablas de una base de datosREVOKE ALL PRIVILEGES ON base_datos.* FROM 'usuario1'@'%';
-- Revocar privilegios específicos en una tablaREVOKE INSERT, UPDATE ON base_datos.tabla1 FROM 'usuario2'@'localhost';
-- Revocar privilegios a nivel de columnaREVOKE UPDATE (nombre) ON base_datos.empleados FROM 'usuario3'@'%';
-- Revocar privilegios globalesREVOKE CREATE USER ON *.* FROM 'admin'@'localhost';-- Sintaxis básicaREVOKE privilegio [, privilegio...]ON objetoFROM {usuario | rol | PUBLIC};
-- Ejemplos-- Revocar privilegios en una tablaREVOKE INSERT, UPDATE ON empleados FROM usuario1;
-- Revocar todos los privilegios en una tablaREVOKE ALL PRIVILEGES ON ventas FROM usuario2;
-- Revocar privilegios de sistemaREVOKE CREATE TABLE FROM usuario3;
-- Revocar privilegios de todos los usuariosREVOKE SELECT ON informes_publicos FROM PUBLIC;6.4. Roles y gestión de privilegios
Section titled “6.4. Roles y gestión de privilegios”Los roles son colecciones de privilegios que pueden asignarse a usuarios, facilitando la administración de permisos.
-- Crear un rol (MySQL 8.0+)CREATE ROLE 'rol_ventas';
-- Asignar privilegios al rolGRANT SELECT, INSERT, UPDATE ON ventas.* TO 'rol_ventas';GRANT SELECT ON reportes.* TO 'rol_ventas';
-- Asignar rol a usuariosGRANT 'rol_ventas' TO 'usuario1'@'%', 'usuario2'@'%';
-- Activar rol para la sesión actualSET ROLE 'rol_ventas';
-- Activar todos los roles asignadosSET ROLE ALL;
-- Configurar rol por defectoSET DEFAULT ROLE 'rol_ventas' TO 'usuario1'@'%';
-- Revocar rol de un usuarioREVOKE 'rol_ventas' FROM 'usuario1'@'%';
-- Eliminar un rolDROP ROLE 'rol_ventas';-- Crear un rolCREATE ROLE rol_ventas;
-- Asignar privilegios al rolGRANT SELECT, INSERT, UPDATE ON ventas TO rol_ventas;GRANT SELECT ON reportes TO rol_ventas;
-- Asignar rol a usuariosGRANT rol_ventas TO usuario1, usuario2;
-- Crear rol con contraseña (rol protegido)CREATE ROLE rol_admin IDENTIFIED BY password123;
-- Habilitar un rol en la sesión actualSET ROLE rol_ventas;
-- Habilitar un rol protegidoSET ROLE rol_admin IDENTIFIED BY password123;
-- Habilitar todos los rolesSET ROLE ALL;
-- Revocar rol de un usuarioREVOKE rol_ventas FROM usuario1;
-- Eliminar un rolDROP ROLE rol_ventas;Jerarquía de roles (Oracle)
Section titled “Jerarquía de roles (Oracle)”Oracle permite crear jerarquías de roles, donde un rol puede contener otros roles.
-- Crear rolesCREATE ROLE rol_lectura;CREATE ROLE rol_escritura;CREATE ROLE rol_administrador;
-- Asignar privilegios a roles básicosGRANT SELECT ON schema.* TO rol_lectura;GRANT INSERT, UPDATE, DELETE ON schema.* TO rol_escritura;
-- Crear jerarquía de rolesGRANT rol_lectura TO rol_escritura;GRANT rol_escritura TO rol_administrador;GRANT CREATE TABLE, DROP ANY TABLE TO rol_administrador;
-- Asignar rol superior a un usuarioGRANT rol_administrador TO usuario_jefe;6.5. Diferencias en MySQL y Oracle
Section titled “6.5. Diferencias en MySQL y Oracle”Principales diferencias en la gestión de usuarios y permisos
Section titled “Principales diferencias en la gestión de usuarios y permisos”| Característica | MySQL | Oracle |
|---|---|---|
| Identificación de usuario | Combinación de nombre y host ('usuario'@'host') | Solo nombre de usuario |
| Niveles de privilegios | Global, base de datos, tabla, columna | Sistema, objeto, rol |
| Roles | Disponible desde MySQL 8.0 | Disponible desde hace muchas versiones |
| Perfiles de seguridad | Limitado | Extenso sistema de perfiles |
| Tablespaces | No se asignan directamente a usuarios | Se asignan directamente a usuarios |
| Cuotas | No tiene sistema de cuotas por usuario | Sistema completo de cuotas por tablespace |
| Privilegios administrativos | SUPER, PROCESS, RELOAD, etc. | SYSDBA, SYSOPER, SYSBACKUP, etc. |
Características específicas de Oracle
Section titled “Características específicas de Oracle”- Perfiles de seguridad: Oracle permite crear perfiles que definen límites de recursos y políticas de contraseñas.
-- Crear un perfilCREATE PROFILE app_user LIMIT SESSIONS_PER_USER 3 CPU_PER_SESSION UNLIMITED CPU_PER_CALL 3000 CONNECT_TIME 45 IDLE_TIME 30 FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 60 PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 10 PASSWORD_LOCK_TIME 1/24 PASSWORD_GRACE_TIME 10 PASSWORD_VERIFY_FUNCTION verify_function;
-- Asignar perfil a un usuarioALTER USER usuario1 PROFILE app_user;- Privilegios de sistema avanzados: Oracle tiene privilegios administrativos especiales.
-- Conceder privilegios administrativosGRANT SYSDBA TO admin_user;GRANT SYSOPER TO operator_user;
-- Conectar con privilegios SYSDBACONNECT usuario/contraseña AS SYSDBA;Características específicas de MySQL
Section titled “Características específicas de MySQL”- Especificación de host: MySQL requiere especificar el host desde el que un usuario puede conectarse.
-- Diferentes usuarios según el host de conexiónCREATE USER 'usuario'@'localhost' IDENTIFIED BY 'password1';CREATE USER 'usuario'@'192.168.1.%' IDENTIFIED BY 'password2';CREATE USER 'usuario'@'%' IDENTIFIED BY 'password3';- Privilegios dinámicos: MySQL 8.0+ incluye privilegios dinámicos para tareas administrativas.
-- Conceder privilegios dinámicosGRANT ROLE_ADMIN ON *.* TO 'admin'@'localhost';GRANT BACKUP_ADMIN ON *.* TO 'backup_user'@'%';GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'sysadmin'@'localhost';Conclusión
Section titled “Conclusión”La gestión adecuada de usuarios, permisos y roles es fundamental para garantizar la seguridad de las bases de datos. Tanto MySQL como Oracle ofrecen mecanismos robustos para controlar el acceso a los datos, aunque con diferencias significativas en su implementación. Comprender estas diferencias es esencial para administrar eficazmente la seguridad en cualquier entorno de base de datos.