Skip to content

6. Seguridad y Control de Accesos (DCL)

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.

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ásica
CREATE USER 'nombre_usuario'@'host' IDENTIFIED BY 'contraseña';
-- Ejemplos
-- Crear usuario que puede conectarse desde cualquier host
CREATE USER 'usuario1'@'%' IDENTIFIED BY 'password123';
-- Crear usuario que solo puede conectarse desde localhost
CREATE USER 'usuario2'@'localhost' IDENTIFIED BY 'password456';
-- Crear usuario con política de contraseña
CREATE USER 'usuario3'@'%' IDENTIFIED BY 'password789'
PASSWORD EXPIRE INTERVAL 90 DAY
FAILED_LOGIN_ATTEMPTS 3
PASSWORD HISTORY 5;
-- Cambiar contraseña
ALTER USER 'usuario1'@'%' IDENTIFIED BY 'nueva_contraseña';
-- Expirar contraseña
ALTER USER 'usuario1'@'%' PASSWORD EXPIRE;
-- Bloquear cuenta
ALTER USER 'usuario1'@'%' ACCOUNT LOCK;
-- Desbloquear cuenta
ALTER USER 'usuario1'@'%' ACCOUNT UNLOCK;
DROP USER 'usuario1'@'%';

El comando GRANT permite asignar privilegios específicos a usuarios o roles sobre objetos de la base de datos.

-- Sintaxis básica
GRANT tipo_privilegio [(columnas)] ON [objeto] TO 'usuario'@'host' [WITH GRANT OPTION];
-- Ejemplos
-- Conceder todos los privilegios en todas las tablas de una base de datos
GRANT ALL PRIVILEGES ON base_datos.* TO 'usuario1'@'%';
-- Conceder privilegios específicos en una tabla
GRANT SELECT, INSERT, UPDATE ON base_datos.tabla1 TO 'usuario2'@'localhost';
-- Conceder privilegios a nivel de columna
GRANT 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;
  • SELECT: Permite leer datos
  • INSERT: Permite insertar datos
  • UPDATE: Permite modificar datos
  • DELETE: Permite eliminar datos
  • REFERENCES: Permite crear claves foráneas
  • ALTER: Permite modificar la estructura de la tabla
  • INDEX: Permite crear índices
  • ALL 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 usuarios
  • CREATE TABLE: Permite crear tablas
  • CREATE VIEW: Permite crear vistas
  • CREATE PROCEDURE: Permite crear procedimientos
  • GRANT OPTION: Permite conceder privilegios a otros usuarios

El comando REVOKE permite quitar privilegios previamente concedidos a usuarios o roles.

-- Sintaxis básica
REVOKE tipo_privilegio [(columnas)] ON [objeto] FROM 'usuario'@'host';
-- Ejemplos
-- Revocar todos los privilegios en todas las tablas de una base de datos
REVOKE ALL PRIVILEGES ON base_datos.* FROM 'usuario1'@'%';
-- Revocar privilegios específicos en una tabla
REVOKE INSERT, UPDATE ON base_datos.tabla1 FROM 'usuario2'@'localhost';
-- Revocar privilegios a nivel de columna
REVOKE UPDATE (nombre) ON base_datos.empleados FROM 'usuario3'@'%';
-- Revocar privilegios globales
REVOKE CREATE USER ON *.* FROM 'admin'@'localhost';

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 rol
GRANT SELECT, INSERT, UPDATE ON ventas.* TO 'rol_ventas';
GRANT SELECT ON reportes.* TO 'rol_ventas';
-- Asignar rol a usuarios
GRANT 'rol_ventas' TO 'usuario1'@'%', 'usuario2'@'%';
-- Activar rol para la sesión actual
SET ROLE 'rol_ventas';
-- Activar todos los roles asignados
SET ROLE ALL;
-- Configurar rol por defecto
SET DEFAULT ROLE 'rol_ventas' TO 'usuario1'@'%';
-- Revocar rol de un usuario
REVOKE 'rol_ventas' FROM 'usuario1'@'%';
-- Eliminar un rol
DROP ROLE 'rol_ventas';

Oracle permite crear jerarquías de roles, donde un rol puede contener otros roles.

-- Crear roles
CREATE ROLE rol_lectura;
CREATE ROLE rol_escritura;
CREATE ROLE rol_administrador;
-- Asignar privilegios a roles básicos
GRANT SELECT ON schema.* TO rol_lectura;
GRANT INSERT, UPDATE, DELETE ON schema.* TO rol_escritura;
-- Crear jerarquía de roles
GRANT 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 usuario
GRANT rol_administrador TO usuario_jefe;

Principales diferencias en la gestión de usuarios y permisos

Section titled “Principales diferencias en la gestión de usuarios y permisos”
CaracterísticaMySQLOracle
Identificación de usuarioCombinación de nombre y host ('usuario'@'host')Solo nombre de usuario
Niveles de privilegiosGlobal, base de datos, tabla, columnaSistema, objeto, rol
RolesDisponible desde MySQL 8.0Disponible desde hace muchas versiones
Perfiles de seguridadLimitadoExtenso sistema de perfiles
TablespacesNo se asignan directamente a usuariosSe asignan directamente a usuarios
CuotasNo tiene sistema de cuotas por usuarioSistema completo de cuotas por tablespace
Privilegios administrativosSUPER, PROCESS, RELOAD, etc.SYSDBA, SYSOPER, SYSBACKUP, etc.
  1. Perfiles de seguridad: Oracle permite crear perfiles que definen límites de recursos y políticas de contraseñas.
-- Crear un perfil
CREATE 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 usuario
ALTER USER usuario1 PROFILE app_user;
  1. Privilegios de sistema avanzados: Oracle tiene privilegios administrativos especiales.
-- Conceder privilegios administrativos
GRANT SYSDBA TO admin_user;
GRANT SYSOPER TO operator_user;
-- Conectar con privilegios SYSDBA
CONNECT usuario/contraseña AS SYSDBA;
  1. Especificación de host: MySQL requiere especificar el host desde el que un usuario puede conectarse.
-- Diferentes usuarios según el host de conexión
CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'password1';
CREATE USER 'usuario'@'192.168.1.%' IDENTIFIED BY 'password2';
CREATE USER 'usuario'@'%' IDENTIFIED BY 'password3';
  1. Privilegios dinámicos: MySQL 8.0+ incluye privilegios dinámicos para tareas administrativas.
-- Conceder privilegios dinámicos
GRANT ROLE_ADMIN ON *.* TO 'admin'@'localhost';
GRANT BACKUP_ADMIN ON *.* TO 'backup_user'@'%';
GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'sysadmin'@'localhost';

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.

🐝