Dependendo do nível e da quantidade de auditoria habilitada no banco de dados, os registros criados pelos audit trail, que geralmente são armazenados no banco através da tabela AUD$ pertencente ao schema SYS que consequentemente pertence ao tablespace SYSTEM, pode levar a números exorbitantes no tamanho desse tablespace.
Para mais informações precisas de auditoria, o Oracle fornece um controle ainda maior através do “Fine Grained Auditing” feature disponível para o Oracle 11g (estarei falando dela em breve). Com esse tipo de auditoria disponível um outra tabela é utilizada para armazenar as ações auditadas que é a FGA_LOG$ disponível também sobre o schema SYS.
Um procedimento muito interessante, antes da tabelas AUD$ e FGA_LOG$ do schema SYS começarem crescerem, recomendasse muda-lás para um outro tablespace de dados qualquer.
Esse metodo se faz interessante, já que se o tablespace SYSTEM crescer por causa dessas tabelas de auditoria o seu banco de dados pode parar caso o tablespace não encontre mais espaço para estender. Já com as tabelas de auditória fora do tablespace SYSTEM esse risco diminui.
Uma outra vantagem é a manutenção, já que caso alguma atividade (como shrink, move, etc …) seja necessária, ela será muito mais simples de ser executada caso for fora do tablepsace SYSTEM.
Segue o passo a passo para mudar a tabela AUD$ de tablespace:
oracle@oracle11g ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Tue Oct 9 23:42:18 2012 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQ> create tablespace "AUDIT" datafile '/u01/app/oracle/oradata/dbtst/audit_01.dbf' size 1G; Tablespace created. SQL> create table audx tablespace "AUDIT" 2 storage (initial 50k next 50k pctincrease 0) 3 as select * from aud$ where 1 = 2; Table created. SQL> rename AUD$ to AUD$$; Table renamed. SQL> rename audx to aud$; Table renamed. SQL> create index i_aud2 2 on aud$(sessionid, ses$tid) 3 tablespace "AUDIT" storage(initial 50k next 50k pctincrease 0); Index created. SQL> select tablespace_name from dba_tables where owner='SYS' and table_name='AUD$'; TABLESPACE_NAME ------------------------------ AUDIT
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á.
