Monday, June 6, 2011

DBMS_FGA - ORACLE FINE GRAINED AUDITING

Suppose your boss calls you one day and tells you that there has been some unexpected changes in the employee database.Employee's designation, their salary are being manipulated illegally.Such things have been continuing from a past few days and he asks if you could help getting hold of the culprit.
Don't worry Oracle's DBMS_FGA package will save your day and earn you a raise in your job.

The Oracle DBMS_FGA package provides fine grained auditing on objects.


To have an overview of the summary of dbms_fga subprograms visit :

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_fga.htm#i1011920

In this article I am going to add a policy on a table FGA_TEST in the SCOTT schema.
The policy will report on any dml actions on this table affecting its 2 columns 'esal' and 'designation'.
Another user HACKER will execute dml queries on this table and we will try and investigate whether the actions of the HACKER are reported.
The corresponding event handler of this policy will be in a 3rd schema FGA_HANDLER .we will also find out if the audit event was handled properly.

Note: Here it is worthwhile mentioning that the DBMS_FGA package can be used not only to audit records in case of data manipulation(DML) but also in cases where data might have been simply viewed depending upon the policy we define. eg:- in case of selecting particular records from a database table.

SQL> show user;
USER is "SCOTT"



First of all let us create a new schema FGA_HANDLER which will contain the event handler .


SQL> create user fga_handler identified by fga_handler;

User created.

SQL> grant resource,connect to fga_handler;

Grant succeeded.



Now, let us create a new table ,FGA_TEST in SCOTT schema, on which we will enforce the audit conditions(policy) with the help of the DBMS_FGA package.


SQL> create table fga_test
2 (empno number,
3 empname varchar2(30),
4 esal number,
5 designation varchar2(20)
6 );

Table created.



Let us insert some dummy rows in it now.


SQL> insert into FGA_TEST
2 SELECT 1,'dwaipayan',20000,'programmer' from dual
3 union all
4 select 2,'dhruva',30000,'analyst' from dual
5 union all
6 select 3,'shiba',40000,'manager' from dual
7 ;

3 rows created.

SQL> select * from fga_test;

EMPNO EMPNAME ESAL DESIGNATION
---------- ------------------------------ ---------- --------------------
1 dwaipayan 20000 programmer
2 dhruva 30000 analyst
3 shiba 40000 manager



Given below are the parameters of the ADD_POLICY Procedure:
Now, let us add a policy on our FGA_TEST table such that whenever any user tries to insert, update or delete the ‘esal’ or the ‘designation’ columns of any row of FGA_TEST table ,the action will be recorded.



BEGIN
DBMS_FGA.ADD_POLICY (
object_schema => 'SCOTT',
object_name => 'FGA_TEST',
policy_name => 'FGA_TEST_POLICY',
audit_condition => NULL,
audit_column => 'ESAL,DESIGNATION',
handler_schema => 'FGA_HANDLER',
handler_module => 'sp_audit',
enable => true,
statement_types => ‘INSERT,UPDATE,DELETE’
);
end;

Note: the default 'statement_types' is 'SELECT'

Now, sp_audit is the audit procedure, which will act as the alerting mechanism for the administrator.

The required interface for such a procedure is as follows:
PROCEDURE ( object_schema VARCHAR2, object_name VARCHAR2, policy_name VARCHAR2 ) AS ....
Now, let us connect to the FGA_HANDLER schema and design the
the sp_audit procedure.

First let us create the table where the sp_audit procedure will dump the data into.


SQL> conn fga_handler/fga_handler;
Connected.

SQL> create table audit_event
2 (audit_event_no number);

Table created.


We create the sp_audit procedure as follows:



SQL> create or replace procedure sp_audit
(object_schema in varchar2,
object_name in varchar2,
policy_name in varchar2
)
as
count number;
begin

select nvl(max(audit_event_no),0) into count from audit_event;

insert into audit_event
values
(count+1);
commit;

end;


The procedure simply adds a record to the audit_event table each time it is executed and the column audit_event_no acts as counter which displays the number of times the proc has been executed.

Now, finally we create another schema ‘HACKER’ which tries to manipulate the values of the ‘esal’ or ‘designation’ columns of the FGA_TEST table.


SQL> create user hacker identified by hacker;
User created.

SQL> grant resource,connect to hacker;
Grant succeeded.

SQL> grant all on fga_test to hacker;
Grant succeeded.
Now we log onto HACKER and try to change the ‘designation’ of ‘dwaipayan’ from ‘Programmer’ to ‘manager’

SQL> conn hacker/hacker;
Connected.

SQL> update scott.fga_test set designation='manager' where empname='dwaipayan';

1 row updated.



Now, we connect with SCOTT to see the dba_fga_audit_trail view to find if the event was recorded.


SQL> select DB_USER,OS_USER,POLICY_NAME,SQL_TEXT,
TIMESTAMP from dba_fga_audit_trail
where POLICY_NAME='FGA_TEST_POLICY';







DB_USER OS_USER POLICY_NAME SQL_TEXT TIMESTAMP
HACKER HOME-6C286D743C\Dwaipayan FGA_TEST_POLICY update scott.fga_test
set
designation
= 'manager'
where
empname='dwaipayan'
5-Jun-11



Now we connect to the FGA_HANDLER schema to see if the event handler(sp_audit) was called:


SQL> conn fga_HANDLER/fga_handler;
Connected.
SQL> select * from audit_event;

AUDIT_EVENT_NO
--------------
1



We execute the following from HACKER schema:

SQL>update SCOTT.FGA_TEST set designation='HR' where name='shiba';
SQL> conn fga_HANDLER/fga_handler;
Connected.
SQL> select * from audit_event;


AUDIT_EVENT_NO
--------------
1
2



Note: I have just created the sp_audit procedure to add rows to the audit_event table in this testing environment but in a ideal production scenario, we are likely to send emails or Page instead.


No comments:

Post a Comment