20
Altran España www.altran.es - www.altran360.es Auditoría de datos en Oracle Josep LLuis Maicas (Altran España) Tutorial 23 de julio de 2014 Conócenos en: Web: www.altran.es Blog: www.altran360.es LinkedIn: https://www.linkedin.com/company/altran-espana Twitter: @altran_es Si quieres más información sobre nuestros productos y servicios, puedes contactar con [email protected]

Auditoria de datos en Oracle Database

Embed Size (px)

DESCRIPTION

Tutorial sobre cómo realizar una auditoría de datos en Oracle Database (por Josep Lluis Maicas - Altran España). Se evaluaran diferentes estrategias en base a los siguientes requerimientos: R1. No obligar a las tablas a auditar a que dispongan de los atributos propios de auditoría: quién, cuándo y cómo. R2. Poder granular la auditoria a los requerimientos que determine el negocio, pudiendo auditar sólo algunas columnas o filas. R3. Sólo auditar las operaciones que han finalizado con commit. R4. Pensado para poder mantener la información auditada durante años. R5. Rapidez en las consultas sobre la información auditada. R6. Sin necesidad de tener privilegios de DBA para su configuración, dado que hay entornos en el Cliente (Integración, PreProducción y Producción) que no permiten disponer de este privilegio a las empresas desarrolladoras de aplicaciones.

Citation preview

Page 1: Auditoria de datos en Oracle Database

Altran España

www.altran.es - www.altran360.es

Auditoría de datos en Oracle

Josep LLuis Maicas (Altran España)

Tutorial

23 de julio de 2014

Conócenos en:

Web: www.altran.es

Blog: www.altran360.es

LinkedIn: https://www.linkedin.com/company/altran-espana

Twitter: @altran_es

Si quieres más información sobre nuestros productos y servicios, puedes contactar con

[email protected]

Page 2: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

2/20

Índice

1 Introducción .............................................................................................................. 3

2 Estrategias de auditoría para el histórico de datos....................................................... 4

2.1 A nivel de aplicación ............................................................................................................................. 4

2.2 Mediante AUDIT y FGA .......................................................................................................................... 4

2.3 Mediante Flashback............................................................................................................................... 5

2.4 Mediante Oracle Total Recall ................................................................................................................. 5

2.5 Comparativa estrategias ........................................................................................................................ 6

3 Configuración de Auditoria a nivel de aplicación ......................................................... 8

3.1 Introducción ......................................................................................................................................... 8

3.2 Requerimientos ..................................................................................................................................... 8

3.3 Estrategia utilizada ............................................................................................................................... 8

3.4 Automatización del proceso de configuración........................................................................................ 9

3.4.1 Script de generación ...................................................................................................................... 9

3.4.2 Scripts generados .......................................................................................................................... 9

3.4.3 Ejecución de la configuración ...................................................................................................... 10

3.4.4 Ejecución del Undo (opcional) ...................................................................................................... 10

4 Anexos ................................................................................................................... 11

4.1 Script de generación: Gen_Scripts_Auditoria.sql ................................................................................... 11

4.2 Ejemplo de Scripts generados .............................................................................................................. 16

4.2.1 1_auditado.sql ............................................................................................................................ 16

4.2.2 2_auditor.sql ............................................................................................................................... 16

4.2.3 3_auditado.sql ............................................................................................................................ 16

4.2.4 undo_auditado.sql ....................................................................................................................... 17

4.2.5 undo_auditor.sql ......................................................................................................................... 18

4.3 Bibliografía consultada ........................................................................................................................ 18

Page 3: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

3/20

1 Introducción

El objetivo del artículo es dar a conocer varias estrategias para auditar los datos de las

tablas de BD a fin saber quién, cuándo y qué valores han cambiado.

Se evaluaran diferentes estrategias en base a los siguientes requerimientos:

R1. No obligar a las tablas a auditar a que dispongan de los atributos propios de

auditoría: quién, cuándo y cómo.

R2. Poder granular la auditoria a los requerimientos que determine el negocio,

