Warning: This information may be outdated. Please note the date of the post.

En esta entrada vamos a hablar sobre la importancia que tiene proteger la información, en este caso la que guarda una base de datos y cómo controlar dicha información mediante auditorías. Este es un papel muy importante para un administrador de base de datos.

Concepto: Auditoría.

Se trata de un estudio que analiza los distintos procesos de gestión, los evalúa un auditor bajo una serie de criterios establecidos. El auditor es el que se encarga propiamente de observar la situación y la considera adecuada o no según los resultados.

Auditoría de base de datos: Oracle

En Oracle la auditoría la componen ciertas características que ofrece el gestor que permiten al administrador y a los usuarios a hacer un seguimiento del uso de la base de datos. Estos datos se almacenan en el diccionario de datos concretamente en la tabla SYS.AUD$, además hay una serie de vistas que muestran estos datos según lo que queramos obtener.

El principal objetivo es proteger los datos mediante un seguimiento. Este seguimiento se aplica de forma en que se controla:

  • Los intentos de inicio de sesión (éxitos o fallidos)
  • El acceso a los objetos
  • Todas y cada una de las acciones que tomen en la BD.

Tarea teorica/práctica

Ahora vamos a ir explicando de forma teorico/práctica las configuración, características y funcionalidades de las auditorías.

1. Activación de auditoría de la base de datos

El ejercicio práctico planteado es:

1. Activa desde SQL*Plus la auditoría de los intentos de acceso fallidos al sistema. Comprueba su funcionamiento.

Para empezar debemos de saber que la activación de la auditoría depende del parámetro AUDIT_TRAIL. Es el que habilita o deshabilita la auditoría de la base de datos.

Este parámetro alojado en el diccionario de datos podemos verlo de la siguiente forma:

SHOW PARAMETER AUDIT

Salida:

SQL> SHOW PARAMETER AUDIT

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest 		     string	 /u01/app/oracle/admin/XE/adump
audit_syslog_level		     string
audit_sys_operations		     boolean	 FALSE
audit_trail			     string	 NONE

Para activarlo podemos modificar el fichero init.ora pero en mi caso vamos a ejecutar el siguiente comando:

ALTER SYSTEM SET audit_trail = "DB" SCOPE=SPFILE;

Salida:

SQL> ALTER SYSTEM SET audit_trail = "DB" SCOPE=SPFILE;

System altered.

Si lo quisieramos desactivar, en vez de “DB”, podemos especificar “NONE”.

Debemos de tener en cuenta la versión de oracle ya que en algunas versiones viene activada por defecto. En cualquier caso si la hemos activado siempre tenemos que reiniciar Oracle.

SHUTDOWN
STARTUP

Ahora comprobamos que la auditoría está activada haciendo la siguiente consulta, de forma que según el valor especificado vemos si está activa o no.

SELECT name, value as Valor from v$parameter where name like 'audit_trail';
SQL> SELECT name, value as Valor from v$parameter where name like 'audit_trail';

NAME
--------------------------------------------------------------------------------
VALOR
--------------------------------------------------------------------------------
audit_trail
DB

Una vez activada tenemos que activar la auditoría de intentos fallidos al sistema.

Esto podemos hacerlo de forma general para todos los usuarios o para algún caso en concreto (un usuario o una sesión).

En este caso como no queremos que se aplique para todos los usuarios utilizaremos una auditoría de sesión para un usuario en concreto. El usuario se llamará becario y habilitaremos la auditoría de inicio de sesión para intentos fallidos.

El comando a ejecutar sería el siguiente, desde el adminsitrador sys:

audit session whenever not successful;
audit session by becario;
SQL> audit session whenever not successful;

Audit succeeded.

SQL> audit session by becario;

Audit succeeded.

Supongamos que intentamos entrar a la base de datos con el usuario BECARIO y fallamos dos intentos, y al tercero entramos.

Con el usuario sys hacemos la siguiente consulta para comprobar el resultado:

