À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 ‘/
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