8. Administración de Usuarios, Permisos y Roles
Introducción a la administración de usuarios
Section titled “Introducción a la administración de usuarios”La administración de usuarios, permisos y roles es un aspecto fundamental en la seguridad de Oracle Database. Un sistema de gestión de usuarios bien diseñado permite controlar quién puede acceder a la base de datos y qué operaciones puede realizar cada usuario, protegiendo así la integridad y confidencialidad de los datos.
Conceptos clave
Section titled “Conceptos clave”- Usuario: Cuenta que permite el acceso a la base de datos
- Esquema: Colección de objetos de base de datos (tablas, vistas, procedimientos) asociados a un usuario
- Privilegio: Derecho para ejecutar un tipo específico de sentencia SQL o acceder a objetos de otro usuario
- Rol: Conjunto de privilegios que puede asignarse a usuarios
- Perfil: Conjunto de límites de recursos y políticas de contraseña
Creación y gestión de usuarios
Section titled “Creación y gestión de usuarios”CREATE USER - Creación de usuarios
Section titled “CREATE USER - Creación de usuarios”El comando CREATE USER permite crear una nueva cuenta de usuario en la base de datos.
Sintaxis básica
Section titled “Sintaxis básica”CREATE USER nombre_usuario IDENTIFIED BY contraseña [DEFAULT TABLESPACE nombre_tablespace] [TEMPORARY TABLESPACE nombre_tablespace_temp] [QUOTA {tamaño | UNLIMITED} ON nombre_tablespace] [PROFILE nombre_perfil] [CONTAINER = {CURRENT | ALL}] [ACCOUNT {LOCK | UNLOCK}];Ejemplos de creación de usuarios
Section titled “Ejemplos de creación de usuarios”-- Crear un usuario con configuración mínimaCREATE USER usuario1 IDENTIFIED BY "Contraseña123";
-- Otorgar privilegios mínimos para conectarseGRANT CREATE SESSION TO usuario1;-- Crear usuario especificando tablespaces y cuotasCREATE USER usuario2 IDENTIFIED BY "Contraseña456" DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA 100M ON users QUOTA 50M ON data;
-- Otorgar privilegios básicosGRANT CREATE SESSION TO usuario2;-- Dos formas de dar permisos en Oracle
-- 1) Roles "clásicos" (rápidos)GRANT CONNECT, RESOURCE TO usuario3;
-- CONNECT: hoy en día básicamente equivale a CREATE SESSION (poder conectarse).-- RESOURCE: permite crear varios objetos (tablas, procedimientos, triggers, etc.).-- Nota: en versiones antiguas incluía UNLIMITED TABLESPACE; en modernas ya no.-- ✅ Rápido para entornos de práctica.-- ⚠️ Menos control fino (da más de lo que quizás necesitas).
-- 2) Privilegios precisos (recomendado en 12c+)-- Otorgas solo lo necesario:GRANT CREATE SESSION TO usuario3; -- conectarseGRANT CREATE TABLE TO usuario3; -- crear tablasGRANT CREATE VIEW TO usuario3; -- crear vistasGRANT CREATE SEQUENCE TO usuario3; -- crear secuenciasGRANT CREATE PROCEDURE TO usuario3; -- crear procedimientos/funcionesGRANT CREATE TRIGGER TO usuario3; -- crear triggersGRANT CREATE TYPE TO usuario3; -- (opcional) tipos de objeto/coleccionesGRANT CREATE SYNONYM TO usuario3; -- (opcional) sinónimos privadosGRANT CREATE MATERIALIZED VIEW TO usuario3; -- (opcional) MV
-- 🔴 Muy importante: Para crear objetos en un tablespace, además de los privilegios de creación,-- el usuario necesita cuota en el tablespace.ALTER USER usuario3 QUOTA UNLIMITED ON users;-- o una cuota limitada:-- ALTER USER usuario3 QUOTA 200M ON users;
-- 🧪 Script recomendado (moderno y completo para desarrollo)-- 1) Crear el usuarioCREATE USER usuario3 IDENTIFIED BY "Contraseña789" DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp PROFILE perfil_desarrollo ACCOUNT UNLOCK;
-- 2) Permitir conectarseGRANT CREATE SESSION TO usuario3;
-- 3) Permisos para crear objetos en su esquemaGRANT CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, CREATE PROCEDURE, CREATE TRIGGER, CREATE TYPE, CREATE SYNONYM, CREATE MATERIALIZED VIEWTO usuario3;
-- 4) MUY IMPORTANTE: dar cuota en el tablespace de datosALTER USER usuario3 QUOTA UNLIMITED ON users;-- (o) ALTER USER usuario3 QUOTA 500M ON users;-- CREAR UNA BASE DE DATOS MATRICULA EN ORACLE-- Nombre: DEGUIDEV -- PASO 01ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;
-- PASO 02CREATE USER DEGUI IDENTIFIED BY "lipa123456"DEFAULT TABLESPACE "USERS"TEMPORARY TABLESPACE "TEMP";
-- PASO 03ALTER USER DEGUI QUOTA UNLIMITED ON USERS;
-- PASO 04GRANT CREATE SESSION TO DEGUI;
-- PASO 05GRANT "RESOURCE" TO DEGUI;
-- PASO 06ALTER USER DEGUI DEFAULT ROLE "RESOURCE";ALTER USER - Modificación de usuarios
Section titled “ALTER USER - Modificación de usuarios”El comando ALTER USER permite modificar las propiedades de un usuario existente.
Sintaxis básica
Section titled “Sintaxis básica”ALTER USER nombre_usuario [IDENTIFIED BY nueva_contraseña [REPLACE antigua_contraseña]] [DEFAULT TABLESPACE nombre_tablespace] [TEMPORARY TABLESPACE nombre_tablespace_temp] [QUOTA {tamaño | UNLIMITED} ON nombre_tablespace] [PROFILE nombre_perfil] [DEFAULT ROLE {rol1, rol2... | ALL | ALL EXCEPT rol1, rol2... | NONE}] [ACCOUNT {LOCK | UNLOCK}];Ejemplos de modificación de usuarios
Section titled “Ejemplos de modificación de usuarios”-- Cambiar la contraseña de un usuarioALTER USER usuario1 IDENTIFIED BY "NuevaContraseña123";
-- Cambiar contraseña con verificación de contraseña anteriorALTER USER usuario1 IDENTIFIED BY "NuevaContraseña456" REPLACE "NuevaContraseña123";-- Cambiar el tablespace por defectoALTER USER usuario2 DEFAULT TABLESPACE data;
-- Modificar cuotasALTER USER usuario2 QUOTA UNLIMITED ON data;ALTER USER usuario2 QUOTA 200M ON users;
-- Revocar acceso a un tablespaceALTER USER usuario2 QUOTA 0 ON temp_data;-- Bloquear una cuentaALTER USER usuario3 ACCOUNT LOCK;
-- Desbloquear una cuentaALTER USER usuario3 ACCOUNT UNLOCK;
-- Cambiar el perfilALTER USER usuario3 PROFILE perfil_produccion;
-- Establecer roles por defectoALTER USER usuario3 DEFAULT ROLE app_user, report_viewer;DROP USER - Eliminación de usuarios
Section titled “DROP USER - Eliminación de usuarios”El comando DROP USER permite eliminar un usuario de la base de datos.
Sintaxis básica
Section titled “Sintaxis básica”DROP USER nombre_usuario [CASCADE];Ejemplos de eliminación de usuarios
Section titled “Ejemplos de eliminación de usuarios”-- Eliminar un usuario sin objetosDROP USER usuario_temporal;
-- Eliminar un usuario y todos sus objetosDROP USER usuario_obsoleto CASCADE;Configuración de contraseñas y cuotas
Section titled “Configuración de contraseñas y cuotas”Políticas de contraseñas
Section titled “Políticas de contraseñas”Las políticas de contraseñas se configuran a través de perfiles de usuario, que definen restricciones y reglas para las contraseñas.
Creación y configuración de perfiles
Section titled “Creación y configuración de perfiles”-- Crear un perfil con políticas de contraseñaCREATE PROFILE perfil_seguro LIMIT PASSWORD_LIFE_TIME 60 -- Días de validez de la contraseña PASSWORD_GRACE_TIME 7 -- Días de gracia tras expiración PASSWORD_REUSE_TIME 365 -- Días antes de poder reutilizar una contraseña PASSWORD_REUSE_MAX 5 -- Número de cambios antes de poder reutilizar FAILED_LOGIN_ATTEMPTS 3 -- 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ónAsignación de perfiles a usuarios
Section titled “Asignación de perfiles a usuarios”-- Asignar perfil a un usuario nuevoCREATE USER usuario_seguro IDENTIFIED BY "Contraseña!123" PROFILE perfil_seguro;
-- Asignar perfil a un usuario existenteALTER USER usuario_existente PROFILE perfil_seguro;Funciones de verificación de contraseñas
Section titled “Funciones de verificación de contraseñas”Oracle proporciona funciones predefinidas para verificar la complejidad de las contraseñas:
-- Ver las funciones de verificación disponiblesSELECT * FROM dba_source WHERE name LIKE 'VERIFY_FUNCTION%' AND owner = 'SYS';
-- Crear una función personalizada de verificaciónCREATE OR REPLACE FUNCTION mi_verificacion_contraseña(username VARCHAR2, password VARCHAR2, old_password VARCHAR2)RETURN BOOLEAN ISBEGIN -- Verificar longitud mínima IF LENGTH(password) < 12 THEN RAISE_APPLICATION_ERROR(-20001, 'La contraseña debe tener al menos 12 caracteres'); END IF;
-- Verificar complejidad IF NOT REGEXP_LIKE(password, '[A-Z]') THEN RAISE_APPLICATION_ERROR(-20002, 'La contraseña debe contener al menos una letra mayúscula'); END IF;
IF NOT REGEXP_LIKE(password, '[a-z]') THEN RAISE_APPLICATION_ERROR(-20003, 'La contraseña debe contener al menos una letra minúscula'); END IF;
IF NOT REGEXP_LIKE(password, '[0-9]') THEN RAISE_APPLICATION_ERROR(-20004, 'La contraseña debe contener al menos un número'); END IF;
IF NOT REGEXP_LIKE(password, '[^A-Za-z0-9]') THEN RAISE_APPLICATION_ERROR(-20005, 'La contraseña debe contener al menos un carácter especial'); END IF;
-- Verificar que no contenga el nombre de usuario IF INSTR(LOWER(password), LOWER(username)) > 0 THEN RAISE_APPLICATION_ERROR(-20006, 'La contraseña no puede contener el nombre de usuario'); END IF;
RETURN TRUE;END;/
-- Asignar la función a un perfilALTER PROFILE perfil_seguro LIMIT PASSWORD_VERIFY_FUNCTION mi_verificacion_contraseña;Gestión de cuotas de espacio
Section titled “Gestión de cuotas de espacio”Las cuotas controlan la cantidad de espacio que un usuario puede utilizar en cada tablespace.
Asignación de cuotas
Section titled “Asignación de cuotas”-- Asignar cuota ilimitada en un tablespaceALTER USER usuario1 QUOTA UNLIMITED ON users;
-- Asignar cuota específicaALTER USER usuario2 QUOTA 500M ON data;
-- Revocar acceso a un tablespaceALTER USER usuario3 QUOTA 0 ON marketing_data;Monitoreo de uso de espacio
Section titled “Monitoreo de uso de espacio”-- Ver cuotas asignadas a usuariosSELECT * FROM dba_ts_quotas;
-- Ver uso de espacio por usuario y tablespaceSELECT username, tablespace_name, bytes, max_bytesFROM dba_ts_quotasORDER BY username, tablespace_name;Asignación de privilegios de sistema y de objeto
Section titled “Asignación de privilegios de sistema y de objeto”Privilegios de sistema
Section titled “Privilegios de sistema”Los privilegios de sistema permiten a los usuarios realizar acciones específicas en la base de datos.
Tipos de privilegios de sistema
Section titled “Tipos de privilegios de sistema”| Categoría | Ejemplos de privilegios |
|---|---|
| Conexión y sesión | CREATE SESSION, ALTER SESSION |
| Recursos | CREATE TABLE, CREATE VIEW, CREATE PROCEDURE |
| DBA | ALTER DATABASE, AUDIT SYSTEM, CREATE USER |
| Backup y recuperación | BACKUP ANY TABLE, RECOVER ANY TABLE |
| Seguridad | GRANT ANY PRIVILEGE, AUDIT ANY |
Asignación de privilegios de sistema
Section titled “Asignación de privilegios de sistema”-- Otorgar privilegios individualesGRANT CREATE SESSION, CREATE TABLE TO usuario1;
-- Otorgar privilegios con opción de administraciónGRANT CREATE USER, DROP USER TO administrador WITH ADMIN OPTION;
-- Revocar privilegiosREVOKE CREATE TABLE FROM usuario1;Privilegios de objeto
Section titled “Privilegios de objeto”Los privilegios de objeto permiten a los usuarios realizar operaciones específicas sobre objetos de la base de datos.
Tipos de privilegios de objeto
Section titled “Tipos de privilegios de objeto”| Objeto | Privilegios disponibles |
|---|---|
| TABLE | SELECT, INSERT, UPDATE, DELETE, ALTER, REFERENCES, INDEX |
| VIEW | SELECT, INSERT, UPDATE, DELETE |
| SEQUENCE | SELECT, ALTER |
| PROCEDURE | EXECUTE |
| DIRECTORY | READ, WRITE |
Asignación de privilegios de objeto
Section titled “Asignación de privilegios de objeto”-- Otorgar privilegio de lectura en una tablaGRANT SELECT ON empleados TO usuario1;
-- Otorgar privilegios múltiplesGRANT SELECT, INSERT, UPDATE ON clientes TO usuario2;
-- Otorgar privilegio de ejecuciónGRANT EXECUTE ON calcular_salario TO usuario3;-- Otorgar con opción de concesiónGRANT SELECT ON productos TO usuario1 WITH GRANT OPTION;
-- Otorgar privilegios en columnas específicasGRANT UPDATE (nombre, precio) ON productos TO usuario2;
-- Otorgar privilegios a todos los usuariosGRANT SELECT ON informacion_publica TO PUBLIC;-- Revocar un privilegioREVOKE DELETE ON clientes FROM usuario1;
-- Revocar todos los privilegios sobre un objetoREVOKE ALL ON empleados FROM usuario2;
-- Revocar con cascadaREVOKE SELECT ON productos FROM usuario1 CASCADE CONSTRAINTS;Consulta de privilegios
Section titled “Consulta de privilegios”-- Ver privilegios de sistema otorgados a usuariosSELECT * FROM dba_sys_privs;
-- Ver privilegios de objeto otorgados a usuariosSELECT * FROM dba_tab_privs;
-- Ver privilegios otorgados al usuario actualSELECT * FROM session_privs;
-- Ver privilegios de columnaSELECT * FROM dba_col_privs;Creación y administración de roles
Section titled “Creación y administración de roles”Los roles son colecciones de privilegios que facilitan la administración de seguridad al agrupar privilegios relacionados.
Creación de roles
Section titled “Creación de roles”-- Crear un rol básicoCREATE ROLE rol_analista;
-- Crear un rol con contraseña (requiere autenticación)CREATE ROLE rol_administrador IDENTIFIED BY "RolPassword123";
-- Crear un rol que se autentica externamenteCREATE ROLE rol_externo IDENTIFIED EXTERNALLY;
-- Crear un rol que se autentica globalmenteCREATE ROLE rol_global IDENTIFIED GLOBALLY;Asignación de privilegios a roles
Section titled “Asignación de privilegios a roles”-- Asignar privilegios de sistema a un rolGRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO rol_desarrollador;
-- Asignar privilegios de objeto a un rolGRANT SELECT ON hr.empleados TO rol_analista;GRANT SELECT, INSERT, UPDATE ON hr.departamentos TO rol_analista;
-- Asignar un rol a otro rol (jerarquía de roles)GRANT rol_analista TO rol_gerente;Asignación de roles a usuarios
Section titled “Asignación de roles a usuarios”-- Asignar un rol a un usuarioGRANT rol_analista TO usuario1;
-- Asignar múltiples rolesGRANT rol_desarrollador, rol_tester TO usuario2;
-- Asignar rol con opción de administraciónGRANT rol_departamento TO jefe_departamento WITH ADMIN OPTION;Gestión de roles
Section titled “Gestión de roles”-- Modificar un rol (cambiar contraseña)ALTER ROLE rol_administrador IDENTIFIED BY "NuevoPassword456";
-- Eliminar la autenticación de un rolALTER ROLE rol_administrador NOT IDENTIFIED;
-- Eliminar un rolDROP ROLE rol_temporal;
-- Habilitar/deshabilitar roles para la sesión actualSET ROLE rol_analista, rol_reportes;SET ROLE NONE; -- Deshabilitar todos los rolesSET ROLE ALL; -- Habilitar todos los roles por defectoRoles predefinidos en Oracle
Section titled “Roles predefinidos en Oracle”Oracle proporciona varios roles predefinidos para tareas comunes:
| Rol | Descripción |
|---|---|
| CONNECT | Privilegios básicos para conectarse a la base de datos |
| RESOURCE | Privilegios para crear objetos en el esquema propio |
| DBA | Todos los privilegios con opción de administración |
| SELECT_CATALOG_ROLE | Acceso de lectura a las vistas del diccionario |
| EXECUTE_CATALOG_ROLE | Privilegios de ejecución en paquetes del sistema |
| DELETE_CATALOG_ROLE | Privilegios para eliminar registros en tablas de auditoría |
| EXP_FULL_DATABASE | Privilegios para exportar toda la base de datos |
| IMP_FULL_DATABASE | Privilegios para importar toda la base de datos |
Consulta de información sobre roles
Section titled “Consulta de información sobre roles”-- Ver todos los roles de la base de datosSELECT * FROM dba_roles;
-- Ver privilegios asignados a rolesSELECT * FROM role_sys_privs;SELECT * FROM role_tab_privs;
-- Ver roles asignados a usuariosSELECT * FROM dba_role_privs;
-- Ver jerarquía de rolesSELECT * FROM role_role_privs;
-- Ver roles habilitados en la sesión actualSELECT * FROM session_roles;Buenas prácticas de seguridad en Oracle
Section titled “Buenas prácticas de seguridad en Oracle”Principios fundamentales
Section titled “Principios fundamentales”-
Principio de privilegio mínimo
- Otorgar solo los privilegios necesarios para realizar las tareas requeridas
- Revisar y auditar periódicamente los privilegios asignados
-
Separación de deberes
- Dividir responsabilidades entre diferentes usuarios
- Evitar concentrar demasiados privilegios en un solo usuario
-
Defensa en profundidad
- Implementar múltiples capas de seguridad
- Combinar seguridad a nivel de base de datos con seguridad a nivel de aplicación
-
Auditoría y monitoreo
- Activar auditoría para acciones críticas
- Revisar regularmente los registros de auditoría
Recomendaciones para la gestión de usuarios
Section titled “Recomendaciones para la gestión de usuarios”-- 1. Bloquear y expirar cuentas por defecto no utilizadasSELECT username, account_status FROM dba_users WHERE username IN ('SCOTT', 'HR', 'OE', 'SH');
ALTER USER SCOTT ACCOUNT LOCK PASSWORD EXPIRE;
-- 2. Crear usuarios específicos para aplicacionesCREATE USER app_usuario IDENTIFIED BY "AppPassword123" DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp PROFILE app_profile QUOTA 500M ON users;
-- 3. Utilizar esquemas proxy para aplicacionesALTER USER app_usuario GRANT CONNECT THROUGH webapp_proxy;
-- 4. Implementar autenticación externa cuando sea posibleCREATE USER sso_usuario IDENTIFIED GLOBALLY AS 'CN=usuario1,OU=Usuarios,DC=empresa,DC=com';Recomendaciones para privilegios y roles
Section titled “Recomendaciones para privilegios y roles”-- 1. Crear roles específicos por funciónCREATE ROLE rol_ventas;GRANT SELECT ON productos TO rol_ventas;GRANT SELECT, INSERT, UPDATE ON pedidos TO rol_ventas;GRANT SELECT, INSERT ON clientes TO rol_ventas;
-- 2. Evitar asignar privilegios directamente a usuarios-- Incorrecto:GRANT SELECT ON hr.empleados TO usuario1;
-- Correcto:CREATE ROLE rol_rrhh;GRANT SELECT ON hr.empleados TO rol_rrhh;GRANT rol_rrhh TO usuario1;
-- 3. Limitar el uso de WITH ADMIN OPTION y WITH GRANT OPTION-- Usar con precaución:GRANT rol_departamento TO jefe_departamento WITH ADMIN OPTION;
-- 4. Revocar privilegios innecesariosREVOKE CREATE ANY TABLE FROM usuario_desarrollo;Configuración de seguridad avanzada
Section titled “Configuración de seguridad avanzada”-- Crear perfil con política de contraseñas fuerteCREATE PROFILE secure_profile LIMIT PASSWORD_LIFE_TIME 90 PASSWORD_GRACE_TIME 7 PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 10 FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1/24 PASSWORD_VERIFY_FUNCTION ora12c_verify_function;
-- Aplicar a todos los usuariosALTER USER usuario1 PROFILE secure_profile;ALTER USER usuario2 PROFILE secure_profile;-- Configurar auditoría unificada-- Habilitar auditoríaAUDIT POLICY admin_actions BY SYSTEM;
-- Crear política de auditoría personalizadaCREATE AUDIT POLICY data_access_policy ACTIONS SELECT ON hr.empleados, UPDATE ON hr.salarios, DELETE ON hr.empleados;
-- Aplicar políticaAUDIT POLICY data_access_policy BY usuario1, usuario2;-- Crear llave de cifradoCREATE OR REPLACE DIRECTORY cert_dir AS '/oracle/app/wallet';
-- Cifrar columnas sensiblesALTER TABLE clientes MODIFY ( numero_tarjeta ENCRYPT USING 'AES256' NO SALT, cvv ENCRYPT);
-- Crear índice en columna cifradaCREATE INDEX idx_tarjeta ON clientes(numero_tarjeta) PARAMETERS ('ENCRYPT');Lista de verificación de seguridad
Section titled “Lista de verificación de seguridad”-
Configuración inicial
- Cambiar todas las contraseñas por defecto
- Bloquear cuentas no utilizadas
- Implementar perfiles de seguridad
-
Gestión de usuarios
- Crear usuarios específicos para cada propósito
- Implementar política de contraseñas robusta
- Revisar periódicamente las cuentas inactivas
-
Privilegios y roles
- Aplicar principio de privilegio mínimo
- Utilizar roles para agrupar privilegios
- Auditar privilegios críticos
-
Monitoreo y auditoría
- Configurar auditoría para acciones críticas
- Revisar regularmente los registros de auditoría
- Implementar alertas para actividades sospechosas
-
Mantenimiento
- Aplicar parches de seguridad regularmente
- Realizar evaluaciones de seguridad periódicas
- Documentar políticas y procedimientos de seguridad
Consultas útiles para auditoría de seguridad
Section titled “Consultas útiles para auditoría de seguridad”-- Usuarios con el rol DBASELECT grantee FROM dba_role_privs WHERE granted_role = 'DBA';
-- Usuarios con privilegios críticosSELECT grantee, privilege FROM dba_sys_privsWHERE privilege IN ('ALTER DATABASE', 'ALTER SYSTEM', 'CREATE ANY JOB');
-- Cuentas con contraseñas por defectoSELECT username, account_status FROM dba_usersWHERE password_versions NOT LIKE '%12%';
-- Usuarios con cuotas ilimitadasSELECT username, tablespace_name FROM dba_ts_quotasWHERE max_bytes = -1;
-- Objetos con privilegios concedidos a PUBLICSELECT owner, table_name, privilege FROM dba_tab_privsWHERE grantee = 'PUBLIC';