SELECT USERNAME, OS_USERNAME, TIMESTAMP, ACTION_NAME FROM DBA_AUDIT_SESSION WHERE USERNAME='BECARIO';

Salida:

SQL> SELECT USERNAME, OS_USERNAME, TIMESTAMP, ACTION_NAME, RETURNCODE FROM DBA_AUDIT_SESSION WHERE USERNAME='BECARIO';

USERNAME
------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAMP	    ACTION_NAME 		 RETURNCODE
------------------- ---------------------------- ----------
BECARIO
oracle
2021/05/22 13:28:11 LOGON				  0

BECARIO
oracle
2021/05/22 13:29:57 LOGOFF				  0

USERNAME
------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAMP	    ACTION_NAME 		 RETURNCODE
------------------- ---------------------------- ----------

BECARIO
oracle
2021/05/22 13:31:14 LOGON			       1017

BECARIO
oracle

USERNAME
------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAMP	    ACTION_NAME 		 RETURNCODE
------------------- ---------------------------- ----------
2021/05/22 13:31:21 LOGON			       1017

BECARIO
oracle
2021/05/22 13:32:39 LOGON				  0

BECARIO

USERNAME
------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAMP	    ACTION_NAME 		 RETURNCODE
------------------- ---------------------------- ----------
oracle
2021/05/22 13:33:48 LOGOFF				  0

Como hemos podido comprobar podemos visualizar la fecha y la hora en la que se ha intentado entrar en el sistema de forma fallida, Además del codigo que devuelve que en este caso es el 1017 (usuario o contraseña incorrecta (credenciales incorrectas)).

2. Procedimiento PLSQL

2. Realiza un procedimiento en PL/SQL que te muestre los accesos fallidos junto con el motivo de los mismos, transformando el código de error almacenado en un mensaje de texto comprensible.

-- Funcion: Devolver un mensaje según el codigo de error 
CREATE OR REPLACE FUNCTION ImprimirMensaje (p_codigo VARCHAR2)
RETURN VARCHAR2
IS 
        mensaje VARCHAR2(100);
        BEGIN 
            IF p_codigo = '1017' THEN 
                mensaje:='Credenciales incorrectas';
            ELSIF p_codigo = '1045' THEN
                mensaje:='Carece de privilegio para Crear Sesión';
            ELSIF p_codigo = '0' THEN
                mensaje:='Login correcto';
            ELSE 
                mensaje:='Consulta el error en la documentacion oficial de oracle';
            END IF;
        RETURN mensaje;
END ImprimirMensaje;
/

-- Procedimiento MostrarMensaje

CREATE OR REPLACE PROCEDURE MostrarMensaje
IS 
    v_mensaje VARCHAR2(100);
    CURSOR c_fallidos
    IS 
    SELECT RETURNCODE, USERNAME, TIMESTAMP
    FROM DBA_AUDIT_SESSION
    WHERE ACTION_NAME='LOGON';
BEGIN 
    DBMS_OUTPUT.PUT_LINE('ACCESOS FALLIDOS');
    DBMS_OUTPUT.PUT_LINE('________________');
    FOR linea IN c_fallidos LOOP 
        v_mensaje:=ImprimirMensaje(linea.RETURNCODE);
        DBMS_OUTPUT.PUT_LINE('-Usuario: '||linea.USERNAME||' -Fecha: '||linea.TIMESTAMP||' - '||linea.RETURNCODE||': '||v_mensaje);
        DBMS_OUTPUT.PUT_LINE('');
    END LOOP;
END MostrarMensaje;
/
  • Ejecutamos el procedimiento y comprobamos la salida:
exec MostrarMensaje

Comprobación procedimiento

Version XE

