
细粒度的审计:
细粒度审计(FGA:Fine Grained Auditing)实现对特定行和列自定义审计。
作用:使用标准的审计,可以审计谁访问了哪些对象,但无法知道访问了哪些行或列。细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(或where子句),还指定了表中访问的列
操作:DML(INSERT、DELETE、UPDATE、SELECT)
性能:通过只在访问某些行和列时审计对表的访问,可以极大地减少审计表条目的数量
实现包:DBMS_FGA
审计存储:FGA_LOG$
权限:必须具有执行程序包DBMS_FGA的权限
FGA的管理:
查看启用情况:SELECT * FROM DBA_AUDIT_POLICIES;
查看结果:FGA_LOG$、DBA_FGA_AUDIT_TRAIL
删除:DELETE FROM FGA_LOG$;
细粒度审计与标准审计的差异:
参数:标准审计必须用参数AUDIT_TRAIL在数据库级启用。这个参数不是动态的,必须重启数据库来使其生效。相比而言,FGA 不需要任何参数修改
启用:标准审计一旦被设置在一个对象上,标准审计将保持在那里。要解除它,必须用 NOAUDIT 命令删除审计选项。在一个表上丢弃审计选项也将丢弃元数据信息。而FGA 可以临时禁用和启用,不丢失任何元数据信息
类型:FGA只能够处理四种类型的语句:SELECT、INSERT、UPDATE 和 DELETE。而常规审计可以处理其它许多语句和权限,甚至会话连接和断开
存储:标准审计可以写数据库表或 OS 文件,而FGA 日志仅写到数据库表 FGA_LOG$ 中
DBMS_FGA包:
作用:用于实现FGA
过程:ADD_POLICY、DROP_POLICY、DISABLE_POLICY、ENABLE_POLICY
ADD_POLICY:添加使用谓词和审计列的审计策略
DROP_POLICY:删除审计策略
DISABLE_POLICY:禁用审计策略,但保留与表或视图关联的策略
ENABLE_POLICY:启用策略
建立FGA:
过程:DBMS_FGA. ADD_POLICY
OBJECT_SCHEMA:待审计对象的用户的名称,默认为当前用户
OBJECT_NAME:待审计对象的名称
POLICY_NAME:FGA审计策略的唯一名称
AUDIT_CONDITION:限定被审计记录的表达式,NULL表示对任何记录的访问都会被审计
字符串:AUDIT_CONDITION => 'JOB_ID = ''AD_VP'''
数字:AUDIT_CONDITION => 'MIN_SALARY = 4200'
字符串:AUDIT_CONDITION =>
'HIRE_DATE < TO_DATE(''1990-09-09'',''yyyy-mm-dd'')'
组合:AUDIT_CONDITION => 'MIN_SALARY = 4200'
AUDIT_COLUMN:待审计列的列表,NULL表示对任何列的访问都会被审计
HANDLER_SCHEMA:达到审计条件的用户名称,默认为当前用户
HANDLER_MODULE:达到审计条件时所运行的PL/SQL过程
ENABLE:表示FGA审计策略有效
STATEMENT_TYPES:审计的语句类型,包括SELECT、INSERT、UPDATE或DELETE中的一种或多种类型。默认只涉及SELECT类型
AUDIT_TRAIL:控制是否将实际的SQL语句及其绑定变量写入FGA审计追踪。默认写入
AUDIT_COLUMN_OPTS:在某条语句涉及AUDIT_COLUMN实参中列出的任何列或所有列的情况下,确定是否进行审计。选项包括DBMS_FGA_ANY_COLUMNS (默认)以及DBMS_FGA_ALL_COLUMNS
示例:
EXEC DBMS_FGA.add_policy(object_schema => 'HR',
object_name => 'employees',
policy_name => 'pn',
audit_condition => 'email LIKE ''D%'' AND salary < 8000 AND hire_date > to_date(''2000-01-01'',''yyyy-mm-dd'')',
audit_column => 'FIRST_NAME,LAST_NAME',
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types =>'SELECT,INSERT,UPDATE,DELETE');
删除FGA策略:
信息:SELECT OBJECT_SCHEMA, OBJECT_NAME, POLICY_NAME
FROM DBA_AUDIT_POLICIES;
删除:
exec DBMS_FGA.drop_policy(object_schema => 'HR',
object_name => 'employees',
policy_name => 'a2');





