N style="mso-spacerun: yes">capaSQL17.JPG

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.ora.

 

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)

...

Quer ler esse conteúdo completo? Tenha acesso completo