pudiendo auditar sólo algunas columnas o filas.

R3. Sólo auditar las operaciones que han finalizado con commit.

R4. Pensado para poder mantener la información auditada durante años.

R5. Rapidez en las consultas sobre la información auditada.

R6. Sin necesidad de tener privilegios de DBA para su configuración, dado que hay

entornos en el Cliente (Integración, PreProducción y Producción) que no permiten

disponer de este privilegio a las empresas desarrolladoras de aplicaciones.

Para ello, se presentarán diversas estrategias que aporta Oracle y se seleccionará una de

ellas, la que se ha considerado que cumple mejor con los requerimientos mencionados.

Para ésta, se aportará una solución completa, ejemplificándolo en un caso de uso.

Quedan fuera del alcance del documento evaluar estrategias de auditoria que se salga del

objetivo de auditar los datos de las tablas.

Page 4: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

4/20

2 Estrategias de auditoría para el histórico de datos

2.1 A nivel de aplicación

Es el modo de auditoría que se realiza a nivel de aplicación. Este es personalizado

mediante programación, lo que hace que sea independiente a las versiones de Oracle y que

permite granular la auditoria a las necesidades del negocio.

Se genera mediante triggers que captan las operaciones DML sobre las tablas de interés y

vuelcan esa información, enriquecida con información de contexto, en las tablas destino de

la auditoria.

Se suele hacer una correspondencia de 1 a 1 entre tabla auditada y tabla de auditoria, de

manera que se si quieren auditar 10 tablas habrá 10 tablas de auditoria donde se

almacenará el histórico de cambios de los datos con la información añadida de contexto

que interese.

Las tablas de auditoria se suelen dejar en un esquema diferenciado del esquema propietario

de las tablas, a fin de que el esquema propietario no pueda alterar la información auditada.

2.2 Mediante AUDIT y FGA

Oracle proporciona desde sus primeras versiones la posibilidad de auditar las acciones DML

realizadas sobre tablas de la BD mediante AUDIT, y en posterioridad mediante Fine Grained

Auditing (FGA).

En ambos métodos se puede auditar las instrucciones lanzadas contra la BD y las bind

varibles empleadas en ello. El inconveniente es que no se saben los valores finales con los

que han quedado los registros afectados.

Por ejemplo, si se lanza:

update emp set hiredate = hiredate + sysdate;

Se inserta un único registro en la auditoria con dicha instrucción. El inconveniente es que

no queda constancia del valor que tenía antes ni después cada registro, de manera que

reconstruir los valores de dicho campo a una fecha en el pasado no es operativo.

A parte, estos métodos graban la auditoria con independencia de si ha hecho COMMIT o

ROLLBACK, cosa que sólo interesan los que han acabado en COMMIT.

A parte, en ambas estrategias todos los registros quedan almacenados en dos tablas del

esquema SYS, aud$ y fga_log$, haciendo que la consulta sobre los mismos pueda ser lenta

cuando la información almacenada sea de varios años para varias tablas. También se ha de

tener en cuenta de mover el tablespace donde se almacenan los datos de dichas tablas, ya

Page 5: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

5/20

que por defecto es SYSTEM y, en caso de llenarse el mismo, provocaría graves problemas en

la BD.

2.3 Mediante Flashback

Visto que auditar datos (no operaciones) mediante AUDIT y FGA no aporta una solución

convincente, Oracle aporta otra estrategia, llamada Flashback para poder consultar los

registros de una tabla a un momento anterior en el tiempo.

Está estrategia sí que da respuesta a poder consultar los cambios que ha sufrido un registro

a lo largo del tiempo, almacenando sólo los cambios finalizados en commit. No obstante,

presenta una serie de inconvenientes como:

- Las tablas a auditar requieren que ya estén almacenando la información de contexto

necesaria para la finalidad de auditoria.

En caso de añadir estas columnas en las tablas para almacenar la información de

contexto, optando por un trigger para informar sus valores, comentar que sólo es

posible en operaciones de Inserción y Modificación, ya que no es posible añadir

información extra en el registro cuando se efectúa un borrado del mismo.

- Se almacena en el tablespace de UNDO, el cual no está pensado para almacenar

grandes cantidades de información histórica de datos. Dicho tablespace está

pensado para la consistencia transaccional, no como un histórico de cambios de los

datos.

2.4 Mediante Oracle Total Recall

A partir de la versión 11g es posible almacenar los cambios que se producen en los

registros en tablas internas gestionadas por la propia BD, mediante Flashback Data Archive

(FBDA). Ahora se crean tablas internas para cada tabla a auditar en el propio esquema del

usuario auditado, con la ventaja que dichas tablas internas no son manipulables por ningún

tipo de usuario, ni tan solo por el administrador.

El inconveniente que presenta es que de por sí tampoco aporta la información de contexto

de auditoria que se requiere, a menos que la tabla de origen ya la incorporé.

Para solventar este problema, en la versión 12c se aporta nuevas prestaciones para poder

consultar información de contexto sobre quién y cuándo se realizaron los cambios en los

registros. Para ello, hay que indicarle que guarde información de contexto:

Page 6: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

6/20

Para luego poder correlacionar la información histórica con la de contexto. Para ello hay

que hacer una join entre una nueva tabla, llamada SYS.SYS_FBA_CONTEXT_AUD, y la tabla

interna de Oracle donde se guarda la auditoria de la tabla auditada.

2.5 Comparativa estrategias

Req. A nivel

Aplicación Audit FGA Flashback Oracle Total Recall

R1 Sí Sí Sí No Sí

R2 Sí No Sí No No

R3 Sí No No Sí Sí

R4 Sí No No No Sí

R5 Sí No No No Sí

R6 Sí No No No No

Page 7: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

7/20

Aunque la opción de Oracle Total Recall, utilizando FBDA, da cumplimiento a la mayoría de

los requerimientos mencionados en el inicio del artículo a partir de la versión de Oracle

12c, se aporta la solución mediante la primera estrategia al estar ésta disponible para todas

las versiones y permitir máxima flexibilidad en lo que se quiere auditar.

Page 8: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

8/20

3 Configuración de Auditoria a nivel de aplicación

3.1 Introducción

El objetivo es auditar los datos de las tablas que se deseen de un esquema, conocido como

esquema ‘auditado’, dejando el resultado de los datos auditados en otro esquema,

conocido como esquema ‘auditor’.

El auditor contendrá los datos de auditoría proporcionado desde varios esquemas

auditados. Tanto los esquemas auditados como el auditor podrán tener como nombre de

esquema el que se desee.

El auditor sólo tendrá capacidad para consultar los datos de todas las tablas auditadas,

mientras que los esquemas auditados solo tendrán capacidad para insertar los datos de

auditoria de sus tablas en el esquema del auditor.

3.2 Requerimientos

Debe de existir un esquema auditor y, como mínimo, un esquema auditado. Dichos

esquemas han de tener privilegios para hacer GRANT SELECT en el primer caso y GRANT

INSERT en el segundo.

3.3 Estrategia utilizada

Para cada tabla a auditar del esquema auditado se creará un trigger que registrará las

operaciones DML que se insertarán en una tabla del esquema auditor.

Nomenclaturas utilizadas:

Trigger en esquema auditado: AUD_<nombre_tabla_auditada>_TRG

Tabla de auditoria en esquema auditor: AUD_<nombre_tabla_auditada>

La tabla de auditoria contendrá las mismas columnas que la tabla de origen. A parte, se le

añadirán:

aud_usr VARCHAR2(50)

Almacenará el usuario de aplicación que se haya le pasado en el CONTEXT de Oracle

desde la aplicación.

aud_usr := LOWER(sys_context('USERENV', 'CLIENT_IDENTIFIER'));

En caso de que no se le haya pasado, tomará como usuario el usuario de la conexión

física de BD

aud_usr:= UPPER(sys_context('USERENV','SESSION_USER'));

aud_dml VARCHAR2(1)

