Skip to content

6. DCL (Data Control Language)

El Lenguaje de Control de Datos (Data Control Language o DCL) es un subconjunto de SQL utilizado para controlar el acceso a los datos almacenados en una base de datos Oracle. Los comandos DCL permiten a los administradores de bases de datos gestionar los permisos y privilegios de los usuarios, garantizando la seguridad y la integridad de los datos.

  • Control de acceso: Determina qué usuarios pueden acceder a qué objetos y qué operaciones pueden realizar
  • Seguridad de datos: Protege la información sensible de accesos no autorizados
  • Auditoría: Facilita el seguimiento de quién accede a los datos y qué operaciones realiza
  • Cumplimiento normativo: Ayuda a cumplir con regulaciones de protección de datos y privacidad

El comando GRANT se utiliza para otorgar privilegios a usuarios, roles u otros objetos de la base de datos.

Los privilegios de sistema permiten a los usuarios realizar acciones específicas en la base de datos, como crear tablas, vistas o ejecutar determinados comandos.

-- Sintaxis básica
GRANT privilegio_sistema [, privilegio_sistema...]
TO {usuario | rol | PUBLIC}
[WITH ADMIN OPTION];
-- Ejemplos
GRANT CREATE SESSION TO usuario1;
GRANT CREATE TABLE, CREATE VIEW TO desarrollador_rol;
GRANT CREATE ANY TABLE TO administrador_rol WITH ADMIN OPTION;

La opción WITH ADMIN OPTION permite al receptor del privilegio conceder ese mismo privilegio a otros usuarios o roles.

PrivilegioDescripción
CREATE SESSIONPermite conectarse a la base de datos
CREATE TABLEPermite crear tablas en el esquema propio
CREATE ANY TABLEPermite crear tablas en cualquier esquema
ALTER ANY TABLEPermite modificar tablas en cualquier esquema
DROP ANY TABLEPermite eliminar tablas en cualquier esquema
CREATE VIEWPermite crear vistas en el esquema propio
CREATE PROCEDUREPermite crear procedimientos en el esquema propio
CREATE SEQUENCEPermite crear secuencias en el esquema propio
CREATE USERPermite crear usuarios
ALTER USERPermite modificar usuarios
DROP USERPermite eliminar usuarios
CREATE ROLEPermite crear roles
SYSDBAPrivilegio administrativo de alto nivel
SYSOPERPrivilegio operativo de alto nivel
PrivilegioDescripción
SELECTPermite consultar datos de una tabla o vista
INSERTPermite insertar filas en una tabla o vista
UPDATEPermite actualizar filas en una tabla o vista
DELETEPermite eliminar filas de una tabla o vista
ALTERPermite modificar la definición de un objeto
INDEXPermite crear índices en una tabla
REFERENCESPermite crear restricciones de clave foránea que referencian a una tabla
EXECUTEPermite ejecutar un procedimiento, función o paquete
DEBUGPermite depurar un procedimiento, función o paquete
READPermite leer un directorio de la base de datos
WRITEPermite escribir en un directorio de la base de datos
-- Crear un usuario y otorgarle privilegios básicos
CREATE USER usuario_app IDENTIFIED BY contraseña;
GRANT CREATE SESSION TO usuario_app;
GRANT RESOURCE TO usuario_app; -- Rol predefinido que incluye varios privilegios
-- Otorgar privilegios de objeto específicos
GRANT SELECT, INSERT, UPDATE ON empleados TO usuario_app;
GRANT SELECT ON departamentos TO usuario_app;
-- Otorgar privilegios con opción de concesión
GRANT SELECT ON informes_ventas TO gerente_ventas WITH GRANT OPTION;
-- Otorgar privilegios a todos los usuarios (PUBLIC)
GRANT SELECT ON calendario_festivos TO PUBLIC;
-- Otorgar privilegios sobre columnas específicas
GRANT UPDATE (nombre, apellido, email) ON empleados TO recursos_humanos_rol;

El comando REVOKE se utiliza para retirar privilegios previamente otorgados a usuarios, roles u otros objetos de la base de datos.

