细粒度的审计(应用审计)
从Oracle9i开始,通过引入细粒度的对象审计,或称为FGA,审计变得更为关注某个方面,并且更为精确。由称为DBMS_FGA的PL/SQL程序包实现FGA。
使用标准的审计,可以轻松发现访问了哪些对象以及由谁访问,但无法知道访问了哪些行或列。细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(或where子句),还指定了表中访问的列。通过只在访问某些行和列时审计对表的访问,可以极大地减少审计表条目的数量。
程序包DBMS_FGA具有4个过程:
ADD_POLICY | 添加使用谓词和审计列的审计策略 |
DROP_POLICY | 删除审计策略 |
DISABLE_POLICY | 禁用审计策略,但保留与表或视图关联的策略 |
ENABLE_POLICY | 启用策略 |
用户TAMARA通常每天访问HR.EMPLOYEES表,查找雇员的电子邮件地址。系统管理员怀疑TAMARA正在查看经理们的薪水信息,因此他们建立一个FGA策略,用于审计任何经理对SALARY列的任何访问:
begin
dbms_fga.add_policy(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'SAL_SELECT_AUDIT',
audit_condition => 'instr(job_id,''_MAN'') > 0',
audit_column => 'SALARY'
);
end;
可以使用数据字典视图DBA_FGA_AUDIT_TRAIL访问细粒度审计的审计记录。如果一般需要查看标准的审计行和细粒度的审计行,则数据字典视图DBA_COMMON_AUDIT_TRAIL结合了这两种审计类型中的行。
继续看示例,用户TAMARA运行了如下两个SQL查询:
SQL> select employee_id, first_name, last_name, email from hr.employees
2 where employee_id = 114;
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL
----------- ------------------ --------------------- --------------
114 Den Raphaely DRAPHEAL
1 row selected.
SQL> select employee_id, first_name, last_name, salary from hr.employees
2 where employee_id = 114;
EMPLOYEE_ID FIRST_NAME LAST_NAME SALARY
----------- ------------------ ----------------------- ----------
114 Den Raphaely 11000
1 row selected.
第一个查询访问经理信息,但没有访问SALARY列。第二个查询与第一个查询相同,但是访问了SALARY列,因此触发了FGA策略,从而在审计跟踪中生成了一行:
SQL> select to_char(timestamp,'mm/dd/yy hh24:mi') timestamp,
2 object_schema, object_name, policy_name, statement_type
3 from dba_fga_audit_trail
4 where db_user = 'TAMARA';
TIMESTAMP OBJECT_SCHEMA OBJECT_NAME POLICY_NAME STATEMENT_TYPE
-------------- ------------- ------------- ---------------- --------------
08/12/07 18:07 HR EMPLOYEES SAL_SELECT_AUDIT SELECT
1 row selected.