Guob 2014
Auditoria no Oracle 10g
maio 10, 2011

Auditoria é a habilidade do banco de dados Oracle poder gerar logs de auditoria (XML, tabelas, arquivos de SO, …) em atividades suspeitas do usuário, como por exemplo: monitorar o que um determinado usuário está fazendo ou até mesmo saber para qual valor a coluna de salário da tabela empregados está sendo atualizadas. Com a auditoria, esses dados são facilmente capturados e guardados para posteriormente serem analisados.

Realizar auditorias basicamente consiste em 2 passos:
1) Deixar o banco em modo auditoria.
2) Especificar os objetos/privilegio/instrução a serem auditados.

Para habilitar a auditoria, é necessário mudar o parâmetro de inicialização audit_trail, para que o Oracle inicie e reconheça o tipo de auditoria que você necessita. Ele suporta os seguintes valores, cada um com o seguinte função.

OS: Auditoria Habilitada, os registros vão ser gravados em diretorios do sistema em arquivos de auditoria.
DB ou TRUE: Auditoria é habilitada, os registros de auditoria serão armazenadas no database (SYS.AUD$)
XML: Auditoria é habilitada, os registros serão armazenados em formatos XML.
NONE ou FALSE: Auditoria é desabilitada.
DB_EXTENDED: Trabalha igual ao parâmetro DB, mais as colunas SQL_BIND e SQL_TEXT são preenchidas.

Quando se seleciona os modos OS ou XML, arquivos são criados com os registros de auditoria, eles se localizam parâmetro audit_file_dest.

Em nosso exemplo prático, vamos utilizar o tipo de auditoria DB, então executares o seguintes comandos:

SQL> ALTER SYSTEM SET audit_trail = “DB” SCOPE = SPFILE;

System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area 826277888 bytes
Fixed Size	 1222072 bytes
Variable Size	 222300744 bytes
Database Buffers	 595591168 bytes
Redo Buffers	 7163904 bytes
Database mounted.
Database opened.

Agora será necessário especificar as opções de auditoria, elas são em três partes, faremos exemplos das três. Antês disso, vamos criar o usuário user_audit, para trabalharmos com ele na auditoria.

SQL> conn sys as sysdba
Enter password:
Connected.

SQL> create user user_audit identified by oracle
2 default tablespace users
3 temporary tablespace temp
4 quota unlimited on users;

User created.

SQL> GRANT connect to user_audit;

Grant succeeded.

Agora poderemos trabalhar com o usuário user_audit.

1) Auditoria de Instrução.

Sintaxe :

AUDIT clausula_instrução BY { SESSION | ACESS } WHENEVER [ NOT ] SUCCESSFUL;

BY SESSION: Resumi a escrita dos registros por sessão para o mesmo tipo de instrução em um mesmo objeto, essa é a opção default.
BY ACCESS: Escreve um registro para cada vez que a auditoria é executada.
WHENEVER SUCCESSFUL : Instrução bem-sucedidas, que não mostram mensagens de erros.
WHENEVER NOT SUCCESSFUL: Instrução não bem-sucedidas, que mostram mensagens de erros.

Queremos conceder o privilégio CREATE TABLE, mais queremos ter um registro de auditória quando o comando for executado.

Com o usuário sys, damos o privilégio de criação de tabela para o usuário USER_AUDIT, e criamos a auditoria de instrução TABLE, ou seja,as instruções afetadas na tabela, incluindo CREATE TABLE, DROP TABLE e TRUNCATE TABLE.

SQL>GRANT create table TO user_audit;

Grant succeeded

SQL> AUDIT table by user_audit whenever successful;

Audit succeeded.

Agora com o usuário USER_AUDIT, criamos a tabela table_audit.

SQL> create table table_audit
2 (
3 id number
4 )
5 /

Table created.

Para verificarmos se a auditoria foi bem sucedida, basta entrarmos como um usuário sysdba e verificar na view dba_audi_trail o registro criado.

SQL> column username FORMAT A10
SQL> column obj_name FORMAT A10
SQL> column sql_text FORMAT A10
SQL> column timestamp FORMAT A35
SQL> column action_name FORMAT A20
SQL> set linezie 300

SQL> SELECT username, to_char(timestamp, 'DD/MM/YYYY HH24:MI:SS') timestamp,
2 obj_name, action_name
3 FROM dba_audit_trail
4 WHERE username = 'USER_AUDIT';

