Pular para o conteúdo

Guia abrangente para auditoria de banco de dados com Oracle: Técnicas e comandos para maior segurança de dados

Auditing – Auditoria

Auditoria em bancos de dados é como ter um detetive particular para os dados da empresa. Com ela, podemos acompanhar de perto todas as ações realizadas dentro do sistema, garantindo que tudo esteja em conformidade e que os dados estejam seguros. Neste artigo, exploraremos as funcionalidades de auditoria do Oracle Database, passando por conceitos, comandos essenciais e exemplos práticos. Desde a visualização das views de auditoria até a aplicação de políticas avançadas, nosso objetivo é tornar o processo de auditoria não apenas compreensível, mas também eficiente e valioso para o gerenciamento e segurança dos dados.

O comando abaixo ajuda a visualizar todas as views de auditoria disponíveis no banco de dados:

image 26
VIEWS AUDIT
SQL
SELECT view_name
FROM   dba_views
WHERE  view_name LIKE 'DBA%AUDIT%'
ORDER BY view_name;

Este comando revela que temos várias ferramentas para explorar o tema da auditoria. Para tornar o laboratório o mais real possível, vamos simular um ambiente onde o usuário USR_BANGUELA é auditado pelo usuário USR_AUDITOR. Por padrão, é necessário iniciar o processo de auditoria concedendo os privilégios apropriados ao auditor.

image 28
PRIVILÉGIOS DO USR_AUDITOR

Para que o usuário USR_AUDITOR possa realizar a auditoria, é necessário conceder os seguintes privilégios:

SQL
GRANT AUDIT SYSTEM TO USR_AUDITOR;
GRANT AUDIT ANY TO USR_AUDITOR;
GRANT CREATE SESSION TO USR_AUDITOR;
GRANT RESOURCE TO USR_AUDITOR;
GRANT SELECT ON SYS.AUD$ TO USR_AUDITOR;
GRANT SELECT ANY TABLE TO USR_AUDITOR;

Com os privilégios concedidos, o próximo passo é iniciar a auditoria. Utilizaremos os seguintes comandos para configurar a auditoria das ações realizadas pelo usuário USR_BANGUELA:

image 29
ATIVADO AUDITORIA
SQL
AUDIT ALL BY USR_BANGUELA BY ACCESS;
AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE BY USR_BANGUELA BY ACCESS;
AUDIT EXECUTE PROCEDURE BY USR_BANGUELA BY ACCESS;

Esses comandos permitirão auditar todas as ações realizadas pelo usuário USR_BANGUELA. Cada operação—seja uma seleção, atualização, inserção ou exclusão de tabela, ou mesmo a execução de procedimentos—gerará um registro de auditoria.

Vamos ver isso na prática. O usuário USR_BANGUELA executará uma sequência de comandos DML.

image 31
DML DO USUÁRIO

O usuário USR_BANGUELA executa os seguintes comandos DML:

SQL
CREATE TABLE funcionarios (
    id_funcionario NUMBER(5),
    nome VARCHAR2(50),
    salario NUMBER(10, 2),
    departamento VARCHAR2(30)
);

INSERT INTO funcionarios VALUES (1, 'João Silva', 2000, 'TI');
INSERT INTO funcionarios VALUES (2, 'Maria Santos', 6000, 'MKT');
INSERT INTO funcionarios VALUES (3, 'Carlos Oliveira', 5000, 'Faturamento');
INSERT INTO funcionarios VALUES (4, 'Ana Pereira', 10000, 'Tesouria');
INSERT INTO funcionarios VALUES (5, 'Pedro Rocha', 7500, 'Vendas');
INSERT INTO funcionarios VALUES (6, 'Mariana Lima', 8001, 'RH');
INSERT INTO funcionarios VALUES (7, 'Rodrigo Costa', 3999, 'Facilities');
INSERT INTO funcionarios VALUES (8, 'João Reis', 1500, 'ADM');

A sequência de comandos acima ilustra o cotidiano de um usuário realizando suas operações DML sem saber que está sendo monitorado. Agora, vamos conferir o relatório gerado para o auditor.

image 32
RETORNO AUDITORIA INSERT

Para visualizar o relatório gerado pela auditoria, utilizamos a seguinte consulta:

SQL
SELECT
    username,
    action_name,
    extended_timestamp,
    obj_name,
    sql_text
FROM
    dba_audit_trail
WHERE
    username = 'USR_BANGUELA';

