Administración de Sistemas Gestores de Bases de Datos UD 2: Auditorías en el SGBD Oracle Félix Reyes Fernández
Índice Conceptos Tipos de auditorías Registros de auditorías Vistas de auditorías Gestión de registros de auditorías Ejemplos de auditorías Herramienta LogMiner Auditoría de grano fino Recomendaciones
Auditorías Mediante la auditoría se intenta monitorizar y registrar acciones en la base de datos con el fin de : Investigar actividades maliciosas (borrado de tablas,..) Detectar privilegios incorrectamente otorgados a usuarios (que permiten realizar acciones inapropiadas, las cuales son detectadas) Recoger datos sobre actividades concretas (tablas que se actualizan, usuarios concurrentes, ) Detectar problemas con la implementación de políticas de seguridad (puntos débiles que generan registros) Puede ser más o menos general, permitiendo auditar: Ejecuciones de sentencias exitosas, fallidas o ambas. Ejecución de sentencias por sesión o por lanzamiento de sentencia. Usuarios concretos o todos los usuarios.
Tipos de auditorías Existen varios tipos: De sentencias. Seleccionando un tipo concreto de las mismas, que afectan a una determinada clase de objetos de base de datos (por ejemplo, AUDIT CREATE TABLE). De privilegios. Auditoría de privilegios de sistema (por ejemplo, AUDIT DELETE ANY TABLE). De esquema. Sentencias específicas sobre objetos de un esquema concreto (p. ej. AUDIT SELECT ON <nombre_tabla>). De grano fino ( fine grained ). Acceso a datos concretos y cambios en los mismos a nivel columna.
Registros de auditoría Audit trail Activación de la auditoría en ORACLE: La activación de la auditoría en Oracle viene definida por el parámetro AUDIT_TRAIL. Para ver el valor que tiene, ejecutamos la siguiente consulta: SELECT NAME, VALUE FROM v$parameter WHERE NAME LIKE audit_trail ;
Registros de auditoría Audit trail
Registros de auditoría Audit trail También podemos verlo escribiendo show parameter audit Podemos modificar éste parámetro de dos formas: a) Modificando directamente el archivo INIT.ORA b) A través de sentencias SQL La sentencia para activar la auditoría es la siguiente: ALTER SYSTEM SET audit_trail = "DB SCOPE=SPFILE;
Vistas de auditorías SELECT view_name FROM dba_views WHERE view_name LIKE '%AUDIT%' ORDER BY view_name; Ejercicio: Investiga para que vale cada una de estas vistas y háblame de las cinco que consideres más importantes
Gestión de registros de auditorías Proteger Ya que los registros que hayan en la tabla SYS.AUD$ podrían mostrar todas las acciones realizadas de forma no autorizada en nuestra base de datos, debemos tener constancia como administradores de toda acción que se haga sobre dicha tabla. Antes de nada, necesitamos tener configurado el parámetro 07_DICTIONARY_ACCESIBILITY pues es el que, si está desactivado, se encarga de que sólo los usuarios que tengan privilegios puedan acceder a los datos. Si este parámetro tiene el valor en true, cualquier usuario tendrá acceso a estos, por lo que debemos cerciorarnos de que el valor sea false. Por defecto, viene desactivado. Ahora podemos pasar a habilitar auditoría sobre esta tabla para conocer cualquier acción sobre esa tabla, con el comando: AUDIT INSERT,UPDATE,DELETE ON sys.aud$ BY ACCESS;
Gestión de registros de auditorías Eliminar Si queremos limpiar la tabla AUD$ bien por seguridad o por el motivo que sea, tan solo debemos introducir el comando siguiente: DELETE FROM sys.aud$; Ahora bien, si lo que queremos es eliminar los registros, sinónimos y vistas de auditoría de Oracle, ejecutamos un script que dependiendo de la versión y del sistema operativo, puede encontrarse en diferente ubicación y cambiar de nombre pero por lo general se llama catnoaud.sql Gestión de tamaño La tabla AUD$ es muy dinámica y hay que tener en cuenta, siendo el administrador, el tamaño de ella ya que puede aumentar dependiendo del número de opciones que se activen de auditorías y la frecuencia con la que realicemos esas auditorías. Si desactivamos la auditoría de la base de datos no aumenta, obviamente, la tabla de registros pues no guarda datos. Si tenemos la necesidad de hacer auditorías, hay que tener claros los objetivos para establecer las opciones de auditoría necesarias y evitar que se creen registros innecesarios.
Ejemplos de auditorías Inicios de sesión en bases de datos Cada vez que un usuario intente conectar con la base de datos, podemos hacer que quede registrado con la auditoría, independientemente de si ha sido un intento fallido de conexión o si ha sido correcta. Para poder auditar los inicios de sesión en la base de datos se usa el comando AUDIT SESSION. Este comando nos permite pasarle el usuario o usuarios a los que queremos realizarle auditoria de inicio de sesión, añadiendo al comando BY nombre_usuario1, nombre_usuario2,, nombre_usuarion; Además, si queremos auditar solamente los intentos fallidos, el comando será: AUDIT SESSION WHENEVER NOT SUCCESSFUL; Y si queremos auditar solamente las conexiones que se realicen correctamente: AUDIT SESSION WHENEVER SUCCESSFUL; Si queremos desactivar esta auditoría, pasamos la sentencia NOAUDIT SESSION
Ejemplos de auditorías Inicios de sesión en bases de datos Finalmente, para ver el resultado de la auditoria consultamos en la siguiente vista: SELECT username, userhost, extended_timestamp, action_name FROM dba_audit_session WHERE username= NOMBRE';
Ejemplos de auditorías Ejecución de sentencias concretas Podemos auditar la ejecución de sentencias que afectan a un objeto de la base de datos como tablas, sinónimos, usuarios, índices Por ejemplo, podemos auditar a un usuario cuando realice cierta acción. Supongamos que el usuario en cuestión ejecuta la secuencia: CREATE TABLE. Si quisiéramos auditarlo, ejecutaríamos: AUDIT CREATE TABLE BY nombre_del_usuario; CREATE TABLE, por tanto, entra en el grupo de TABLE con lo que podemos auditarlo de la siguiente forma: AUDIT CREATE TABLE BY FELIX; Tras ello, nos conectamos como FELIX, creamos una tabla nueva y en SYSTEM, introducimos el siguiente comando con el que veremos cómo ha quedado registrada la creación de la tabla: SELECT username, owner, obj_name, action_name, priv_used, timestamp FROM dba_audit_object WHERE username= FELIX ;
Ejemplos de auditorías Acciones de usuario Para poder realizar la auditoría a las acciones de cada usuario, utilizamos el comando AUDIT ALL Para probar que funciona vamos a utilizar una nueva tabla creada con el usuario FELIX Como SYSTEM lo vemos haciendo el siguiente comando: SELECT username, userhost, timestamp, obj_name, action_name, priv_used FROM dba_audit_trail WHERE username= FELIX ; Vamos a crear otro usuario, que va a hacer un SELECT sobre dicha tabla. Creamos el usuario PRUEBA, hacemos un SELECT a la tabla nueva creada TABLA_PRUEBA_2, volvemos a SYSTEM y utilizando la siguiente sentencia lo visualizamos: SELECT username, userhost, timestamp, obj_name, action_name, priv_used FROM dba_audit_trail WHERE username= PRUEBA ;
Ejemplos de auditorías Acciones sobre objetos Se pueden auditar operaciones de inserción, modificación, borrado y selección sobre tablas con lo que conseguimos tener control sobre la actividad que realicen los usuarios de la base de datos con ese objeto. El comando AUDIT que utilizábamos en las acciones de usuario cambia para las acciones de objetos incluyendo el parámetro BY SESSION o BY ACCESS. La diferencia entre BY SESSION y BY ACCESS es que la primera sólo registra un suceso de auditoría por sesión y la segunda registra un suceso de auditoría por cada acción que se realice. El inconveniente que supone BY ACCESS es el hecho de que registre un suceso de auditoría por operación puede afectar al rendimiento, con lo que se podría optar a utilizar BY SESSION aunque sea menos exhaustivo. Para auditar operaciones de inserción sobre una tabla por acceso utilizamos sentencias como: AUDIT INSERT ON nombre_tabla BY ACCESS; AUDIT DELETE ON nombre_tabla BY ACCESS;
Ejemplos de auditorías Acciones sobre objetos Si queremos auditar todas las operaciones que se realicen pondríamos la sentencia: AUDIT ALL ON nombre_tabla BY ACCESS; Para comprobar cómo funciona, vamos a auditar la operación de inserción en la tabla TABLA_PRUEBA, para activar la auditoría utilizamos el comando nombrado anteriormente: AUDIT INSERT ON FELIX.TABLA_PRUEBA BY ACCESS; ; Nos conectamos como FELIX, y hacemos una inserción sobre dicha tabla: INSERT INTO TABLA_PRUEBA VALUES ( Probando, auditar ); Volvemos al usuario SYSTEM, y hacemos una consulta para comprobar que se ha registrado SELECT username, userhost, timestamp, owner, obj_name, action_name FROM dba_audit_object WHERE username= FELIX ;
Ejemplos de auditorías Acciones sobre objetos Con el siguiente comando, auditaríamos todas las operaciones que se realizaran sobre la tabla siguiente: AUDIT ALL ON TABLA_PRUEBA BY ACCESS; Pero antes de eso, es importante dejar de auditar las operaciones que habíamos activado antes, INSERT y DELETE, para no confundirnos. Así, al auditar todo y no tener otro tipo de auditoría sobre la tabla podemos ver con más seguridad que está realizando lo que deseamos. Para dejar de auditar, al principio ya se dijo que se utilizaría: NOAUDIT
Ejemplos de auditorías Acciones sobre objetos Con el usuario FELIX, realizamos operaciones de inserción y de eliminación, con las sentencias: INSERT INTO TABLA_PRUEBA VALUES ( Felix, Reyes ); DELETE TABLA_PRUEBA; Y, con SYSTEM, vamos a hacer una consulta donde nos deberá de aparecer tanto INSERT como DELETE, ya que auditábamos todas las operaciones sobre dicha tabla: SELECT username, userhost, timestamp, owner, obj_name, action_name FROM dba_audit_object WHERE username= FELIX ;
Ejemplos de auditorías Privilegios del sistema Si queremos auditar privilegios del sistema, usamos la sentencia: AUDIT privilegio_sistema BY ACCESS/BY SESSION; Para saber cuáles son los privilegios del sistema, ejecutaremos la siguiente sentencia: SELECT PRIVILEGE FROM dba_sys_privs; A modo de ejemplo, vamos a auditar el privilegio DELETE ANY TABLE, para ello usamos la sentencia: AUDIT DELETE ANY TABLE BY ACCESS; Ahora, vamos a eliminar alguna tabla, volver a SYSTEM y realizar una consulta para ver si lo ha registrado: SELECT username, timestamp, object_name, action_name FROM dba_audit_trail WHERE username= FELIX ; Si no se especifica audita tanto las correctas como las que no. Para que esto no suceda y sólo audite las correctas se incluirá en el final de la sentencia: WHENEVER SUCCESSFUL, y para que sólo audite las no correctas se incluirá en el final de la sentencia: WHENEVER NOT SUCCESSFUL.
Herramienta LogMiner Muchas veces queremos conocer los comandos ejecutados y el detalle, de cierta información que han modificaron en el pasado; pues para esto, existe una herramienta de Oracle llamada LogMiner, que sin necesidad de que hayamos activado auditoría por objeto, usuario, acción, etc. podemos conocer todos estos detalles solamente con tener la BD configurada en ArchiveLog Mode. Esta herramienta lo que nos permite es, configurar o añadir metadatos relacionados con nuestros archives generados, a la BD. Lo cual nos permitirá leerlos de una forma muy fácil.
Herramienta LogMiner ArchiveLog Mode Los archive logs se utilizan para realizar backups en caliente. Oracle escribe en los archivos de reconstrucción en línea (redo log online) cuando los usuarios realizan modificaciones en la BD. Ahí se guardan todas las transacciones que se van realizando, es un proceso cíclico. Cuando ORACLE se ejecuta en modo ArchiveLog, se hace una copia de cada archivo de redo log online en disco (reconstrucción fuera de línea) ARCHIVELOG - Mecanismo de protección ante fallos de disco - Permite realizar copias de seguridad físicas online sin detener la BD - Se podría recuperar la BD en un momento específico del tiempo
Herramienta LogMiner INCONVENIENTES - Se ralentiza la BD - Requiere más espacio en disco ARCHIVE LOG LIST: Para ver información sobre archive logs ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='location=C:\archive_log_offline' SCOPE=SPFILE ACTIVAR SHUTDOWN IMMEDIATE, STARTUP MOUNT, ALTER DATABASE ARCHIVELOG, ALTER DATABASE OPEN DESACTIVAR ALTER DATABASE NOARCHIVELOG SELECT NAME FROM v$archived_log
Herramienta LogMiner Para activarlo tenemos que poner una ruta de archivo en el parámetro utl_file_dir, y primero, vamos a ver el valor con el comando: SHOW PARAMETER UTL; alter system set utl_file_dir='c:\oraclexe\app\oracle\usuario\logminer' scope=spfile; Creamos el directorio y creamos el diccionario que va a usar LogMiner, que debe ser en el mismo directorio con la sentencia: EXEC DBMS_LOGMNR_D.BUILD(DICTIONARY_FILENAME =>'logminer.ora', DICTIONARY_LOCATION => 'C:\oraclexe\app\oracle\usuario\logminer ); Tenemos que especificar a logminer, los ficheros que tiene que estudiar que son nuestros ficheros log. Para verlos ejecutamos la siguiente consulta: select member from v$logfile;
Herramienta LogMiner Para añadirlos utilizamos la sentencia siguiente: EXEC DBMS_LOGMNR.add_logfile( C:\ORACLEXE\APP\ORACLE\FAST_RECOVERY_AREA\X E\ONLINELOG\O 1_MF_2_8CPXLZWT_.LOG ); EXEC DBMS_LOGMNR.add_logfile( C:\ORACLEXE\APP\ORACLE\FAST_RECOVERY_AREA\X E\ONLINELOG\O 1_MF_1_8CPXLY3J_.LOG ); Ahora, tenemos que eliminar el fichero log 1 y utilizamos la sentencia: EXEC DBMS_LOGMNR.remove_logfile( C:\ORACLEXE\APP\ORACLE\FAST_RECOVERY_ARE A\XE\ONLINELO G\O1_MF_1_8CPXLY3J_.LOG ); Al ejecutar la siguiente sentencia vemos que el fichero correspondiente al fichero redolog 2 (O1_MF_2_8CPXLZWT_.LOG) es el que se ha añadido a la carpeta que creamos para logminer, con esto comprobamos su funcionamiento. EXEC DBMS_LOGMNR.START_LOGMNR(DICTFILENAME=>'C:\oraclexe\app\oracle\usuario\lo gminer\logminer.ora );
Herramienta LogMiner Ya para ver un ejemplo, tenemos antes que nada dar un formato para el SELECT: SET PAGES 100 SET LINES 150 COLUMN SQL_REDO FORMAT a50 COLUMN SQL_UNDO FORMAT a50 Y la sentencia SELECT que vamos a hacer es la siguiente: SELECT SQL_REDO, SQL_UNDO FROM v$logmnr_contents WHERE rownum<10;
Auditoría de grano fino Si queremos saber qué consulta ha sido ejecutada sobre una tabla o qué datos han sido insertados, modificados o borrados necesitamos lo que se llama auditoría de grano fino. Permite crear registros de auditorías basados en una consulta exacta, condición y datos recuperados o manipulados por la sentencia. Provee facilidad para auditar solo esas sentencias que referencian a una columna particular. Te permite establecer condiciones de auditoría y especificar la columna auditada para diseñar que columna de una tabla o vista tiene que ser monitorizada. Cuando la condición es encontrada en una columna particular, la auditoría de grano fino escribe un registro de auditoría que muestra el texto SQL de la consulta. En la auditoría estándar, se graban detalles como propietario, tiempo, tipo de sentencia, pero no da información sobre el cambio que ocurrió en el dato. Esta información puede ser muy útil para el DBA o usuario que desea analizar las actividades que ocurrieron en la tabla.
Auditoría de grano fino Aspectos a tener en cuenta: El rendimiento de la base de datos disminuye bastante y aún más cuando la tenemos siempre activada, por lo que es aconsejable usarla en ocasiones necesarias y con un uso de la base de datos mínimo para que no baje tanto su rendimiento. Las operaciones realizadas que no tengan éxito no se guardan en la auditoría Ejemplo: Crea una tabla de productos e inserta datos en ella Creamos una política que controlará los precios que superen 700. Esto se hace con la orden dbms_fga.add_policy(), y se utiliza de la siguiente forma: BEGIN dbms_fga.add_policy( object_schema=> felix, object_name=> productos, policy_name=> politicauditoria, audit_condition=> precio > 700, audit_column => precio statement_types=> insert,update ; END; / Y con el usuario SYS, quedará registrada la sentencia realizada que cumpla la política creada introduciendo el siguiente comando: SELECT sql_text FROM dba_fga_audit_trail;
Auditoría de grano fino Procedimiento DISABLE_POLICY Deshabilita una política de auditoría. DBMS_FGA.DISABLE_POLICY( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2 ); Procedimiento ENABLE_POLICY Habilita una política de auditoría. DBMS_FGA.ENABLE_POLICY( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2, enable boolean ); Procedimiento DROP_POLICY Borra una política de auditoría. DBMS_FGA.DROP_POLICY( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2 );
Auditoría. Recomendaciones Es necesario seguir una serie de reglas a la hora de auditar la actividad de la base de datos: - Limitar el numero de acciones auditadas y el tiempo durante el que se hará. Así disminuye el impacto de la auditoría sobre las sentencias supervisadas y se limita el tamaño del audit trail ( qué debo o quiero auditar?). - Evaluar el propósito y planear una estrategia ( para qué y por qué audito?, qué actividad maliciosa he detectado?). - Si se audita debido a la sospecha de alguna acción maliciosa; debe comenzarse por auditar acciones de tipo general para, una vez analizada la información, pasar a auditar acciones mas concretas. - Proteger el audit trail, de forma que la informacion de auditoría no pueda ser añadida, modificada o borrada sin ser registrada la operación. - Controlar de forma estricta quien tiene derecho a auditar. - En caso de que se desee recoger información histórica sobre determinadas operaciones debe auditarse sólo aquellas acciones que sean pertinentes; y preocuparse de guardar los registros de auditoría de interés y eliminar periódicamente del audit trail esta informacion.
Actividad Mediante Oracle Enterprise Manager, analiza como trabajar las auditorías.
Ruegos y Preguntas