Contendrá el tipo de operación DML realizada: I(nsert), U(pdate), D(elete)

Page 9: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

9/20

aud_fec DATE DEFAULT SYSDATE

Fecha con minutos y segundos del instante en que se ha generado la acción DML.

3.4 Automatización del proceso de configuración

Para configurar la auditoria en las tablas se proporciona un script sql que lo que hace a su

vez es generar otros scripts para configurar el esquema auditado y el esquema auditor.

Se proporciona también otros scripts para hacer el UNDO (retroceso) de toda la

configuración realizada.

3.4.1 Script de generación

El script de generación aportado es Gen_Scripts_Auditoria.sql.

Este se tiene que lanzar contra el esquema auditado. Para ello, se le deben facilitar dos

parámetros:

Nombre del esquema que actuará como auditor

Lista de las tablas a auditar (separadas por coma)

Ejemplo:

sqlplus scott/tiger@desorcl1 @Gen_Scripts_Auditoria.sql AUDITOR ‘EMP,DEPT’

Esquema auditado SCOTT

Parámetros:

o Nombre del esquema que actuará como auditor AUDITOR

o Lista de las tablas a auditar (separadas por coma) EMP,DEPT

3.4.2 Scripts generados

Como resultado del lanzamiento anterior se generarán los siguientes scripts SQL:

Para configurar la auditoria:

1_auditado.sql

2_auditor.sql

3_auditado.sql

En caso que se desee, también se aportan los scripts para deshacer los cambios efectuados

en la configuración de la auditoria:

undo_auditado.sql

undo_auditor.sql

Page 10: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

10/20

3.4.3 Ejecución de la configuración

Ejemplo de utilización para el esquema auditado ‘SCOTT’ y como esquema auditor

‘AUDITOR’

Para la configuración de la auditoría:

sqlplus scott/tiger@desorcl1 @1_auditado.sql

sqlplus auditor/auditor@desorcl1 @2_auditor.sql

sqlplus scott/tiger@desorcl1 @3_auditado.sql

3.4.4 Ejecución del Undo (opcional)

En caso de querer deshacer los cambios efectuados:

sqlplus scott/tiger@desorcl1 @undo_auditado.sql

sqlplus auditor/auditor@desorcl1 @undo_auditor.sql

Page 11: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

11/20

4 Anexos

4.1 Script de generación: Gen_Scripts_Auditoria.sql

SET SERVEROUTPUT ON FORMAT WRAPPED SET LONGC 300 SET LINESIZE 300 SET ECHO OFF SET TERM OFF SET VER OFF SET FEEDBACK OFF -- -------------------------------------------------------------------------------- -- Generación scripts para AUDITADO (1ª parte) -- -------------------------------------------------------------------------------- spool 1_auditado.sql DECLARE p_auditor VARCHAR2(50) := '&1'; p_tablas VARCHAR2(1000) := '&2'; auditor VARCHAR2(50); tablas VARCHAR2(2000); lv_tab_length BINARY_INTEGER; list_tablas DBMS_UTILITY.lname_array; CURSOR c1 (tabla VARCHAR2) IS SELECT LOWER(column_name) as column_name FROM user_tab_columns WHERE table_name = tabla ORDER BY column_id; BEGIN -- Quitar posibles espacios en blanco y poner en mayúsculas auditor := UPPER(REPLACE(p_auditor,' ')); tablas := UPPER(REPLACE(p_tablas,' ')); DBMS_UTILITY.COMMA_TO_TABLE (list => tablas, tablen => lv_tab_length, tab => list_tablas); FOR i IN 1 .. lv_tab_length LOOP DBMS_OUTPUT.put_line ('GRANT SELECT ON '||list_tablas (i)||' TO '||auditor||';'); END LOOP; DBMS_OUTPUT.put_line ('EXIT'); END; / spool off; -- -------------------------------------------------------------------------------- -- Generación scripts para AUDITOR -- -------------------------------------------------------------------------------- spool 2_auditor.sql DECLARE

Page 12: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

12/20