-- Revocar privilegios de sistema
REVOKE privilegio_sistema [, privilegio_sistema...]
FROM {usuario | rol | PUBLIC};
-- Revocar privilegios de objeto
REVOKE {privilegio_objeto [, privilegio_objeto...] | ALL [PRIVILEGES]}
ON [schema.]objeto
FROM {usuario | rol | PUBLIC} [CASCADE CONSTRAINTS];
-- Revocar privilegios de sistema
REVOKE CREATE TABLE FROM usuario1;
-- Revocar privilegios de objeto
REVOKE UPDATE, DELETE ON empleados FROM usuario_app;
-- Revocar todos los privilegios sobre un objeto
REVOKE ALL ON productos FROM ventas_rol;
-- Revocar privilegios de PUBLIC
REVOKE SELECT ON calendario_festivos FROM PUBLIC;
-- Revocar con CASCADE CONSTRAINTS
-- Elimina también las restricciones de clave foránea que dependen del privilegio REFERENCES
REVOKE REFERENCES ON departamentos FROM usuario_app CASCADE CONSTRAINTS;
  1. Revocación directa

    • Cuando se revoca un privilegio otorgado directamente a un usuario, solo ese usuario pierde el privilegio
  2. Revocación en cascada

    • Si se revoca un privilegio otorgado con WITH GRANT OPTION o WITH ADMIN OPTION, todos los privilegios concedidos por el receptor también se revocan en cascada
  3. Revocación de roles

    • Cuando se revoca un rol de un usuario, este pierde todos los privilegios asociados a ese rol
  4. Restricciones CASCADE

    • La opción CASCADE CONSTRAINTS elimina las restricciones de clave foránea que dependen del privilegio REFERENCES revocado

Los roles son colecciones de privilegios que pueden asignarse a usuarios. Facilitan la administración de permisos al agrupar privilegios relacionados y asignarlos como una unidad.

  • Simplificación administrativa: Facilita la gestión de privilegios para grupos de usuarios
  • Consistencia: Garantiza que usuarios con funciones similares tengan los mismos privilegios
  • Seguridad mejorada: Permite aplicar el principio de privilegio mínimo
  • Flexibilidad: Los roles pueden ser modificados y los cambios se aplican automáticamente a todos los usuarios asignados
-- Crear un rol
CREATE ROLE analista_datos;
-- Asignar privilegios al rol
GRANT SELECT ANY TABLE TO analista_datos;
GRANT CREATE SESSION TO analista_datos;
GRANT CREATE VIEW TO analista_datos;
-- Asignar el rol a usuarios
GRANT analista_datos TO usuario1, usuario2;
-- Crear un rol con contraseña (rol protegido)
CREATE ROLE gerente_finanzas IDENTIFIED BY contraseña_segura;
-- Modificar un rol
ALTER ROLE gerente_finanzas NOT IDENTIFIED;
-- Eliminar un rol
DROP ROLE analista_temporal;
RolDescripción
CONNECTPrivilegios básicos para conectarse a la base de datos
RESOURCEPrivilegios para crear objetos como tablas, secuencias, etc.
DBATodos los privilegios administrativos (muy potente)
SELECT_CATALOG_ROLEPrivilegios para consultar vistas del diccionario de datos
EXECUTE_CATALOG_ROLEPrivilegios para ejecutar paquetes del sistema
DELETE_CATALOG_ROLEPrivilegios para eliminar registros en tablas del diccionario
EXP_FULL_DATABASEPrivilegios para realizar exportaciones completas
IMP_FULL_DATABASEPrivilegios para realizar importaciones completas

Los roles pueden contener otros roles, creando una jerarquía de privilegios.

-- Crear roles básicos
CREATE ROLE empleado_basico;
GRANT CREATE SESSION TO empleado_basico;
GRANT SELECT ON hr.informacion_publica TO empleado_basico;
-- Crear rol que incluye otro rol
CREATE ROLE empleado_rrhh;
GRANT empleado_basico TO empleado_rrhh; -- Hereda todos los privilegios de empleado_basico
GRANT SELECT, INSERT, UPDATE ON hr.empleados TO empleado_rrhh;
-- Asignar el rol jerárquico a un usuario
GRANT empleado_rrhh TO usuario_rrhh;

El principio de privilegio mínimo establece que los usuarios deben tener solo los privilegios necesarios para realizar sus tareas, ni más ni menos.

  1. Identificar requisitos de acceso

    • Determine exactamente qué objetos necesita acceder cada usuario y qué operaciones necesita realizar
  2. Crear roles específicos

    • Diseñe roles que contengan solo los privilegios necesarios para funciones específicas
  3. Evitar privilegios amplios

    • Evite otorgar privilegios como ANY o ALL a menos que sea absolutamente necesario
  4. Revisar regularmente

    • Audite y revise los privilegios periódicamente para identificar y revocar privilegios innecesarios

Un patrón común en Oracle es separar la propiedad de los objetos del acceso a los mismos mediante esquemas de aplicación.

