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 notdisplay the
OBJECT_SCHEMA
column.
Column | Datatype | NULL | Description |
---|---|---|---|
OBJECT_SCHEMA | VARCHAR2(30) | NOT NULL | Owner of the table or view |
OBJECT_NAME | VARCHAR2(30) | NOT NULL | Name of the table or view |
POLICY_NAME | VARCHAR2(30) | NOT NULL | Name of the policy |
POLICY_TEXT | VARCHAR2(4000) | Audit condition | |
POLICY_COLUMN | VARCHAR2(30) | Relevant column | |
PF_SCHEMA | VARCHAR2(30) | Owner of the audit handler function | |
PF_PACKAGE | VARCHAR2(30) | Name of the package containing the audit handler function | |
PF_FUNCTION | VARCHAR2(30) | Name of the audit handler function | |
ENABLED | VARCHAR2(3) | Indicates whether the policy is enabled ( disabled ( | |
SEL | VARCHAR2(3) | Indicates whether the policy is applied to queries on the object ( | |
INS | VARCHAR2(3) | Indicates whether the policy is applied to statements on the object ( | |
UPD | VARCHAR2(3) | Indicates whether the policy is applied to statements on the object ( | |
DEL | VARCHAR2(3) | Indicates whether the policy is applied to statements on the object ( | |
AUDIT_TRAIL | VARCHAR2(11) | Indicates whether the policy ( | |
POLICY_COLUMN_OPTION | VARCHAR2(11) | Indicates whether all columns in the parameter (
for triggering fine-grained auditing |
- 标准审计必须用参数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程序包上的运行权限。