p_tablas VARCHAR2(1000) := '&2'; auditado VARCHAR2(50); tablas VARCHAR2(2000); str VARCHAR2 (20000); prefix VARCHAR2 (5) := 'AUD'; lv_tab_length BINARY_INTEGER; list_tablas DBMS_UTILITY.lname_array; CURSOR c1 (tabla VARCHAR2) IS SELECT LOWER(column_name) as column_name FROM user_tab_columns WHERE table_name = tabla ORDER BY column_id; BEGIN -- Obtener el nombre del usuario auditado SELECT user INTO auditado FROM DUAl; -- Quitar posibles espacios en blanco y poner en mayúsculas tablas := UPPER(REPLACE(p_tablas,' ')); DBMS_UTILITY.COMMA_TO_TABLE (list => tablas, tablen => lv_tab_length, tab => list_tablas); FOR i IN 1 .. lv_tab_length LOOP DBMS_OUTPUT.put_line ('PROMPT Tratando tabla '||prefix||'_'||list_tablas (i)); DBMS_OUTPUT.put_line ('CREATE TABLE '||prefix||'_'||list_tablas (i)||' AS (SELECT * FROM '||auditado||'.'||list_tablas (i)||' WHERE 1=0)'||';'); DBMS_OUTPUT.put_line ('ALTER TABLE '||prefix||'_'||list_tablas (i)||' ADD (aud_usr VARCHAR2(50),aud_dml VARCHAR2(1),aud_fec DATE DEFAULT SYSDATE);'); DBMS_OUTPUT.put_line ('GRANT INSERT ON '||prefix||'_'||list_tablas (i)||' TO '||auditado||';'); DBMS_OUTPUT.new_line; END LOOP; DBMS_OUTPUT.put_line ('EXIT'); END; / spool off; -- -------------------------------------------------------------------------------- -- Generación scripts para AUDITADO (2ª parte) -- -------------------------------------------------------------------------------- spool 3_auditado.sql DECLARE p_auditor VARCHAR2(50) := '&1'; p_tablas VARCHAR2(1000) := '&2'; auditor VARCHAR2(50); tablas VARCHAR2(2000); str VARCHAR2(20000); prefix VARCHAR2 (5) := 'AUD'; lv_tab_length BINARY_INTEGER; list_tablas DBMS_UTILITY.lname_array;

Page 13: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

13/20

CURSOR c1 (tabla VARCHAR2) IS SELECT LOWER(column_name) as column_name FROM user_tab_columns WHERE table_name = tabla ORDER BY column_id; BEGIN -- Quitar posibles espacios en blanco y poner en mayúsculas auditor := UPPER(REPLACE(p_auditor,' ')); tablas := UPPER(REPLACE(p_tablas,' ')); DBMS_UTILITY.COMMA_TO_TABLE (list => tablas, tablen => lv_tab_length, tab => list_tablas); FOR i IN 1 .. lv_tab_length LOOP DBMS_OUTPUT.put_line ('CREATE SYNONYM '||prefix||'_'||list_tablas (i)||' FOR '||auditor||'.'||prefix||'_'||list_tablas (i)||';'); END LOOP; DBMS_OUTPUT.new_line; FOR i IN 1 .. lv_tab_length LOOP DBMS_OUTPUT.put_line('CREATE OR REPLACE TRIGGER '||prefix||'_'||list_tablas (i)||'_TRG '); DBMS_OUTPUT.put_line(' AFTER INSERT OR UPDATE OR DELETE'); DBMS_OUTPUT.put_line(' ON '||list_tablas (i)); DBMS_OUTPUT.put_line(' REFERENCING NEW AS New OLD AS Old '); DBMS_OUTPUT.put_line(' FOR EACH ROW'); DBMS_OUTPUT.put_line('DECLARE'); DBMS_OUTPUT.put_line(' modo VARCHAR2(1);'); DBMS_OUTPUT.put_line(' usu VARCHAR2(50);'); DBMS_OUTPUT.put_line('BEGIN'); DBMS_OUTPUT.put_line(' IF INSERTING THEN'); DBMS_OUTPUT.put_line(' modo := ''I'';'); DBMS_OUTPUT.put_line(' ELSIF UPDATING THEN'); DBMS_OUTPUT.put_line(' modo := ''U'';'); DBMS_OUTPUT.put_line(' ELSE'); DBMS_OUTPUT.put_line(' modo := ''D'';'); DBMS_OUTPUT.put_line(' END IF;'); DBMS_OUTPUT.put_line(' usu := LOWER(sys_context(''USERENV'', ''CLIENT_IDENTIFIER''));'); DBMS_OUTPUT.put_line(' IF usu IS NULL THEN'); DBMS_OUTPUT.put_line(' usu := UPPER(sys_context(''USERENV'',''SESSION_USER''));'); DBMS_OUTPUT.put_line(' END IF;'); DBMS_OUTPUT.put_line(' IF DELETING THEN'); str := ' INSERT INTO '||prefix||'_'||list_tablas (i)||' ('; FOR c1rec IN c1 (list_tablas (i)) LOOP str := str||c1rec.column_name||','; END LOOP; str := str||'aud_usr,aud_dml)'; DBMS_OUTPUT.put_line(str); str := ' VALUES ('; FOR c1rec IN c1 (list_tablas (i)) LOOP