-- Crear un esquema propietario de los objetos
CREATE USER app_owner IDENTIFIED BY contraseña_segura;
GRANT CREATE SESSION, RESOURCE TO app_owner;
-- El propietario crea los objetos
CONNECT app_owner/contraseña_segura
CREATE TABLE clientes (...);
CREATE TABLE productos (...);
-- Crear un esquema para acceso de aplicación
CREATE USER app_user IDENTIFIED BY otra_contraseña;
GRANT CREATE SESSION TO app_user;
-- Otorgar privilegios específicos al usuario de la aplicación
GRANT SELECT, INSERT, UPDATE, DELETE ON app_owner.clientes TO app_user;
GRANT SELECT ON app_owner.productos TO app_user;

Los sinónimos pueden mejorar la seguridad al ocultar los esquemas reales y simplificar el acceso a los objetos.

-- Crear sinónimos para el usuario de la aplicación
CREATE SYNONYM app_user.clientes FOR app_owner.clientes;
CREATE SYNONYM app_user.productos FOR app_owner.productos;
-- Crear sinónimos públicos
CREATE PUBLIC SYNONYM calendario FOR app_owner.calendario_festivos;

Oracle proporciona capacidades de auditoría para rastrear el acceso y las operaciones en la base de datos.

-- Habilitar auditoría para operaciones específicas
AUDIT SELECT TABLE BY usuario1;
AUDIT INSERT, UPDATE, DELETE ON app_owner.datos_financieros BY ACCESS;
AUDIT EXECUTE PROCEDURE ON app_owner.calcular_salario;
-- Deshabilitar auditoría
NOAUDIT SELECT TABLE BY usuario1;

Implementar políticas de contraseñas fuertes es esencial para la seguridad de la base de datos.

-- Crear un perfil de contraseña
CREATE PROFILE secure_profile LIMIT
PASSWORD_LIFE_TIME 60 -- Expiración en días
PASSWORD_GRACE_TIME 7 -- Período de gracia en días
PASSWORD_REUSE_TIME 365 -- Días antes de poder reutilizar
PASSWORD_REUSE_MAX 10 -- Número de cambios antes de reutilizar
FAILED_LOGIN_ATTEMPTS 5 -- Intentos fallidos antes de bloqueo
PASSWORD_LOCK_TIME 1/24 -- Tiempo de bloqueo (1 hora)
PASSWORD_VERIFY_FUNCTION verify_function_11g; -- Función de verificación
-- Asignar el perfil a un usuario
ALTER USER usuario1 PROFILE secure_profile;
-- Bloquear cuentas no utilizadas
ALTER USER usuario_inactivo ACCOUNT LOCK;
-- Establecer expiración de contraseña
ALTER USER usuario1 PASSWORD EXPIRE;
-- Limitar recursos de usuario
ALTER USER usuario_app QUOTA 500M ON users;
ALTER USER usuario_app DEFAULT TABLESPACE users;
  1. Auditar privilegios existentes

    • Revise regularmente qué privilegios tienen los usuarios y roles
    • Consulte las vistas DBA_SYS_PRIVS, DBA_TAB_PRIVS y DBA_ROLE_PRIVS
  2. Implementar el principio de privilegio mínimo

    • Otorgue solo los privilegios necesarios
    • Use roles para agrupar privilegios relacionados
  3. Proteger cuentas de usuario

    • Implemente políticas de contraseñas fuertes
    • Bloquee o elimine cuentas no utilizadas
  4. Configurar auditoría

    • Audite operaciones sensibles y accesos privilegiados
    • Revise regularmente los registros de auditoría
  5. Implementar controles adicionales

    • Considere el uso de Virtual Private Database (VPD)
    • Implemente cifrado para datos sensibles
    • Use vistas y procedimientos para control de acceso fino

Consulta del diccionario de datos para seguridad

Section titled “Consulta del diccionario de datos para seguridad”

Oracle proporciona varias vistas del diccionario de datos para consultar información sobre privilegios y seguridad.

-- Consultar privilegios de sistema otorgados a un usuario
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'USUARIO1';
-- Consultar privilegios de objeto otorgados a un usuario
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'USUARIO1';
-- Consultar roles otorgados a un usuario
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'USUARIO1';
-- Consultar privilegios otorgados a un rol
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'ANALISTA_DATOS';
SELECT * FROM ROLE_TAB_PRIVS WHERE ROLE = 'ANALISTA_DATOS';
-- Consultar jerarquía de roles
SELECT * FROM ROLE_ROLE_PRIVS;
-- Consultar usuarios y sus perfiles
SELECT USERNAME, PROFILE, ACCOUNT_STATUS FROM DBA_USERS;
-- Consultar configuración de perfiles
SELECT * FROM DBA_PROFILES WHERE PROFILE = 'SECURE_PROFILE';
-- Consultar información de auditoría
SELECT * FROM DBA_AUDIT_TRAIL;
🐝