学无止境
分类: Oracle
2013-09-18 11:02:07
细粒度审计简称FGA
细粒度审计基于内容监视数据访问,可以审计SELECT和DML语句。
用DBMS_FGA包管理,可以一定一些策略,审计事件触发程序执行。
数据库审计并没有记录操作语句,使用FGA审计可以捕获执行了什么SQL语句。
和基于值的审计不同,FGA审计不使用触发器,它的开销和数据库审计开销差不多,对系统性能影响较小。
FGA审计自动关注语句级别,一条SELECT语句查询上千条记录,只有1条审计记录。
FGA策略
定义审计标准和审计活动。使用DBMS_FGA.ADD_POLICY创建。
审计条件中包含department_id=10的select语句。
dbms_fga.add_policy (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'audit_emps_salary',
audit_condition=> 'department_id=10',
audit_column => 'salary',
handler_schema => 'secure',
handler_module => 'log_emps_salary',
enable => TRUE,
statement_types=> 'select' );
audit_column字段定义只有当SELECT语句中会访问到包含该字段的行时才审计,如果忽略该设置,只有当department_id=10条件时才审计。
audit_condition和audit_column都设置时,当select语句访问了条件为audit_condition的设置,包含audit_column字段时才会审计。
例如:
以下2条语句都会审计:
SELECT count(*)
FROM hr.employees
WHERE department_id = 10
AND salary > v_salary;
SELECT salary
FROM hr.employees;
以下这条语句不审计,但如果没有设置audit_column,该语句会审计。
SELECT last_name
FROM hr.employees
WHERE department_id = 10;
handler设置审计事件发生时执行的程序,secure.log_emps_salary。
需要先建立好secure.log_emps_salary过程
该过程例子如:
create or replace procedure secure.log_emps_salary (schema_name varchar2,table_name varchar2, policy varchar2)
is
begin
执行内容
end;
/
这里需要注意的是,如果在执行内容中进行insert记录到其它表类似这样的操作,最后不要加commit,这样会导致ORA-600 [4412]错误,这是由于Bug号:6407682引起的。
*在10.2.0.4中修复
FGA审计的相关数据字典视图:
DBA_FGA_AUDIT_TRAIL 记录所有的审计事件,FGA审计主要检查该表。
ALL_AUDIT_POLICIES 当前用户可以访问的所有对象的FGA审计策略
DBA_AUDIT_POLICIES 数据库的FGA审计策略
USER_AUDIT_POLICIES 当前用户对象的FGA审计策略
DBMS_FGA的包包含以下子过程:
ADD_POLICY 创建一个新的策略
DROP_POLICY 删除一个策略
ENABLE_POLICY 激活一个策略
DISABLE_POLICY 禁用一个策略
后3个子过程内只包含object_schema,object_name,policy_name三个参数。