Page 14: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

14/20

str := str||':old.'||c1rec.column_name||','; END LOOP; str := str||'usu,modo);'; DBMS_OUTPUT.put_line(str); DBMS_OUTPUT.put_line(' ELSE '); str := ' INSERT INTO '||prefix||'_'||list_tablas (i)||' ('; FOR c1rec IN c1 (list_tablas (i)) LOOP str := str||c1rec.column_name||','; END LOOP; str := str||'aud_usr,aud_dml)'; DBMS_OUTPUT.put_line(str); str := ' VALUES ('; FOR c1rec IN c1 (list_tablas (i)) LOOP str := str||':new.'||c1rec.column_name||','; END LOOP; str := str||'usu,modo);'; DBMS_OUTPUT.put_line(str); DBMS_OUTPUT.put_line(' END IF;'); DBMS_OUTPUT.put_line('END;' ); DBMS_OUTPUT.put_line('/'); DBMS_OUTPUT.new_line; END LOOP; DBMS_OUTPUT.put_line ('EXIT'); END; / spool off; -- -------------------------------------------------------------------------------- -- Generación scripts para UNDO AUDITOR -- -------------------------------------------------------------------------------- spool undo_auditor.sql DECLARE p_auditor VARCHAR2(50) := '&1'; p_tablas VARCHAR2(1000) := '&2'; auditor VARCHAR2(50); auditado VARCHAR2(50); tablas VARCHAR2(2000); prefix VARCHAR2 (5) := 'AUD'; lv_tab_length BINARY_INTEGER; list_tablas DBMS_UTILITY.lname_array; CURSOR c1 (tabla VARCHAR2) IS SELECT LOWER(column_name) as column_name FROM user_tab_columns

Page 15: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

15/20