USERNAME   TIMESTAMP                     OBJ_NAME      ACTION_NAME
---------- ----------------------------- ------------ --------------------
USER_AUDIT 27/09/2009 08:09:40            table_audit   CREATE TABLE

Para desativar a auditoria do usuário user_audit, utilizamos o comando NOAUDIT, como a seguir:

SQL> noaudit index by user_audit
Noaudit succeeded.

Vamos fazer um outro exemplo, mais agora sobre a sessão do usuário. Há casos em que há a necessidade de auditar, tanto os logins bem sucedidos como os malsucedidos. Veja como é simples fazer isso com auditoria.

SQL> audit session whenever successful;

Audit succeeded.

SQL> audit session whenever not successful;

Audit succeeded.

Para verificar as trilhas basta:

SQL> select username, to_char(timestamp, 'DD/MM/YYYY HH24:MI:SS') Timestamp,
2 returncode, action_name
3 FROM dba_audit_trail
4 WHERE action_name in ('LOGON', 'LOGOFF');

USERNAME      TIMESTAMP        RETURNCODE   ACTION_NAME
------------ ---------------	 ------------	 ---------------
SYSMAN       27/09/2009 07:15:40   0        LOGOFF
USER_AUDIT   27/09/2009 09:20:25   1017     LOGON

Observe a coluna returncode no usuário user_audit, ela representa o número da mensagem de erro da Oracle, o ORA-1017 indica que a senha está incorreta, uma outra alternativa se estivéssemos interessados somentes nos logons e logoffs, poderiamos usar a view DBA_AUDIT_SESSION.

2) Auditoria de objetos.

Para auditar comandos DML em tabelas, devemos utilizar esse tipo de auditoria, a sintaxe é parecida com o de instrução. Se quiséssemos auditar todos os comandos update executados na tabela audit_table do usuário user_audit, poderiamos fazer …

SQL> audit update on user_audit.audit_table by access whenever successful

Se o usuário user_audit decidir atualizar a tabela, ele será auditado.

SQL> update table_audit set id = 1 where id = 2;

1 row updated.

Podemos verificar na view dba_audit_trail a auditoria.

SQL> select username, to_char(timestamp, 'DD/MM/YYYY HH24:MI:SS') Timestamp, action_name
2 FROM dba_audit_trail
3 WHERE username = 'USER_AUDIT'

USERNAME               TIMESTAMP             ACTION_NAME
--------------------- --------------------- -------------------
USER_AUDIT             27/09/2009 11:38:41    UPDATE
USER_AUDIT             27/09/2009 11:38:58    UPDATE

3) Auditoria de privilégios.

Auditoria de privilégios tem quase a mesma sintaxe básica dos outros tipos …

SQL> audit alter tablespace by access whenever successful;

Audit succeed.

Toda vez que o privilégio ALTER TABLESPACE é utilizado com sucesso, um novo registro é adicionado a SYS.AUD$.

Não há só a dba_audit_trail para a visualização dos registros de auditoria, para verificar todas as views disponível, podemos fazer uma busca na dba_views.

SQL> SELECT view_name FROM dba_views
2 WHERE view_name LIKE 'DBA%AUDIT%'
3 ORDER BY view_name;

VIEW_NAME
------------------------------
DBA_AUDIT_EXISTS
DBA_AUDIT_OBJECT
DBA_AUDIT_POLICIES
DBA_AUDIT_POLICY_COLUMNS
DBA_AUDIT_SESSION
DBA_AUDIT_STATEMENT
DBA_AUDIT_TRAIL
DBA_COMMON_AUDIT_TRAIL
DBA_FGA_AUDIT_TRAIL
DBA_OBJ_AUDIT_OPTS
DBA_PRIV_AUDIT_OPTS

VIEW_NAME
------------------------------
DBA_REPAUDIT_ATTRIBUTE
DBA_REPAUDIT_COLUMN
DBA_STMT_AUDIT_OPTS

14 rows selected.

Por fim, faltou falar sobre a auditoria FGA, que é uma auditoria refinada (Fine-grained object auditing), que é implementada pelo package DBMS_FGA. A auditoria padrão que acabamos de aprender, é feita facilmente em objetos que foram acessados e quem acessou, mais não se você quizer descobrir as colunas ou linhas que foram acessadas, é nessa parte que entra a auditoria refinada, em um outro artigo falarei somente sobre a FGA, até lá.