1.细粒度审计

细粒度审计允许将单个的SELECT语句联同用户提交的确切语句一起进行审计。除了简单的跟踪语句之外,FGA还通过在每次用户选择特定的数据集时执行一段代码,提供了一种方法来模拟用于SELECT语句的触发器。可按表或视图中的单个列设置重点的FGA审计选项,FGA审计选项设置可设置为条件选项,以便只在符合特定管理员定义的规范时才捕获审计。FGA支持多个相关列。默认情况下,如果其中任何一列出现在SQL语句中,就会审计该列。通过使用DBMS_FGA.ALL_COLUMNS和DBMS_FGA.ANY_COLUMNS,根据句中是否使用了任何或全部相关列来进行审计.

2.使用细粒度审计

基于行的精细化审计

1)首先赋予某一用户,如huyong执行程序包dbms_fga权限,如下:

SQL> conn /as sysdba;
Connected.

SQL> grant execute on dbms_fga to huyong;

Grant succeeded.

SQL> 

2)添加一条审计记录,对HR用户下的EMPLOYEES中的EMPLOYEE_ID=100这一行进行审计:

SQL> conn huyong/huyong;
Connected.
SQL> begin
  2   dbms_fga.add_policy(
  3   object_schema      =>'HR',
  4   object_name        =>'EMPLOYEES',
  5   policy_name        =>'audit_emp_salary',
  6   audit_condition    =>'EMPLOYEE_ID=100',
  7   enable             =>true,
  8   statement_types    =>'select,update,delete');
  9  end;
 10  /

PL/SQL procedure successfully completed.

SQL>

3)验证是否被审计

SQL> select count(*) from fga_log$;

  COUNT(*)
----------
         0

执行如下语句:

SQL> conn HR/hr;
Connected.
SQL> select EMPLOYEE_ID,LAST_NAME,DEPARTMENT_ID,SALARY
  2  from EMPLOYEES where EMPLOYEE_ID=100;

EMPLOYEE_ID LAST_NAME                 DEPARTMENT_ID     SALARY
----------- ------------------------- ------------- ----------
        100 King                                 90      24000

验证是否被审计:

SQL> conn /as sysdba;
Connected.
SQL> select count(*) from fga_log$;

  COUNT(*)
----------
         1

SQL> select timestamp,db_user,os_user,object_schema,object_name,sql_text
  2  from dba_fga_audit_trail;

TIMESTAMP DB_USER    OS_USER    OBJECT_SCH OBJECT_NAME      SQL_TEXT
--------- ---------- ---------- ---------- --------------------                        ----------------------------------------
13-MAR-14 HR         oracle     HR         EMPLOYEES     select EMPLOYEE_ID,LAST_NAME,DEPARTMENT_
 ID,SALARY   from EMPLOYEES where  
EMPLOYEE_ID=100
SQL>

4)删除策略

SQL> conn huyong/huyong;
Connected.
SQL> begin
  2   dbms_fga.drop_policy('HR','EMPLOYEES','audit_emp_salary');
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>

5)验证是否删除

SQL> conn HR/hr;
Connected.

SQL> update employees set salary=10000 where employee_id=100;

1 row updated.

SQL> commit;

Commit complete.

SQL> conn /as sysdba;
Connected.
SQL> select count(*) from dba_fga_audit_trail;    --还是之前的一条记录

  COUNT(*)
----------
         1

SQL>

基于列的精细化审计

1)添加一条审计记录,审计操作hr用户下的employees表中的salary执行DML语句时进行审计

SQL> conn huyong/huyong;
Connected.
SQL> begin
  2   dbms_fga.add_policy(
  3   object_schema     =>'HR',
  4   object_name       =>'EMPLOYEES',
  5   policy_name       =>'audit_sal',
  6   audit_column      =>'salary',
  7   enable            =>true,
  8   statement_types   =>'select,update,delete');
  9  end;
 10  /

PL/SQL procedure successfully completed.

 

2)验证是否被审计

SQL> truncate table fga_log$;      --截断表fga_log$

Table truncated.

 

SQL>CONN HR/HR

SQL> select EMPLOYEE_ID,LAST_NAME,DEPARTMENT_ID from employees;

查看是否审计:

SQL> select timestamp,db_user,os_user,object_schema,object_name,sql_text
  2  from dba_fga_audit_trail;

TIMESTAMP DB_USER    OS_USER    OBJECT_SCH OBJECT_NAME
--------- ---------- ---------- ---------- --------------------
SQL_TEXT
----------------------------------------
no rows selected

--由于没有访问salary列,故没有没有审计信息;

执行如下语句:

SQL> conn hr/hr;
Connected.

SQL> select EMPLOYEE_ID,LAST_NAME,DEPARTMENT_ID,SALARY from employees;

查看是否有审计记录:

SQL> conn /as sysdba;
Connected.
SQL> select timestamp,db_user,os_user,object_schema,object_name,sql_text
  2  from dba_fga_audit_trail;

TIMESTAMP DB_USER    OS_USER    OBJECT_SCH OBJECT_NAME
--------- ---------- ---------- ---------- --------------------
SQL_TEXT
----------------------------------------

13-MAR-14 HR         oracle     HR         EMPLOYEES
select EMPLOYEE_ID,LAST_NAME,DEPARTMENT_
ID,SALARY from employees
SQL>

3)删除审计策略

SQL> conn huyong/huyong
Connected.
SQL> begin
  2   dbms_fga.drop_policy('HR','EMPLOYEES','AUDIT_SAL');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL>

3.FGA数据字典视图

FGA策略的定义位于数据字典视图DBA_AUDIT_POLICIES中。