WHERE table_name = tabla ORDER BY column_id; BEGIN -- Obtener el nombre del usuario auditado SELECT user INTO auditado FROM DUAl; -- Quitar posibles espacios en blanco y poner en mayúsculas auditor := UPPER(REPLACE(p_auditor,' ')); tablas := UPPER(REPLACE(p_tablas,' ')); DBMS_UTILITY.COMMA_TO_TABLE (list => tablas, tablen => lv_tab_length, tab => list_tablas); FOR i IN 1 .. lv_tab_length LOOP DBMS_OUTPUT.put_line ('PROMPT Deshaciendo cambios para tabla '||prefix||'_'||list_tablas (i)); DBMS_OUTPUT.put_line ('DROP TABLE '||prefix||'_'||list_tablas (i)||';'); DBMS_OUTPUT.new_line; END LOOP; DBMS_OUTPUT.put_line ('EXIT'); END; / spool off; -- -------------------------------------------------------------------------------- -- Generación scripts para UNDO AUDITADO -- -------------------------------------------------------------------------------- spool undo_auditado.sql DECLARE p_auditor VARCHAR2(50) := '&1'; p_tablas VARCHAR2(1000) := '&2'; auditor VARCHAR2(50); tablas VARCHAR2(2000); prefix VARCHAR2 (5) := 'AUD'; lv_tab_length BINARY_INTEGER; list_tablas DBMS_UTILITY.lname_array; CURSOR c1 (tabla VARCHAR2) IS SELECT LOWER(column_name) as column_name FROM user_tab_columns WHERE table_name = tabla ORDER BY column_id; BEGIN -- Quitar posibles espacios en blanco y poner en mayúsculas auditor := UPPER(REPLACE(p_auditor,' ')); tablas := UPPER(REPLACE(p_tablas,' ')); DBMS_UTILITY.COMMA_TO_TABLE (list => tablas, tablen => lv_tab_length, tab => list_tablas); FOR i IN 1 .. lv_tab_length LOOP DBMS_OUTPUT.put_line ('PROMPT Deshaciendo cambios para tabla '||prefix||'_'||list_tablas (i)); DBMS_OUTPUT.put_line ('REVOKE SELECT ON '||list_tablas (i)||' FROM '||auditor||';'); DBMS_OUTPUT.put_line ('DROP SYNONYM '||prefix||'_'||list_tablas (i)||';');

Page 16: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

16/20

DBMS_OUTPUT.put_line ('DROP TRIGGER '||prefix||'_'||list_tablas (i)||'_TRG '); DBMS_OUTPUT.new_line; END LOOP; DBMS_OUTPUT.put_line ('EXIT'); END; / spool off; EXIT

4.2 Ejemplo de Scripts generados

4.2.1 1_auditado.sql

GRANT SELECT ON EMP TO AUDITOR; GRANT SELECT ON DEPT TO AUDITOR; EXIT

4.2.2 2_auditor.sql

PROMPT Tratando tabla AUD_EMP CREATE TABLE AUD_EMP AS (SELECT * FROM SCOTT.EMP WHERE 1=0); ALTER TABLE AUD_EMP ADD (aud_usr VARCHAR2(50),aud_dml VARCHAR2(1),aud_fec DATE DEFAULT SYSDATE); GRANT INSERT ON AUD_EMP TO SCOTT; PROMPT Tratando tabla AUD_DEPT CREATE TABLE AUD_DEPT AS (SELECT * FROM SCOTT.DEPT WHERE 1=0); ALTER TABLE AUD_DEPT ADD (aud_usr VARCHAR2(50),aud_dml VARCHAR2(1),aud_fec DATE DEFAULT SYSDATE); GRANT INSERT ON AUD_DEPT TO SCOTT; EXIT

4.2.3 3_auditado.sql

CREATE SYNONYM AUD_EMP FOR AUDITOR.AUD_EMP; CREATE SYNONYM AUD_DEPT FOR AUDITOR.AUD_DEPT; CREATE OR REPLACE TRIGGER AUD_EMP_TRG AFTER INSERT OR UPDATE OR DELETE ON EMP REFERENCING NEW AS New OLD AS Old FOR EACH ROW DECLARE modo VARCHAR2(1); usu VARCHAR2(50); BEGIN IF INSERTING THEN modo := 'I'; ELSIF UPDATING THEN modo := 'U'; ELSE modo := 'D'; END IF; usu := LOWER(sys_context('USERENV', 'CLIENT_IDENTIFIER'));

Page 17: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

17/20

