6. DCL (Data Control Language)
Introducción al DCL
Section titled “Introducción al DCL”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.
Características principales del DCL
Section titled “Características principales del DCL”- 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
GRANT - Asignación de privilegios
Section titled “GRANT - Asignación de privilegios”El comando GRANT se utiliza para otorgar privilegios a usuarios, roles u otros objetos de la base de datos.
Tipos de privilegios en Oracle
Section titled “Tipos de privilegios en Oracle”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ásicaGRANT privilegio_sistema [, privilegio_sistema...]TO {usuario | rol | PUBLIC}[WITH ADMIN OPTION];
-- EjemplosGRANT 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.
Los privilegios de objeto permiten a los usuarios realizar operaciones específicas sobre objetos particulares de la base de datos, como tablas, vistas o procedimientos.
-- Sintaxis básicaGRANT {privilegio_objeto [, privilegio_objeto...] | ALL [PRIVILEGES]}ON [schema.]objetoTO {usuario | rol | PUBLIC}[WITH GRANT OPTION];
-- EjemplosGRANT SELECT ON empleados TO usuario1;GRANT INSERT, UPDATE, DELETE ON productos TO ventas_rol;GRANT SELECT, INSERT ON schema1.clientes TO PUBLIC;GRANT ALL ON pedidos TO administrador_rol WITH GRANT OPTION;La opción WITH GRANT OPTION permite al receptor del privilegio conceder ese mismo privilegio sobre ese objeto a otros usuarios o roles.
Privilegios de sistema comunes
Section titled “Privilegios de sistema comunes”| Privilegio | Descripción |
|---|---|
| CREATE SESSION | Permite conectarse a la base de datos |
| CREATE TABLE | Permite crear tablas en el esquema propio |
| CREATE ANY TABLE | Permite crear tablas en cualquier esquema |
| ALTER ANY TABLE | Permite modificar tablas en cualquier esquema |
| DROP ANY TABLE | Permite eliminar tablas en cualquier esquema |
| CREATE VIEW | Permite crear vistas en el esquema propio |
| CREATE PROCEDURE | Permite crear procedimientos en el esquema propio |
| CREATE SEQUENCE | Permite crear secuencias en el esquema propio |
| CREATE USER | Permite crear usuarios |
| ALTER USER | Permite modificar usuarios |
| DROP USER | Permite eliminar usuarios |
| CREATE ROLE | Permite crear roles |
| SYSDBA | Privilegio administrativo de alto nivel |
| SYSOPER | Privilegio operativo de alto nivel |
Privilegios de objeto comunes
Section titled “Privilegios de objeto comunes”| Privilegio | Descripción |
|---|---|
| SELECT | Permite consultar datos de una tabla o vista |
| INSERT | Permite insertar filas en una tabla o vista |
| UPDATE | Permite actualizar filas en una tabla o vista |
| DELETE | Permite eliminar filas de una tabla o vista |
| ALTER | Permite modificar la definición de un objeto |
| INDEX | Permite crear índices en una tabla |
| REFERENCES | Permite crear restricciones de clave foránea que referencian a una tabla |
| EXECUTE | Permite ejecutar un procedimiento, función o paquete |
| DEBUG | Permite depurar un procedimiento, función o paquete |
| READ | Permite leer un directorio de la base de datos |
| WRITE | Permite escribir en un directorio de la base de datos |
Ejemplos prácticos de GRANT
Section titled “Ejemplos prácticos de GRANT”-- Crear un usuario y otorgarle privilegios básicosCREATE 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íficosGRANT SELECT, INSERT, UPDATE ON empleados TO usuario_app;GRANT SELECT ON departamentos TO usuario_app;
-- Otorgar privilegios con opción de concesiónGRANT 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íficasGRANT UPDATE (nombre, apellido, email) ON empleados TO recursos_humanos_rol;REVOKE - Revocación de privilegios
Section titled “REVOKE - Revocación de privilegios”El comando REVOKE se utiliza para retirar privilegios previamente otorgados a usuarios, roles u otros objetos de la base de datos.
Sintaxis básica
Section titled “Sintaxis básica”-- Revocar privilegios de sistemaREVOKE privilegio_sistema [, privilegio_sistema...]FROM {usuario | rol | PUBLIC};
-- Revocar privilegios de objetoREVOKE {privilegio_objeto [, privilegio_objeto...] | ALL [PRIVILEGES]}ON [schema.]objetoFROM {usuario | rol | PUBLIC} [CASCADE CONSTRAINTS];Ejemplos prácticos de REVOKE
Section titled “Ejemplos prácticos de REVOKE”-- Revocar privilegios de sistemaREVOKE CREATE TABLE FROM usuario1;
-- Revocar privilegios de objetoREVOKE UPDATE, DELETE ON empleados FROM usuario_app;
-- Revocar todos los privilegios sobre un objetoREVOKE ALL ON productos FROM ventas_rol;
-- Revocar privilegios de PUBLICREVOKE SELECT ON calendario_festivos FROM PUBLIC;
-- Revocar con CASCADE CONSTRAINTS-- Elimina también las restricciones de clave foránea que dependen del privilegio REFERENCESREVOKE REFERENCES ON departamentos FROM usuario_app CASCADE CONSTRAINTS;Comportamiento de la revocación
Section titled “Comportamiento de la revocación”-
Revocación directa
- Cuando se revoca un privilegio otorgado directamente a un usuario, solo ese usuario pierde el privilegio
-
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
-
Revocación de roles
- Cuando se revoca un rol de un usuario, este pierde todos los privilegios asociados a ese rol
-
Restricciones CASCADE
- La opción CASCADE CONSTRAINTS elimina las restricciones de clave foránea que dependen del privilegio REFERENCES revocado
Creación y uso de roles
Section titled “Creación y uso de roles”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.
Ventajas de usar roles
Section titled “Ventajas de usar roles”- 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
Creación y gestión de roles
Section titled “Creación y gestión de roles”-- Crear un rolCREATE ROLE analista_datos;
-- Asignar privilegios al rolGRANT SELECT ANY TABLE TO analista_datos;GRANT CREATE SESSION TO analista_datos;GRANT CREATE VIEW TO analista_datos;
-- Asignar el rol a usuariosGRANT analista_datos TO usuario1, usuario2;
-- Crear un rol con contraseña (rol protegido)CREATE ROLE gerente_finanzas IDENTIFIED BY contraseña_segura;
-- Modificar un rolALTER ROLE gerente_finanzas NOT IDENTIFIED;
-- Eliminar un rolDROP ROLE analista_temporal;Roles predefinidos en Oracle
Section titled “Roles predefinidos en Oracle”| Rol | Descripción |
|---|---|
| CONNECT | Privilegios básicos para conectarse a la base de datos |
| RESOURCE | Privilegios para crear objetos como tablas, secuencias, etc. |
| DBA | Todos los privilegios administrativos (muy potente) |
| SELECT_CATALOG_ROLE | Privilegios para consultar vistas del diccionario de datos |
| EXECUTE_CATALOG_ROLE | Privilegios para ejecutar paquetes del sistema |
| DELETE_CATALOG_ROLE | Privilegios para eliminar registros en tablas del diccionario |
| EXP_FULL_DATABASE | Privilegios para realizar exportaciones completas |
| IMP_FULL_DATABASE | Privilegios para realizar importaciones completas |
Jerarquía de roles
Section titled “Jerarquía de roles”Los roles pueden contener otros roles, creando una jerarquía de privilegios.
-- Crear roles básicosCREATE ROLE empleado_basico;GRANT CREATE SESSION TO empleado_basico;GRANT SELECT ON hr.informacion_publica TO empleado_basico;
-- Crear rol que incluye otro rolCREATE ROLE empleado_rrhh;GRANT empleado_basico TO empleado_rrhh; -- Hereda todos los privilegios de empleado_basicoGRANT SELECT, INSERT, UPDATE ON hr.empleados TO empleado_rrhh;
-- Asignar el rol jerárquico a un usuarioGRANT empleado_rrhh TO usuario_rrhh;Seguridad y buenas prácticas
Section titled “Seguridad y buenas prácticas”Principio de privilegio mínimo
Section titled “Principio de privilegio mínimo”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.
-
Identificar requisitos de acceso
- Determine exactamente qué objetos necesita acceder cada usuario y qué operaciones necesita realizar
-
Crear roles específicos
- Diseñe roles que contengan solo los privilegios necesarios para funciones específicas
-
Evitar privilegios amplios
- Evite otorgar privilegios como
ANYoALLa menos que sea absolutamente necesario
- Evite otorgar privilegios como
-
Revisar regularmente
- Audite y revise los privilegios periódicamente para identificar y revocar privilegios innecesarios
Uso de esquemas de aplicación
Section titled “Uso de esquemas de aplicación”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 objetosCREATE USER app_owner IDENTIFIED BY contraseña_segura;GRANT CREATE SESSION, RESOURCE TO app_owner;
-- El propietario crea los objetosCONNECT app_owner/contraseña_seguraCREATE TABLE clientes (...);CREATE TABLE productos (...);
-- Crear un esquema para acceso de aplicaciónCREATE USER app_user IDENTIFIED BY otra_contraseña;GRANT CREATE SESSION TO app_user;
-- Otorgar privilegios específicos al usuario de la aplicaciónGRANT SELECT, INSERT, UPDATE, DELETE ON app_owner.clientes TO app_user;GRANT SELECT ON app_owner.productos TO app_user;Uso de sinónimos
Section titled “Uso de sinónimos”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ónCREATE SYNONYM app_user.clientes FOR app_owner.clientes;CREATE SYNONYM app_user.productos FOR app_owner.productos;
-- Crear sinónimos públicosCREATE PUBLIC SYNONYM calendario FOR app_owner.calendario_festivos;Auditoría de base de datos
Section titled “Auditoría de base de datos”Oracle proporciona capacidades de auditoría para rastrear el acceso y las operaciones en la base de datos.
-- Habilitar auditoría para operaciones específicasAUDIT 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íaNOAUDIT SELECT TABLE BY usuario1;Políticas de contraseñas
Section titled “Políticas de contraseñas”Implementar políticas de contraseñas fuertes es esencial para la seguridad de la base de datos.
-- Crear un perfil de contraseñaCREATE 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 usuarioALTER USER usuario1 PROFILE secure_profile;Mejores prácticas de seguridad
Section titled “Mejores prácticas de seguridad”-- Bloquear cuentas no utilizadasALTER USER usuario_inactivo ACCOUNT LOCK;
-- Establecer expiración de contraseñaALTER USER usuario1 PASSWORD EXPIRE;
-- Limitar recursos de usuarioALTER USER usuario_app QUOTA 500M ON users;ALTER USER usuario_app DEFAULT TABLESPACE users;-- Usar vistas para control de acceso finoCREATE VIEW empleados_departamento ASSELECT * FROM empleadosWHERE departamento_id = SYS_CONTEXT('USERENV', 'DEPARTMENT_ID');
GRANT SELECT ON empleados_departamento TO empleados_rol;
-- Usar Virtual Private Database (VPD)BEGIN DBMS_RLS.ADD_POLICY( object_schema => 'app_owner', object_name => 'empleados', policy_name => 'emp_dept_policy', function_schema => 'sec_admin', policy_function => 'get_dept_policy', statement_types => 'SELECT, INSERT, UPDATE, DELETE' );END;/-- Cifrar columnas sensiblesCREATE TABLE clientes ( cliente_id NUMBER PRIMARY KEY, nombre VARCHAR2(100), tarjeta_credito VARCHAR2(128) ENCRYPT USING 'AES256');
-- Cifrar tablespaceCREATE TABLESPACE secure_data DATAFILE '/path/to/datafile.dbf' SIZE 100M ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT);Lista de verificación de seguridad
Section titled “Lista de verificación de seguridad”-
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
-
Implementar el principio de privilegio mínimo
- Otorgue solo los privilegios necesarios
- Use roles para agrupar privilegios relacionados
-
Proteger cuentas de usuario
- Implemente políticas de contraseñas fuertes
- Bloquee o elimine cuentas no utilizadas
-
Configurar auditoría
- Audite operaciones sensibles y accesos privilegiados
- Revise regularmente los registros de auditoría
-
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 usuarioSELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'USUARIO1';
-- Consultar privilegios de objeto otorgados a un usuarioSELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'USUARIO1';
-- Consultar roles otorgados a un usuarioSELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'USUARIO1';
-- Consultar privilegios otorgados a un rolSELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'ANALISTA_DATOS';SELECT * FROM ROLE_TAB_PRIVS WHERE ROLE = 'ANALISTA_DATOS';
-- Consultar jerarquía de rolesSELECT * FROM ROLE_ROLE_PRIVS;
-- Consultar usuarios y sus perfilesSELECT USERNAME, PROFILE, ACCOUNT_STATUS FROM DBA_USERS;
-- Consultar configuración de perfilesSELECT * FROM DBA_PROFILES WHERE PROFILE = 'SECURE_PROFILE';
-- Consultar información de auditoríaSELECT * FROM DBA_AUDIT_TRAIL;