SQL> exec MostrarMensaje
ACCESOS FALLIDOS
________________
-Usuario: CELIA -Fecha: 2021/05/22 13:27:50 - 1045: Carece de privilegio para
Crear Sesión
-Usuario: BECARIO -Fecha: 2021/05/22 13:28:11 - 0: Login correcto
-Usuario: BECARIO -Fecha: 2021/05/22 13:31:14 - 1017: Credenciales incorrectas
-Usuario: BECARIO -Fecha: 2021/05/22 13:31:21 - 1017: Credenciales incorrectas
-Usuario: BECARIO -Fecha: 2021/05/22 13:32:39 - 0: Login correcto
-Usuario: BECARIO -Fecha: 2021/05/23 07:53:12 - 0: Login correcto

PL/SQL procedure successfully completed.

3. Auditoría de operaciones DML

Las operaciones DML son:

  • Insert: Para añadir registros
  • Update: Modificar o actualizar registros
  • Delete: Eliminar registros

3.Activa la auditoría de las operaciones DML realizadas por SCOTT. Comprueba su funcionamiento.

Activamos la auditoria de las acciones mencionadas anteriormente al usuario SCOTT. Especificamos by access que mostrará un registro por cada acción realizada.

SQL> AUDIT INSERT TABLE, UPDATE TABLE, DELETE TABLE BY SCOTT BY ACCESS;

Audit succeeded.

Comprobación

Acciones del usuario SCOTT:

INSERT INTO DEPT VALUES (28, 'recursos', 'MADRID');
UPDATE EMP SET ENAME = 'BENITO' WHERE EMPNO = '7499';
DELETE FROM DEPT WHERE DNAME = 'RESOURCES';

Hacemos la siguiente consulta con el usuario SYS para ver que efectivamente registra todas las operaciones DML.

SQL> SELECT OBJ_NAME, ACTION_NAME, TIMESTAMP FROM DBA_AUDIT_OBJECT WHERE USERNAME='SCOTT';

OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAMP
---------------------------- -------------------
DEPT
INSERT			     2021/05/23 08:14:34

DEPT
INSERT			     2021/05/23 08:14:50

EMP
UPDATE			     2021/05/23 08:18:16


OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAMP
---------------------------- -------------------
DEPT
DELETE			     2021/05/23 08:22:55

4. Auditoría de grano fino

Un poco de teoría…

La auditoría de grano fino (FGA) es como una versión extendida de la auditoría estándar. Registra los cambios en datos muy concretos a nivel de columna.

Este tipo de auditoría permite crear registros de auditorías basados en una consulta exacta. Además permite establecer condiciones de auditoría y especificar la columna a auditar.

La diferencia que tiene con respecto a la auditoría estándar es que da la información sobre el cambio que ha sucedido en el registro o dato, mientras que la estándar se graban los detalles mas simples.

Este tipo de auditoría es muy útil si se desea saber que ha pasado de forma específica en una tabla o esquema, aunque tenerla activada conlleva una carga mayor y con ella disminución del rendimiento de la base de datos, por lo que se debe utilizar para cosas puntuales.

Tarea planteada:

4.Realiza una auditoría de grano fino para almacenar información sobre la inserción de empleados del departamento 10 en la tabla emp de scott.

Esto no es compatible con la versión Oracle Database 11g Express Edition Release 11.2.0.2.0 , así que lo haremos en Oracle Database 19c Enterprise Edition.

Creamos un procedimiento para auditar de forma específica un objeto de una tabla.

BEGIN
DBMS_FGA.ADD_POLICY (
object_schema => 'c##SCOTT',
object_name => 'EMP',
policy_name => 'politica1',
audit_condition => 'DEPTNO = 10',
statement_types => 'INSERT');
END;
/

Salida (version 19c)

SQL> BEGIN
DBMS_FGA.ADD_POLICY (
object_schema => 'c##SCOTT',
object_name => 'EMP',
policy_name => 'politica1',
audit_condition => 'DEPTNO = 10',
statement_types => 'INSERT');
END;
/  2    3    4    5    6    7    8    9  

Procedimiento PL/SQL terminado correctamente.

