Fazendo auditoria sem inflar a tbs system

Às vezes os DBA´s são solicitados para fazer auditoria de banco de dados. No Oracle, temos 3 tipos de auditoria:

* Padrão do banco de dados (Auditoria de objetos e privilégios);
* Baseada em valor (Triggers);
* FGA (DML’s baseada em conteúdo);

Cada uma delas é utilizada em um caso específico, e somente uma delas é necessário reiniciar o banco de dados, pois o parâmetro AUDIT_TRAIL é ainda é estático, e é nela que este post vai ser baseado “Auditoria Padrão (comando AUDIT)”.

Para ligar a auditoria padrão precisamos definir o parâmetro AUDIT_TRAIL com um dos valores abaixo, com isso, o armazenamento do Oracle muda:

* none – Desabilita (valor padrão);
* os – Grava a trilha no SO;
* db – Grava a trilha no banco (SYS.AUD$);
* db,extended – db + popula as colunas SQLBIND e SQLTEXT;
* xml – Grava a trilha no SO em formato XML;
* xml,extended – xml + imprime os valores as colunas SQLBIND e SQLTEXT;

Em 99,9% dos casos os DBA’s vão preferir usar o parâmetro definido com (db ou db,extend), assim ele vai ter mais controle sobre o tamanho da trilha de auditoria e quem acessa o que foi auditado. Nesse método só tem um pequeno problema quando o volume de acessos é grande:

“A SYS.AUD$ é uma visão do dicionário de dados e fica hospedada na SYSTEM”

Logo –> Se a sua trilha de auditoria crescer muito ela vai fazer a SYSTEM ficar muito grande, e não é isso que queremos. Seguindo o note do Metalink 72460.1 esse problema é facilmente solucionado e não compromete a tablespace SYSTEM. Nem preciso dizer que é um componente dos mais importantes no seu banco de dados Oracle.

Mãos na massa:

1. Desative a auditoria se ela estiver habilitada:

SQL> alter system set audit_trail=none scope=spfile;

Obs: Isso deve ser feito em uma janela de manutenção (afinal não podemos ficar dando shutdown a torta e a direita em um bd de produção, se bem que às vezes os usuários merecem isso… Rsrsrsrs):

2. Reinicie o banco de dados:

SQL> startup;

3. Crie uma tablespace para hospedar a auditoria:

SQL> create tablespace tbs_audit_01
2 datafile ‘/ /oradata//tbs_audit_01.dbf’
3 size 1g autoextend on next 1g maxsize 4g;

4. Conectado como SYS (sys as sysdba):

SQL> create table system.aud$ tablespace tbs_audit_01
2 as select * from aud$;

SQL> create index system.i_aud1
2 on system.aud$(sessionid, ses$tid) tablespace tbs_audit_01;

SQL> rename aud$ to aud$_temp;

SQL> create view aud$ as select * from system.aud$;

5. Conectado com SYSTEM, dê os privilégios:

SQL> grant all on aud$ to sys with grant option;

SQL> grant delete on aud$ to delete_catalog_role;

6. Reinicie o banco de dados com o parâmetro ligado:

SQL> alter system set audit_trail=DB scope=spfile;

SQL> startup;

7. Recrie as views de audit do dicionário de dados:

@?/rdbms/admin/cataudit.sql

Com esses passos acima realizados, o DBA pode auditar com um pouco mais de tranqüilidade, mesmo assim ele deve monitorar e sempre que possível expurgar as trilhas de auditoria de sua base, de acordo com as políticas de retenção.

Alguns exemplos do comando AUDIT.

AUDIT ALL BY seu_usuario BY ACCESS;
AUDIT EXECUTE PROCEDURE BY seu_usuario BY ACCESS;
AUDIT UPDATE TABLE, SELECT TABLE, INSERT TABLE, DELETE TABLE BY seu_usuario BY ACCESS;


Os comandos acima realizam auditoria de tudo o que o “SEU_USUARIO” fizer (DDL, DML, Logon e Logoff) em cada acesso aos objetos.

Poderíamos também realizar auditoria de um objeto independente de quem os acessa e também por uma sessão inteira (menos trilha de audit). O comando ficaria assim:

AUDIT ALL ON meu_schema.minha_tabela BY SESSION;

Quando não queremos auditar mais determinado objeto podemos usar o comando “NOAUDIT”. O comando abaixo é a negação do comando acima:

NOAUDIT ALL ON meu_schema.minha_tabela BY SESSION;

Há um comando muito perigoso que liga auditoria para tudo ou quase tudo no banco e não recomendo usar em um Bd de produção. Esse eu achava melhor nem mostrar, mas vamos lá:

AUDIT ALL;

O comando acima liga auditoria para todos os usuários e objetos do banco de dados, menos operações realizadas com o usuário SYS, para audtitar o SYS também, precisamos utilizar o parâmetro AUDIT_SYS_OPERATIONS=TRUE.

Considerações Finais: É importante ressaltar que o parâmetro de auditoria ligado não fará todo o trabalho e você dba é quem ligará auditoria onde bem entender. A Oracle recomenda em versões superiores ao 9i utilizar a package “DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION” para realização dessa tarefa, embora eu fiz no 10g (10.2.0.4) seguindo os passos acima sem maiores problemas.

Dúvidas e comentários:

mufalani (at) gmail (dot) com

Abraços,

Rodrigo Mufalani

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *