No post de hoje vou mostrar como criar uma auditoria simples no ambiente Oracle.
1- Definir roles com respectivos Usuários;
2- Definir os usuários que estarão nas roles;
3- Definir permissões que as roles podem ter;
-- Criando a role com respectivos papeis do teu ambiente:
CREATE ROLE LEITURA;
CREATE ROLE GRAVACAO;
-- Incluindo o usuário CESAR na role respectiva sempre com acessos restritivos
GRANT LEITURA TO CESAR;
GRANT GRAVACAO TO CESAR;
-- Incluindo permissões nas roles
GRANT SELECT PRODUCAO.COMPRAS TO LEITURA;
GRANT INSERT,UPDATE,DELETE ON PRODUCAO.COMPRAS GRAVACAO;
-- Verificando e habilitando auditoria salvando informações em uma database, pois podemos salvar em arquivo também:
sqlplus> show parameter audit;
sqlplus> none — desativado
sqlplus> alter system set audit_trail=db SCOPE=spfile;
sqlplus> shutdown immediate;
sqlplus> startup open;
sqlplus> show parameter audit;
sqlplus> db — habilitado
-- Auditoria de DDL
-- Exemplo onde CESAR é o schema
sqlplus> AUDIT ALL BY CESAR BY ACCESS;
sqlplus> AUDIT EXECUTE PROCEDURE BY CESAR BY ACCESS;
-- Agora temos uma procedure simples para auditar select, insert, update e delete no schema producao:
-- Nesta procedure todas as tabelas do schema PRODUCAO serão auditadas para insert, select, update e delete
-- Sera criado uma politica com o nome REGRA_AUDITORIA
CREATE OR REPLACE PROC_AUDITORIA IS
CURSOR GET_TAB IS
SELECT OWNER,OBJECT_NAME FROM DBA_OBJECTS
WHERE OWNER IN('PRODUCAO') -- PODE SER PASSADO VARIOS SCHEMAS SEPARADOS POR VIRGULA
AND OBJECT_TYPE IN ('TABLE','VIEW')
AND OBJECT_NAME NOT IN (
SELECT O.NAME
FROM
SYS.USER$ U,
SYS.OBJ$ O,
SYS.FGA$ F
WHERE
U.USER# = O.OWNER#
AND
F.OBJ# = O.OBJ#
);
BEGIN
FOR T IN GET_TAB LOOP
DBMS_FGA.ADD_POLICY(OBJECT_SCHEMA => T.OWNER,
POLICY_NAME => 'REGRA_AUDITORIA',
OBJECT_NAME => T.OBJECT_NAME,
STATEMENT_TYPES => 'INSERT, UPDATE, DELETE, SELECT');
END LOOP;
END;
-- VERIFICANDO OBJETOS AUDITADOS
SELECT OWNER,OBJECT_NAME FROM DBA_OBJECTS
WHERE OWNER IN('PRODUCAO')
AND OBJECT_TYPE IN ('TABLE','VIEW')
AND OBJECT_NAME NOT IN (
SELECT O.NAME
FROM
SYS.USER$ U,
SYS.OBJ$ O,
SYS.FGA$ F
WHERE
U.USER# = O.OWNER#
AND
F.OBJ# = O.OBJ#
);
SQL