N style="mso-spacerun: yes">
Clique aqui para ler todos os artigos desta edição
Implementando auditoria no Oracle9i
por Rodrigo Salviatto
O DBA de uma empresa precisa se preocupar diariamente com a segurança de um dos ativos mais importantes que ela possui: os dados. Você já deve ter se questionado, por exemplo: Quem removeu aquela visão? Quem alterou os dados da tabela de produtos? Cadê os sinônimos? Quem removeu a stored procedure que alimentava o sistema de faturamento?
Ao implementar auditoria no Oracle 9i, você poderá obter todas as respostas para estas perguntas. A auditoria se tornou uma ferramenta poderosa para identificar as ações maliciosas ou acidentais no banco de dados. Neste artigo iremos explicar como funciona e como proceder para implementá-la.
Primeiros passos
O Oracle9i possui importantes recursos de auditoria para diversas ações que ocorrem no banco de dados. Há algumas operações que são sempre auditadas como, o início e o fim de uma instância, os logins como SYSDBA e SYSOPER. Estas informações podem ser encontradas no registro de alerta (alert.log) de seu banco de dados, bem como informações auditadas sobre troca de registro (undo.log), pontos de verificação (checkpoints) e tablespace colocados off-line ou online sem que o DBA efetue qualquer alteração no banco de dados.
Existe também outro tipo de auditoria onde o DBA poderá configurar o banco de dados para registrar todas as ações de comandos bem sucedidos ou não. Iremos estudar três tipos de auditoria:
• Ações no banco de dados;
• Tentativas de login;
• Acesso aos objetos.
Para configurar a auditoria no Oracle9i, você deverá incluir o parâmetro AUDIT_TRAIL no arquivo de parâmetros de inicialização init
AUDIT_TRAIL=TRUE
Não é um parâmetro dinâmico, portanto após incluí-lo no arquivo, você deverá parar e reiniciar a instância do Oracle. Veja abaixo os valores aceitos para este parâmetro:
• OS: ativa a auditoria, gravando as informações no controle de auditoria do sistema operacional. No Windows, os logs são escritos no event viewer. Já no Unix e Linux, os registros são gravados no diretório identificado pelo parâmetro de inicialização AUDIT_FILE_DEST.
• DB ou TRUE: ativa a auditoria, gravando as informações na tabela SYS.AUD$.
• NONE: desativa a auditoria.
A tabela AUD$ faz parte do dicionário de dados e está criada no tablespace SYSTEM. Portanto, vale ressaltar que todo cuidado deve ser tomado para que a auditoria não atrapalhe o gerenciamento de espaço alocado para este importante tablespace. Muitas empresas costumam mover a tabela SYS.AUD$ do tablespace SYSTEM, para outro tablespace evitando assim problemas com espaço em disco.
Para eliminar os registros antigos da tabela SYS.AUD$, o usuário deverá possuir o papel DELETE _CATALOG_ROLE. Para conceder esse direito devemos fazer o seguinte:
SQL> GRANT DELETE_CATALOG_ROLE TO SCOTT;
Concessão bem-sucedida
Uma vez concedido o direito, podemos efetuar a remoção de registros da tabela SYS.AUD$ (ver Listagem 1).
SQL> CONNECT SCOTT@ORCL
Conectado.
SQL> DELETE FROM SYS.AUD$;
12 linhas excluídas;
Listagem 1. Usuário SCOTT efetuando a remoção de registros da tabela SYS.AUD$.
O usuário que for auditar o banco de dados deverá possuir o papel de AUDIT SYSTEM. Veja como atribuir esse papel abaixo:
SQL> GRANT AUDIT SYSTEM TO SCOTT;
Concessão bem-sucedida
Auditorias de login
É possível registrar informações todas as vezes que um usuário efetuar logon (tendo sucesso ou não) no banco de dados. Para fazer isso, devemos executar o comando apresentado abaixo:
SQL> AUDIT SESSION;
Auditoria bem-sucedida
Caso haja a necessidade de auditar apenas as tentativas de logon com sucesso ou não, utilize os comandos mostrados abaixo. Para auditar tentativas de logon com sucesso:
SQL> AUDIT SESSION WHENEVER SUCCESSFUL;
Auditoria bem-sucedida
Para auditar tentativas de logon sem sucesso:
SQL> AUDIT SESSION WHENEVER NOT SUCCESSFUL;
Auditoria bem-sucedida
Por fim, para desativar a auditoria de sessão, proceda conforme o código abaixo:
SQL> NOAUDIT SESSION;
Auditoria bem-sucedida
Para cada operação de auditoria, o Oracle produz um registro na tabela SYS.AUD$ contendo as seguintes informações:
• O usuário que executou a operação: SCOTT;
• O tipo de operação: GRANT, UPDATE, DELETE, INSERT, AUDIT;
• O objeto envolvido na operação: nome da tabela, visão, índice, etc.;
• A data e hora da operação;
• O terminal de onde foi executada a operação: nome da estação/servidor de onde foi executado o comando/operação;
• Entre outras.
Veja as colunas existentes na tabela SYS.AUD$ na Listagem 2.
SQL> DESC SYS.AUD$
Name Null? Type
----------------------------- -------- ----------------
SESSIONID NOT NULL NUMBER
ENTRYID NOT NULL NUMBER
STATEMENT NOT NULL NUMBER
TIMESTAMP# NOT NULL DATE
USERID VARCHAR2(30)
USERHOST VARCHAR2(128)
TERMINAL VARCHAR2(255)
ACTION# NOT NULL NUMBER
RETURNCODE NOT NULL NUMBER
OBJ$CREATOR VARCHAR2(30)
OBJ$NAME VARCHAR2(128)
AUTH$PRIVILEGES VARCHAR2(16)
AUTH$GRANTEE VARCHAR2(30)
NEW$OWNER VARCHAR2(30)
NEW$NAME VARCHAR2(128)
SES$ACTIONS VARCHAR2(19)
SES$TID NUMBER
LOGOFF$LREAD NUMBER
LOGOFF$PREAD NUMBER
LOGOFF$LWRITE NUMBER
LOGOFF$DEAD NUMBER
LOGOFF$TIME DATE
COMMENT$TEXT VARCHAR2(4000)
CLIENTID VARCHAR2(64)
SPARE1 VARCHAR2(255)
SPARE2 NUMBER
OBJ$LABEL RAW(255)
SES$LABEL RAW(255)
PRIV$USED NUMBER
SESSIONCPU NUMBER
Listagem 2. Colunas da visão de dicionário de dados AUD$.
Para visualizar os registros armazenados na tabela SYS.AUD$, podemos utilizar a visão do dicionário de dados DBA_AUDIT_SESSION conforme apresentado na Listagem 3.
SQL> DESC DBA_AUDIT_SESSION
Name Null? Type
----------------------- -------- ----------------
OS_USERNAME VARCHAR2(255)
USERNAME VARCHAR2(30)
USERHOST VARCHAR2(128)
TERMINAL VARCHAR2(255)
TIMESTAMP NOT NULL DATE
ACTION_NAME VARCHAR2(27)
LOGOFF_TIME DATE
LOGOFF_LREAD NUMBER
LOGOFF_PREAD NUMBER
LOGOFF_LWRITE NUMBER
LOGOFF_DLOCK VARCHAR2(40)
...