Este relatório revela que o usuário USR_BANGUELA executou uma ação DML. O resultado inclui:

  • username: O nome do usuário que executou a ação (neste caso, USR_BANGUELA).
  • action_name: O tipo de ação realizada (neste caso, INSERT).
  • extended_timestamp: Data e hora em que a ação ocorreu.
  • obj_name: Nome do objeto afetado pela ação (neste caso, a tabela FUNCIONARIOS).
  • sql_text: O texto SQL da operação executada.

Vale ressaltar que a auditoria implementada neste laboratório captura todas as ações, independentemente de serem ‘commitadas’ ou não. No nosso caso, o usuário USR_BANGUELA ainda não executou um commit.

Outro ponto crucial é que, por ser um ambiente de teste, a auditoria foi configurada com o parâmetro ALL. Isso significa que todas as ações são detectadas e geram relatórios. Em um ambiente produtivo, onde o volume de movimentações é alto, essa configuração pode impactar negativamente a performance. Portanto, antes de implementar uma política de auditoria, é essencial definir claramente seus objetivos, conhecer bem seu ambiente e agir com eficiência.

Seguindo com o laboratório, vamos implementar a Auditoria Fina (FGA). Ao contrário do exemplo anterior, vamos filtrar o retorno da auditoria. Para isso, consideremos uma tabela EMPREGADOS com 25 registros e seus respectivos salários.

image 34
TABELA EMPREGADOS

A tabela EMPREGADOS contém registros com salários que variam de 2500 a 24000. Vamos configurar a auditoria para que retorne relatórios sempre que qualquer consulta buscar salários superiores a 12000. Ou seja, toda vez que qualquer usuário, inclusive o usuário SYS, realizar uma busca que retorne salários acima desse valor, será gerado um relatório.

Para isso, começaremos ativando a Auditoria Fina (FGA).

image 36
FGA ATIVADA

Para configurar a Auditoria Fina (FGA) e filtrar as consultas, utilizamos o comando a seguir:

PLSQL
BEGIN
  DBMS_FGA.add_policy(
    object_schema   => 'USR_BANGUELA',
    object_name     => 'EMPREGADOS',
    policy_name     => 'AUDIT_SALARIO',
    audit_condition => 'SALARY > 12000',
    audit_column    => 'SALARY');
END;
/

Este comando adiciona uma política de auditoria à tabela EMPREGADOS no esquema USR_BANGUELA. Vamos explicar cada parte:

  • object_schema: Especifica o esquema que contém o objeto auditado, neste caso, USR_BANGUELA.
  • object_name: Define o nome do objeto que será auditado, aqui é a tabela EMPREGADOS.
  • policy_name: Nome da política de auditoria que estamos criando, chamada de AUDIT_SALARIO.
  • audit_condition: Condição que, quando atendida, gera um relatório de auditoria. Aqui, a condição é SALARY > 12000, o que significa que qualquer consulta que retorne salários acima desse valor será auditada.
  • audit_column: Indica a coluna que será monitorada para atender à condição, neste caso, SALARY.

A partir de agora, toda vez que uma busca no banco atingir o critério imposto pela política de FGA, ou seja, quando retornar salários maiores que 12000, será gerado um apontamento. Caso contrário, o relatório não será gerado, e o usuário pode ficar tranquilo.

image 39
SELECT DEN
SQL
SELECT FIRST_NAME, LAST_NAME, SALARY FROM USR_BANGUELA.EMPREGADOS
WHERE FIRST_NAME = 'Den';

O que vemos acima é uma prova viva. Quando o usuário USR_BANGUELA executa uma busca que não fere os critérios impostos, nenhum relatório é gerado.

image 40
AUDITORIA SEM RETORNO
SQL
SELECT SQL_TEXT FROM DBA_FGA_AUDIT_TRAIL;

Sendo assim, o usuário pode dormir tranquilo. A ausência de apontamentos não significa que a auditoria não está funcionando. Para verificar se a política de auditoria está ativa e configurada corretamente, podemos usar o seguinte comando:

image 42
AUDITORIAS ATIVAS

Para verificar as políticas de auditoria ativas, podemos usar o seguinte comando:

SQL
SELECT policy_name, object_schema, object_name, policy_text
FROM dba_audit_policies;