IF usu IS NULL THEN usu := UPPER(sys_context('USERENV','SESSION_USER')); END IF; IF DELETING THEN INSERT INTO AUD_EMP (empno,ename,job,mgr,hiredate,sal,comm,deptno,aud_usr,aud_dml) VALUES (:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno,usu,modo); ELSE INSERT INTO AUD_EMP (empno,ename,job,mgr,hiredate,sal,comm,deptno,aud_usr,aud_dml) VALUES (:new.empno,:new.ename,:new.job,:new.mgr,:new.hiredate,:new.sal,:new.comm,:new.deptno,usu,modo); END IF; END; / CREATE OR REPLACE TRIGGER AUD_DEPT_TRG AFTER INSERT OR UPDATE OR DELETE ON DEPT REFERENCING NEW AS New OLD AS Old FOR EACH ROW DECLARE modo VARCHAR2(1); usu VARCHAR2(50); BEGIN IF INSERTING THEN modo := 'I'; ELSIF UPDATING THEN modo := 'U'; ELSE modo := 'D'; END IF; usu := LOWER(sys_context('USERENV', 'CLIENT_IDENTIFIER')); IF usu IS NULL THEN usu := UPPER(sys_context('USERENV','SESSION_USER')); END IF; IF DELETING THEN INSERT INTO AUD_DEPT (deptno,dname,loc,aud_usr,aud_dml) VALUES (:old.deptno,:old.dname,:old.loc,usu,modo); ELSE INSERT INTO AUD_DEPT (deptno,dname,loc,aud_usr,aud_dml) VALUES (:new.deptno,:new.dname,:new.loc,usu,modo); END IF; END; / EXIT

4.2.4 undo_auditado.sql

PROMPT Deshaciendo cambios para tabla AUD_EMP REVOKE SELECT ON EMP FROM AUDITOR; DROP SYNONYM AUD_EMP; DROP TRIGGER AUD_EMP_TRG PROMPT Deshaciendo cambios para tabla AUD_DEPT REVOKE SELECT ON DEPT FROM AUDITOR;

Page 18: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

18/20

DROP SYNONYM AUD_DEPT; DROP TRIGGER AUD_DEPT_TRG EXIT

4.2.5 undo_auditor.sql

PROMPT Deshaciendo cambios para tabla AUD_EMP DROP TABLE AUD_EMP; PROMPT Deshaciendo cambios para tabla AUD_DEPT DROP TABLE AUD_DEPT; EXIT

4.3 Bibliografía consultada

http://www.oracle-base.com/articles/10g/auditing-10gr2.php

http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=415

http://www.toadworld.com/platforms/oracle/w/wiki/5954.fine-grained-auditing-

vs-regular-auditing.aspx

http://www.morganslibrary.org/reference/flash_archive.html

http://www.dbi-services.com/index.php/blog/entry/oracle-database-12c-

flashback-data-archive-fda-new-features

https://community.oracle.com/thread/688251?start=0&tstart=0

http://www.oracle.com/technetwork/issue-archive/2010/10-nov/o60security-

176069.html

http://docs.oracle.com/cd/B19306_01/backup.102/b14192/flashptr003.htm

http://www.google.com/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=1&cad

=rja&uact=8&ved=0CB4QFjAA&url=http%3A%2F%2Fwww.ioug.org%2Fd%2Fdo%2F357

7&ei=8kGXU_7YFcz20gWxkYHACg&usg=AFQjCNHPAwrDrVQRPkeIyf48nm-

LS8eXJg&bvm=bv.68693194,d.d2k

http://www.stanford.edu/dept/itss/docs/oracle/10g/appdev.101/b10795/adfns_fl.

htm

http://download.oracle.com/docs/cd/E14072_01/appdev.112/e10577/d_audit_mg

mt.htm

http://www.stanford.edu/dept/itss/docs/oracle/10g/appdev.101/b10795/adfns_fl.

htm

http://www.filibeto.org/sun/lib/nonsun/oracle/11.2.0.1.0/E11882_01/appdev.112/

e10471/adfns_flashback.htm

http://www.oracle.com/database/total-recall.html

Page 19: Auditoria de datos en Oracle Database

Conócenos en:

Web: www.altran.es

Blog: www.altran360.es

LinkedIn: https://www.linkedin.com/company/altran-espana

Twitter: @altran_es

Si quieres más información sobre nuestros productos y servicios, puedes contactar

con [email protected]

Page 20: Auditoria de datos en Oracle Database

©altran | Auditoría de datos en Oracle |

20/20