Insertamos los empleados nuevos con el usuario SCOTT:

SQL> INSERT INTO EMP VALUES
(7888, 'ANA', 'CLERK', 7902,
TO_DATE('04-OCT-1995', 'DD-MON-YYYY'), 800, NULL, 10);  2    3  

1 fila creada.

SQL> INSERT INTO EMP VALUES
(8777, 'CLARA', 'SALESMAN', 7839,
TO_DATE('04-DIC-1993', 'DD-MON-YYYY'), 800, NULL, 10);  2    3  

1 fila creada.

SQL> INSERT INTO EMP VALUES
(6663, 'RAFA', 'MANAGER', 7835,
TO_DATE('04-FEB-1980', 'DD-MON-YYYY'), 800, NULL, 10);  2    3  

1 fila creada.

Nos salimos del usuario Scott y volvemos al usuario SYS

SELECT sql_text, CURRENT_USER,TIMESTAMP FROM dba_fga_audit_trail WHERE POLICY_NAME='POLITICA1';

Comprobamos que aparece reflejados los INSERT:

SQL> SELECT sql_text, CURRENT_USER,TIMESTAMP FROM dba_fga_audit_trail WHERE POLICY_NAME='POLITICA1';

SQL_TEXT
--------------------------------------------------------------------------------
CURRENT_USER
--------------------------------------------------------------------------------
TIMESTAM
--------
INSERT INTO EMP VALUES
(7888, 'ANA', 'CLERK', 7902,
TO_DATE('04-OCT-1995', 'DD-MON-YYYY'), 800, NULL, 10)
C##SCOTT
23/05/21

INSERT INTO EMP VALUES

SQL_TEXT
--------------------------------------------------------------------------------
CURRENT_USER
--------------------------------------------------------------------------------
TIMESTAM
--------
(8777, 'CLARA', 'SALESMAN', 7839,
TO_DATE('04-DIC-1993', 'DD-MON-YYYY'), 800, NULL, 10)
C##SCOTT
23/05/21

INSERT INTO EMP VALUES
(6663, 'RAFA', 'MANAGER', 7835,

SQL_TEXT
--------------------------------------------------------------------------------
CURRENT_USER
--------------------------------------------------------------------------------
TIMESTAM
--------
TO_DATE('04-FEB-1980', 'DD-MON-YYYY'), 800, NULL, 10)
C##SCOTT
23/05/21

5. Diferencia entre auditar (by access / by session)

5.Explica la diferencia entre auditar una operación by access o by session.

Es posible auditar operaciones (select,insert,update,delete) sobre las tablas. Se puede hacer por medio del comando AUDIT, indicando la operación, la tabla y el tipo de seguimiento (by access o by session).

La diferencia principal es que by access registra una entrada de auditoría por cada operación realizada y by session solo registra una entrada de auditoría por sesión iniciada, por lo que by access crea un registro más al detalle pero tambíen baja el rendimiento de la base de datos, mientras que by session crea un registro más simple y es mucho más ligero y rápido.

Por ejemplo podemos activar la auditoría para las insercciones en la tabla DEPT por sesión.

SQL> AUDIT INSERT ON DEPT BY SESSION;         

Auditoria terminada correctamente.

Insertamos dos nuevos departamentos

INSERT INTO DEPT VALUES (50, 'VENTAS1', 'BARCELONA');
INSERT INTO DEPT VALUES (60, 'VENTAS2', 'SEVILLA');

Desde el usuario sys hacemos la siguiente consulta de la tabla DBA_AUDIT_OBJECT

SELECT USERNAME,ACTION_NAME,TIMESTAMP, obj_name from DBA_AUDIT_OBJECT where USERNAME='C##SCOTT';

La salida es algo extensa así que no la voy a mostrar entera porque muestra todos los cambios de las operaciones realizadas en la sesión.


...
USERNAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
OBJ_NAME
--------------------------------------------------------------------------------
INSERT			     23/05/21
DEPT