审计线索收集在SYS拥有的表FGA_LOG$中。对于SYS拥有的任何原始表,此表上的某些视图以对用户友好的方式显示信息。DBA_FGA_AUDIT_TRAIL是该表上的一个视图。

一个重要的列是SQL_BIND,它指定查询中使用的绑定变量的值,这是显著增强该工具功能的一项信息。

另一个重要的列是SCN,当发生特定的查询时,它记录系统更改号。

--FGA不仅可以记录对表的访问,也可以对数据仓库使用FGA,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。不需要到v$SQL视图去获取这些信息。即使SQL语句已经超出了v$SQL的期限,在FGA审计线索中将会始终提供它。

--由于FGA捕获绑定变量,它可以帮助您了解绑定变量值的模式,这有助于设计直方图集合等。

--处理器模块可以向审计者或DBA发送警告,这有助于跟踪恶意应用程序。

--由于FGA可以作为select语句的触发器,您可以在需要这种功能的任何时候使用它。

FGA在Oracle数据库中支持隐私和职能策略。因为审计发生在数据库内部而不是应用程序中,所以无论用户使用的访问方法是什么,都对操作进行审计。

数据字典视图DBA_AUDIT_POLICIES中重要的列:

ALL_AUDIT_POLICIES

ALL_AUDIT_POLICIES describes the fine-grained auditing policies on the tables and views accessible to the current user.

Related Views

  • DBA_AUDIT_POLICIES describes all fine-grained auditing policies in the database.

  • USER_AUDIT_POLICIES describes the fine-grained auditing policies on the tables and views owned by the current user. This view does not 

    display the OBJECT_SCHEMA column.

ColumnDatatypeNULLDescription
OBJECT_SCHEMAVARCHAR2(30)NOT NULLOwner of the table or view
OBJECT_NAMEVARCHAR2(30)NOT NULLName of the table or view
POLICY_NAMEVARCHAR2(30)NOT NULLName of the policy
POLICY_TEXTVARCHAR2(4000)Audit condition
POLICY_COLUMNVARCHAR2(30)Relevant column
PF_SCHEMAVARCHAR2(30)Owner of the audit handler function
PF_PACKAGEVARCHAR2(30)

Name of the package containing the audit handler 

function

PF_FUNCTIONVARCHAR2(30)Name of the audit handler function
ENABLEDVARCHAR2(3)

Indicates whether the policy is enabled (YES) or 

disabled (NO)

SELVARCHAR2(3)

Indicates whether the policy is applied to queries on

the object (YES) or not (NO)

INSVARCHAR2(3)

Indicates whether the policy is applied to INSERT

statements on the object (YES) or not (NO)

UPDVARCHAR2(3)

Indicates whether the policy is applied to UPDATE

statements on the object (YES) or not (NO)

DELVARCHAR2(3)

Indicates whether the policy is applied to DELETE

statements on the object (YES) or not (NO)

AUDIT_TRAILVARCHAR2(11)

Indicates whether the SQL_TEXT and SQL_BIND columns in the fine-grained audit trail are populated for this 

policy (DB_EXTENDED) or not (DB)

POLICY_COLUMN_OPTIONVARCHAR2(11)

Indicates whether all columns in the AUDIT_COLUMN

parameter (ALL_COLUMNS) or any of the columns in the 

AUDIT_COLUMN parameter (ANY_COLUMNS) are considered

for triggering fine-grained auditing

4.FGA审计与标准审计的差异
  • 标准审计必须用参数audit_trail在数据库级启用。这个参数不是动态的;必须重启数据库来使其生效。相比而言,FGA不需要任何参数修改;
  • 一旦被设置在一个对象上,标准审计将保存在那里。要解除它,必须用noaudit命令删除审计选项。这可能很不方便,因为在一个表上丢弃审计选项也将丢弃元数据信息。然而,FGA可以临时禁用和启用,不丢弃任何元数据信息。
  • FGA只能够处理四种类型的语句:SELECT、INSERT、UPDATE、DELETE。相比而言,常规审计可以处理其他许多语句和权限,甚至会话连接和断开。
  • 标准审计每次会话只创建一条记录(按会话)或每次访问对象创建一条记录(按访问)这种占用资源很少的方式对于控制审计线索表中的空间非常重要。FGA并不是同样节省资源;它每次访问运行一次,使得线索更大。
  • 通过记录线索,标准审计可以用来检测任何中断企图,如果企图不成功,则将产生错误代码;而FGA不能。
  • 标准审计可以写入数据库表或OS文件。后者在审计员(不是数据库管理员)能够访问线索时非常有用。在Windows下,非数据库审计线索记录在事件日志中,并且可以用不同的方式对其进行访问。这个选项保护了审计线索的完整性。然而,FGA日志仅写到数据库表FGA_LOG$中。可以在FGA中创建用户自定义的审计处理程序来写OS文件,但它们的完整性不能保证。
  • 标准审计可以设置用于默认对象。当表是在运行期创建时,这个功能变得极为有用:默认的审计选项允许没有数据库管理员干预的审计。这在FGA中是不可能的,用户必须在一个现有的表上创建策略,上述的情况只能在表已创建之后才可能发生。
  • 在FGA中,审计更加灵活,仅当访问某些列,当某个特定的条件为真时等等。这种多功能性在需要控制线所得增长时非常方便。
  • 在FGA中,SQL赋值变量默认被捕获。在标准审计中,必须把初始化参数audit_trail设为db_extended,以启用这一功能。

  • 权限差异:标准审计需要审计系统或语句权限;FGA只需要dbms_fga程序包上的运行权限。