La auditoría en Oracle Database permite registrar y revisar las acciones ejecutadas sobre la instancia. A continuación se describe cómo habilitar el rastro de auditoría y se ejemplifican los cuatro modos principales: por sentencia, por privilegio, por objeto y auditoría de grano fino (FGA). Los ejemplos se ejecutan sobre Oracle 11g y son aplicables a versiones 12c y 19c.
- Activación del rastro de auditoría
El parámetro audit_trail define dónde se almacenan los registros. El valor db_extended guarda tanto las sentencias SQL como los valores de enlazado (bind values).
sqlplus / as sysdba
show parameter audit_trail
alter system set audit_trail=db_extended scope=spfile;
startup force
show parameter audit_trail
- Auditoría de sentencias
La auditoría de sentencias registra la ejecución de instrucciones SQL específicas por parte de un usuario. El siguiente ejemplo activa el seguimiento de la operación CREATE TABLE para el usuario USR_DEMO.
-- Desbloquear usuario de ejemplo
alter user usr_demo account unlock identified by demo_pass;
audit create table by usr_demo by access;
select user_name, audit_option, success, failure
from dba_stmt_audit_opts
where user_name = 'USR_DEMO';
conn usr_demo/demo_pass
create table t_demo (id number);
Para consultar los registros generados se utiliza dba_audit_trail:
conn / as sysdba
select username,
to_char(timestamp, 'MM/DD/YY HH24:MI:SS') as event_time,
obj_name,
action_name,
sql_text
from dba_audit_trail
where username = 'USR_DEMO';
Para desactivar la auditoría:
noaudit create table by usr_demo;
- Auditoría de privilegios
Este modo registra el uso de privilegios del sistema. Es útil para detectar abusos, cumplir requisitos normativos y facilitar diagnósticos. El parámetro audit_sys_operations permite auditar operaciones ejecutadas con SYSDBA o SYSOPER.
alter system set audit_sys_operations=true scope=spfile;
startup force
conn / as sysdba
audit create table by usr_demo by access;
audit session by usr_demo;
select user_name, privilege, success, failure
from dba_priv_audit_opts
where user_name = 'USR_DEMO'
order by user_name;
conn usr_demo/demo_pass
create table t_priv (id number);
El destino de los registros depende del valor de audit_trail: base de datos, archivos del sistema operativo o XML. Cuando audit_sys_operations está activo, las sesiones administrativas generan archivos *.aud bajo el directorio de auditoría de la instancia, por ejemplo /u01/app/oracle/admin/orcl/adump/.
- Auditoría de objetos
La auditoría de objetos supervisa operaciones sobre objetos concretos: tablas, vistas, procedimientos, etc. El siguiente ejemplo registra las operaciones SELECT, INSERT y DELETE sobre la tabla usr_demo.departamentos.
audit select, insert, delete on usr_demo.departamentos by access;
select object_name, object_type, alt, del, ins, upd, sel
from dba_obj_audit_opts;
conn usr_demo/demo_pass
insert into departamentos values(11, 'Ventas', 'Madrid');
insert into departamentos values(12, 'IT', 'Barcelona');
commit;
Consulta de los registros:
conn / as sysdba
select timestamp, action_name, sql_text
from dba_audit_trail
where owner = 'USR_DEMO';
Y para eliminar la política:
noaudit select, insert, delete on usr_demo.departamentos;
La vista dba_audit_object también puede utilizarse para filtrar por objeto y tipo de acción.
- Auditoría de grano fino (FGA)
FGA (Fine-Grained Auditing) permite definir condiciones precisas sobre qué filas y columnas se auditan, reduciendo el volumen de regisrtos y adaptándose a requisitos complejos. Se configura con el paquete DBMS_FGA.
El siguiente ejemplo crea una política que audita el acceso a la columna salary de la tabla rrhh.empleados únicamente cuando el puesto contiene la cadena _MGR.
create user app_reader identified by reader_pwd;
grant create session to app_reader;
grant select on rrhh.empleados to app_reader;
begin
dbms_fga.add_policy(
object_schema => 'RRHH',
object_name => 'EMPLEADOS',
policy_name => 'AUDIT_SALARY_MANAGER',
audit_condition => 'instr(job_id, ''_MGR'') > 0',
audit_column => 'SALARY',
statement_types => 'SELECT'
);
end;
/
Desde el usuario app_reader se ejecutan dos consultas. La primera no accede a la columna salary, por lo que no genera entrada en la traza FGA. La segunda sí la referencia y, si la condición se cumple, genera el registro.
conn app_reader/reader_pwd
-- No genera registro FGA
select employee_id, first_name, last_name, email
from rrhh.empleados
where employee_id = 100;
-- Genera registro FGA
select employee_id, first_name, last_name, salary
from rrhh.empleados
where employee_id = 100;
La consulta a dba_fga_audit_trail muestra únicamente la segunda operación:
conn / as sysdba
select to_char(timestamp, 'mm/dd/yy hh24:mi:ss') as event_time,
object_schema,
object_name,
policy_name,
statement_type
from dba_fga_audit_trail
where db_user = 'APP_READER';
- Vistas del diccionario más utilizadas
DBA_AUDIT_TRAIL: registros generales de auditoría.DBA_AUDIT_OBJECT: eventos sobre objetos específicos.DBA_STMT_AUDIT_OPTS: opciones de auditoría de sentencias activas.DBA_PRIV_AUDIT_OPTS: opciones de auditoría de privilegios activas.DBA_OBJ_AUDIT_OPTS: opciones de auditoría de objetos activas.DBA_FGA_AUDIT_TRAIL: registros de auditoría de grano fino.