C##SCOTT
INSERT			     23/05/21
DEPT
...

Si quisieramos hacerla by access sería de la siguiente forma y crearía una entrada por cada operación realizada como hicimos al principio.

AUDIT INSERT ON EMP BY ACCESS;   

Nos mostraría lo siguiente:

SQL> SELECT USERNAME,ACTION_NAME,TIMESTAMP, obj_name from DBA_AUDIT_OBJECT where USERNAME='C##SCOTT';

. . .

USERNAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
OBJ_NAME
--------------------------------------------------------------------------------
EMP

C##SCOTT
INSERT			     23/05/21
EMP

C##SCOTT


USERNAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
OBJ_NAME
--------------------------------------------------------------------------------
EMP

C##SCOTT
INSERT			     23/05/21
EMP

C##SCOTT
. . .

6. Valores del parámetro AUDIT_TRAIL

6. Documenta las diferencias entre los valores db y db_extended del parámetro audit_trail de ORACLE. Demuéstralas poniendo un ejemplo de la información sobre una operación concreta recopilada con cada uno de ellos.

El parámetro AUDIT_TRAIL consta de una serie de valores. Entre ellos tenemos estos dos:

  • VALOR DB: Este valor activa la auditoría almacenando los datos en la tabla SYS.AUD$ de Oracle. Lo que equivale a 1, o TRUE.

  • VALOR DB_EXTENDED: Este valor activa también la auditoría y los datos se almacenan en la misma tabla (SYS.AUD$). Pero tambien se escriben los datos en las columnas SQLBIND y SQLTEXT de la misma tabla.

Vamos a ver un ejemplo:

Activamos la auditoría con el valor db, extended.

SQL> ALTER SYSTEM SET audit_trail = DB, EXTENDED SCOPE=SPFILE;

System altered.

Recordad que tenemos que apagar y encender la base de datos.

SQL> SHOW PARAMETER AUDIT;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest 		     string	 /u01/app/oracle/admin/XE/adump
audit_syslog_level		     string
audit_sys_operations		     boolean	 FALSE
audit_trail			     string	 DB, EXTENDED
SQL> 

dbext.png

7. Version Enterprise Manager

Localiza en Enterprise Manager las posibilidades para realizar una auditoría e intenta repetir con dicha herramienta los apartados 1, 3 y 4.

La versión de oracle a utilizar es Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0


--- Nos conectamos como usuario SYS 