Esse comando nos permite visualizar as políticas de auditoria que estão em vigor. Os campos retornados são:

  • POLICY_NAME: Nome da política de auditoria.
  • OBJECT_SCHEMA: Esquema onde o objeto auditado está localizado.
  • OBJECT_NAME: Nome do objeto auditado (por exemplo, a tabela).
  • POLICY_TEXT: Texto da política de auditoria, detalhando a condição e as colunas auditadas.

Na sequência, o usuário solicita o nome e o sobrenome de todos os empregados cadastrados.

image 44
TODOS OS EMPREGADOS
SQL
SELECT FIRST_NAME, LAST_NAME FROM USR_BANGUELA.EMPREGADOS;

E é exatamente isso que vemos acima. O usuário solicita um relatório que mostra todos os funcionários da empresa, mas, mesmo assim, nenhum relatório de auditoria é gerado.

image 46
AUDITORIA SEM RETORNO
SQL
SELECT SQL_TEXT FROM DBA_FGA_AUDIT_TRAIL;

Pode dormir tranquilo, USR_BANGUELA. Apesar de ter obtido um retorno de 25 linhas, ele não violou os critérios impostos. No entanto, essa situação mudará com o próximo comando:

image 47
SALÁRIO DA NANCY
SQL
SELECT FIRST_NAME, LAST_NAME, SALARY FROM USR_BANGUELA.EMPREGADOS
WHERE FIRST_NAME = 'Nancy';

E agora, sim, foi feito o apontamento. Apenas uma linha foi suficiente para gerar um registro de auditoria.

image 48
DETECTADO
SQL
SELECT SQL_TEXT FROM DBA_FGA_AUDIT_TRAIL;

A política de auditoria foi acionada porque houve uma consulta na tabela EMPREGADOS que acessou a coluna SALARY com uma condição que violou a política ao buscar um salário maior que 12.000. Isso gerou um registro na trilha de auditoria.

Condição de Auditoria: Mesmo que a condição SALARY > 12000 não esteja explicitamente na cláusula WHERE da consulta auditada, a auditoria verifica o valor de SALARY dos registros acessados. Se algum registro acessado atender à condição de auditoria, a política é acionada.

Assim como foi criada a FGA, vamos entender como removê-la.

image 50
DROP FGA
PLSQL
BEGIN
  DBMS_FGA.drop_policy(
    object_schema   => 'USR_BANGUELA',
    object_name     => 'EMPREGADOS',
    policy_name     => 'AUDIT_SALARIO'),
END;
/

Com o usuário USR_AUDITOR, encerramos o ciclo de auditoria. É importante entender que os apontamentos detectados anteriormente permanecem registrados. Caso novos selects sejam feitos em salários maiores que 12.000, não serão gerados novos apontamentos, pois a política de auditoria foi removida.

Conclusão

A auditoria é um pilar fundamental na proteção de dados e na conformidade com regulamentações de segurança. Implementada corretamente, ela não só permite monitorar e analisar o comportamento dos usuários, mas também assegura a integridade das informações armazenadas no banco de dados. No entanto, é essencial aplicar a auditoria de maneira estratégica e bem planejada. Evitar uma abordagem excessiva e começar com áreas críticas pode prevenir impactos negativos no desempenho do sistema e garantir a eficácia da monitoria. Com boas práticas e um ajuste contínuo das políticas de auditoria, podemos transformar a auditoria em uma ferramenta poderosa para garantir a segurança e a eficiência no gerenciamento dos dados. Agradecemos a leitura e incentivamos a interação: compartilhem suas experiências e dúvidas para continuarmos aprimorando o entendimento e a aplicação da auditoria em nossos ambientes Oracle.

Tercio Haring

Tercio Haring

Tércio Haring é pai do Max e um entusiasta incansável de TI. Sua paixão pelo próximo o levou a ser socorrista, sempre pronto para ajudar. No universo da tecnologia, seu objetivo vai além de simplesmente compartilhar conhecimento; ele busca manter sua mente conectada ao futuro e abraçar os desafios como oportunidades disfarçadas. Escreve com o objetivo de tornar o complexo mundo dos bancos de dados mais acessível e compreensível, sempre com um toque de humor para tornar a jornada mais leve e divertida. Se você procura insights valiosos, explicações claras e, claro, algumas boas risadas, Tércio é a pessoa certa para te guiar. Junte-se a ele para explorar, aprender e crescer nesse vasto e fascinante universo Oracle!

Deixe um comentário

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

Marcações:
plugins premium WordPress