[oracle@bd ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sun May 23 14:00:43 2021
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.


Conectado a:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

--- Activa desde SQL*Plus la auditoría de los intentos de acceso fallidos al sistema. Comprueba su funcionamiento. 

SQL> ALTER SYSTEM SET audit_trail = "DB" SCOPE=SPFILE;

Sistema modificado.

--- Apagamos y encendemos la base de datos (SHUTDOWN, STARTUP)

SQL> SHOW PARAMETER AUDIT

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest 		     string	 /opt/oracle/admin/ORCLCDB/adum
						 p
audit_syslog_level		     string
audit_sys_operations		     boolean	 TRUE
audit_trail			     string	 DB
unified_audit_common_systemlog	     string
unified_audit_sga_queue_size	     integer	 1048576
unified_audit_systemlog 	     string


-- Activamos la auditoria 

SQL> ALTER SYSTEM SET audit_trail = "DB" SCOPE=SPFILE;

Sistema modificado.

SQL> audit session whenever not successful;

Auditoria terminada correctamente.

SQL> audit session by C##SCOTT;

Auditoria terminada correctamente.

-- Hacemos la consulta 

SQL> SELECT USERNAME, OS_USERNAME, TIMESTAMP, ACTION_NAME FROM DBA_AUDIT_SESSION WHERE USERNAME='C##SCOTT';

USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------
C##SCOTT
oracle
23/05/21 LOGON

C##SCOTT
oracle
23/05/21 LOGON

USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------

C##SCOTT
oracle
23/05/21 LOGON

C##SCOTT
oracle

USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------
23/05/21 LOGON

C##SCOTT
oracle
23/05/21 LOGON

C##SCOTT

USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------
oracle
23/05/21 LOGON

C##SCOTT
oracle
23/05/21 LOGON


USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------
C##SCOTT
oracle
23/05/21 LOGON

C##SCOTT
oracle
23/05/21 LOGON

USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------

C##SCOTT
oracle
23/05/21 LOGON

C##SCOTT
oracle

USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------
23/05/21 LOGOFF

C##SCOTT
oracle
23/05/21 LOGOFF

C##SCOTT

USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------
oracle
23/05/21 LOGOFF

C##SCOTT
oracle
23/05/21 LOGOFF


USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------
C##SCOTT
oracle
23/05/21 LOGOFF

C##SCOTT
oracle
23/05/21 LOGOFF

USERNAME
--------------------------------------------------------------------------------
OS_USERNAME
--------------------------------------------------------------------------------
TIMESTAM ACTION_NAME
-------- ----------------------------


16 filas seleccionadas.

--- Podemos incluso crear el procedimiento y ver los intentos fallidos 

Procedimiento creado.

SQL> exec MostrarMensaje
ACCESOS FALLIDOS
________________
-Usuario: C##SCOTT -Fecha: 23/05/21 - 1017: Credenciales incorrectas
-Usuario: C##SCOTT -Fecha: 23/05/21 - 1017: Credenciales incorrectas
-Usuario: SCOTT -Fecha: 23/05/21 - 1017: Credenciales incorrectas
-Usuario: C##SCOTT -Fecha: 23/05/21 - 0: Login correcto
-Usuario: C##SCOTT -Fecha: 23/05/21 - 0: Login correcto
-Usuario: C##SCOTT -Fecha: 23/05/21 - 1017: Credenciales incorrectas
-Usuario: C##SCOTT -Fecha: 23/05/21 - 1017: Credenciales incorrectas
-Usuario: C##SCOTT -Fecha: 23/05/21 - 0: Login correcto
-Usuario: C##SCOTT -Fecha: 23/05/21 - 0: Login correcto
-Usuario: C##SCOTT -Fecha: 23/05/21 - 0: Login correcto
-Usuario: C##SCOTT -Fecha: 23/05/21 - 0: Login correcto
-Usuario: C##SCOTT -Fecha: 23/05/21 - 1017: Credenciales incorrectas
-Usuario: C##SCOTT -Fecha: 23/05/21 - 1017: Credenciales incorrectas
-Usuario: C##SCOTT -Fecha: 23/05/21 - 1017: Credenciales incorrectas

Procedimiento PL/SQL terminado correctamente.


--- Activa la auditoría de las operaciones DML realizadas por SCOTT. Comprueba su funcionamiento.

SQL> AUDIT INSERT TABLE, UPDATE TABLE, DELETE TABLE BY C##SCOTT BY ACCESS;

Auditoria terminada correctamente.

-- INSERTAMOS LOS DATOS CON EL USUARIO SCOTT

-- HACEMOS LA CONSULTA PARA VER EL FUNCIONAMIENTO

SQL> SELECT OBJ_NAME, ACTION_NAME, TIMESTAMP FROM DBA_AUDIT_OBJECT WHERE USERNAME='C##SCOTT';

OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
DEPT
INSERT			     23/05/21

EMP
INSERT			     23/05/21

EMP
INSERT			     23/05/21


OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
EMP
INSERT			     23/05/21

EMP
INSERT			     23/05/21

EMP
INSERT			     23/05/21


OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
EMP
INSERT			     23/05/21

EMP
INSERT			     23/05/21

EMP
INSERT			     23/05/21


OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
EMP
INSERT			     23/05/21

EMP
INSERT			     23/05/21

EMP
INSERT			     23/05/21


OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
DEPT
INSERT			     23/05/21

DEPT
INSERT			     23/05/21

EMP
UPDATE			     23/05/21


OBJ_NAME
--------------------------------------------------------------------------------
ACTION_NAME		     TIMESTAM
---------------------------- --------
DEPT
DELETE			     23/05/21


16 filas seleccionadas.


--- Realiza una auditoría de grano fino para almacenar información sobre la inserción de empleados del departamento 10 en la tabla emp de scott.
*!!!!

*!!!! Esta parte no se puede hacer en la version Oracle Database 11g Express Edition Release 11.2.0.2.0 pero si en Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 como hemos visto anteriormente, por lo que no voy a repetir los mismos pasos.

8. Postgresql (1,3,4)

  1. Averigua si en Postgres se pueden realizar los apartados 1, 3 y 4. Si es así, documenta el proceso adecuadamente.

En PostgreSQL no existen medios para hacer auditorías de forma similar a Oracle.

Hay diversas herramientas que se han desarrollado para solventar este problema y es que es habitual que salgan ya que es muy importante tener un control sobre la base de datos.

En el mismo manual de PostgreSQL nos muestra un procedimiento de activacion PL /pgSQL para auditorías.

Este ejemplo registra la hora y el nombre del usuario que hace INSERT, UPDATE Y DELETE.

CREATE TABLE emp (
    empname           text NOT NULL,
    salary            integer
);

CREATE TABLE emp_audit( 
    operation         char(1)   NOT NULL,
    stamp             timestamp NOT NULL,
    userid            text      NOT NULL,
    empname           text      NOT NULL,
    salary integer
);

CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
    BEGIN
        --
        -- Create a row in emp_audit to reflect the operation performed on emp,
        -- make use of the special variable TG_OP to work out the operation.
        --
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
            RETURN NEW;
        END IF;
        RETURN NULL; -- result is ignored since this is an AFTER trigger
    END;
$emp_audit$ LANGUAGE plpgsql;

CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
    FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();

La idea es almacenar los cambios en un único registro como si se tratara del by session de Oracle.

La estructura de la tabla para auditorías sería así:

CREATE TABLE audit_table (
  ts TIMESTAMP WITH TIME ZONE,
  usr VARCHAR(30),
  tbl VARCHAR(30),
  fld VARCHAR(30),
  pk_name VARCHAR(30),
  pk_value VARCHAR(40),
  mod_type CHAR(6),
  old_val TEXT,
  new_val TEXT,
);

Para comprobar su funcionamiento lo que haremos es crear dos tablas que van a ser de ayuda para monitorear:

CREATE TABLE prueba1 (
  id INTEGER NOT NULL PRIMARY KEY,
  somename VARCHAR(50),
  somevalue INTEGER,
  somets TIMESTAMP
);
CREATE TABLE prueba2 (
  pkid INTEGER NOT NULL PRIMARY KEY,
  testname TEXT,
  testvalue REAL,
  testdate DATE
);

Creariamos una función que es el motor de la auditoría en cuestión, creamos dos TRIGGER para cada tabla y probaríamos el funcionamiento de la auditoría.

Todo está reflejado en el siguiente enlace

De forma que podríamos hacer todos los apartados mencionados.

9. MySQL (1,3,4)

  1. Averigua si en MySQL se pueden realizar los apartados 1, 3 y 4. Si es así, documenta el proceso adecuadamente.

Necesitamos dos bases de datos, una que es la que vamos a auditar y la otra auxiliar va ser la que se encargue de la auditoría.

Creamos la base de datos:

create database escuela;
use escuela;

Creamos la tabla alumnos de ejemplo:

CREATE TABLE alumnos (
    codigo  VARCHAR(10),
    nombre  VARCHAR(25),
    apellidos VARCHAR(40),
    CONSTRAINT pk_codigo PRIMARY KEY (codigo)   
);

Creamos la base de datos adicional:

create database auditorias;
use auditorias

Ahora necesitamos una tabla donde registrar las operaciones

CREATE TABLE operaciones (
    codigo  INT(11) NOT NULL AUTO_INCREMENT,
    usuario  VARCHAR(50),
    fecha   DATETIME,
    CONSTRAINT pk_codigo_AUD PRIMARY KEY (codigo)   
);

Una vez creada la tabla necesitamos un Trigger para auditar las operaciones, en este caso los INSERT de la tabla alumnos.

use escuela

DELIMITER $$
CREATE TRIGGER audit_insert 
    BEFORE INSERT ON escuela.alumnos
    FOR EACH ROW
    BEGIN
        INSERT INTO auditorias.operaciones (usuario, fecha)
        values (CURRENT_USER(), NOW());
    END$$

Hacemos un insert en la tabla alumnos

INSERT INTO alumnos VALUES ('256','Celia','Garcia Marquez');
INSERT INTO alumnos VALUES ('236','Lorena','Garcia Fernandez');
INSERT INTO alumnos VALUES ('246','Julio','Gonzalez Fernandez');

Vemos que se han creado correctamente

mysql> select * from alumnos;
+--------+--------+--------------------+
| codigo | nombre | apellidos          |
+--------+--------+--------------------+
| 236    | Lorena | Garcia Fernandez   |
| 246    | Julio  | Gonzalez Fernandez |
| 256    | Celia  | Garcia Marquez     |
+--------+--------+--------------------+
3 rows in set (0.00 sec)

En la base de datos auditorias hacemos la siguiente consulta para ver los registros , como si se tratara de la auditoría en cuestión.

use auditorias;
select * from operaciones;

Comprobación:

mysql> select * from operaciones;
+--------+----------------+---------------------+
| codigo | usuario        | fecha               |
+--------+----------------+---------------------+
|      1 | root@localhost | 2021-05-23 18:26:42 |
|      2 | root@localhost | 2021-05-23 18:26:42 |
|      3 | root@localhost | 2021-05-23 18:26:43 |
+--------+----------------+---------------------+
3 rows in set (0.00 sec)

10. MongoDB

10. Averigua las posibilidades que ofrece MongoDB para auditar los cambios que va sufriendo un documento..

MongoDB incluye la capacidad de auditar instancias. La función de auditoría permite a los administradores y usuarios llevar un seguimiento del sistema, como hemos estado comentando a lo largo de todo el post.

La función de auditoría puede grabar los eventos en:

  • syslog
  • un fichero JSON o BSON
  • Directamente en la consola

Se usa el parámetro –auditDestination para habilitar la auditoría y especificar donde vamos a guardar el seguimiento.

  • Para guardar en el syslog:
mongod --dbpath /var/lib/mongodb --auditDestination syslog
  • Salida en la consola:
mongod --dbpath /var/lib/mongodb --auditDestination console
  • Salida en un fichero JSON
mongod --dbpath /var/lib/mongodb --auditDestination file --auditFormat JSON --auditPath /var/log/mongodb/auditLog.json

También se puede especificar en el fichero de configuración de mongodb de esta forma:

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
auditLog:
   destination: file
   format: JSON
   path: /var/log/mongodb/auditLog.json

11. Averigua si en MongoDB se pueden auditar los accesos al sistema.

Podríamos auditar los accesos al sistema bajo las mismas opciones anteriores, ademas de que se puede usar un parámetro –auditFilter como en el siguiente comando.

mongod --dbpath /var/lib/mongodb --auth --auditDestination file --auditFilter '{ atype: "authenticate", "param.db": "test" }' --auditFormat JSON --auditPath /var/log/mongodb/auditLog.json

Fuentes:

https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams016.htm#REFRN10006

https://alberton.info/postgresql_table_audit.html

https://costaricamakers.com/?p=2149

https://docs.mongodb.com/manual/tutorial/configure-audit-filters/

https://docs.mongodb.com/manual/tutorial/configure-auditing/

https://www.percona.com/blog/2017/03/03/mongodb-audit-log-why-and-how/