Oracle之FGA 策略(细粒度审计)的研究
【IT168 技术文档】
增加 FGA 策略
审计表
GRANT RESOURCE,CONNECT TO BANK IDENTIFIED BY BANK;
![]()
CREATE TABLE BANK.ACCOUNTS
(
ACCT_NO NUMBER PRIMARY KEY,
CUST_ID NUMBER NOT NULL ,
BALANCE NUMBER(15,2) NULL
);
insert into bank.accounts values(1,1,10000);
insert into bank.accounts values(2,2,20000);
commit;
![]()
Begin
dbms_fga.drop_policy (
object_schema=>;'BANK',
object_name=>;'ACCOUNTS',
policy_name=>;'ACCOUNTS_ACCESS');
dbms_fga.add_policy (
object_schema=>;'BANK',
object_name=>;'ACCOUNTS',
policy_name=>;'ACCOUNTS_ACCESS');
end;
/
![]()
select * from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;
![]()
审计列和审计条件, 在add_policy中加入
audit_column =>; 'BALANCE'
audit_condition =>; 'BALANCE >;= 11000'
Begin
dbms_fga.drop_policy (
object_schema=>;'BANK',
object_name=>;'ACCOUNTS',
policy_name=>;'ACCOUNTS_ACCESS');
![]()
dbms_fga.add_policy (
object_schema=>;'BANK',
object_name=>;'ACCOUNTS',
audit_column =>; 'BALANCE',
audit_condition =>; 'BALANCE >;= 11000',
policy_name=>;'ACCOUNTS_ACCESS');
end;
/
![]()
这个不可用,Why?
select BALANCE from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;
管理 FGA 策略
要删除策略,您可以使用以下语句:
begin
dbms_fga.drop_policy (
object_schema =>; 'BANK',
object_name =>; 'ACCOUNTS',
policy_name =>; 'ACCOUNTS_ACCESS'
);
end;
/
对于更改策略而言,没有随取随用的解决方案。要更改策略中的任何参数,必须删除策略,再使用更改后的参数添加策略。
需要临时禁用审计收集 — 例如,如果您希望将线索表移动到不同的表空间或者要删除线索表。您可以按如下方法禁用 FGA 策略:
begin
dbms_fga.enable_policy (
object_schema =>; 'BANK',
object_name =>; 'ACCOUNTS',
policy_name =>; 'ACCOUNTS_ACCESS',
enable =>; FALSE
);
end;
/
重新启用很简单 enable =>; TRUE
演示何时审计操作以及何时不审计操作的各种情况 SQL 语句 审计状态
select balance from accounts; 进行审计。用户选择了在添加策略时所指定的审计列 BALANCE。
select * from accounts; 进行审计。即使用户没有明确指定列 BALANCE,* 也隐含地选择了它。
select cust_id from accounts where balance < 10000; 进行审计。即使用户没有明确指定列 BALANCE,where 子句也隐含地选择了它。
select cust_id from accounts; 不进行审计。用户没有选择列 BALANCE。
select count(*) from accounts; 不进行审计。用户没有明确或隐含地选择列 BALANCE。
处理器模块
FGA 的功能不只是记录审计线索中的事件;FGA 还可以任意执行过程。
过程可以执行一项操作,比如当用户从表中选择特定行时向审计者发送电子邮件警告,或者可以写到不同的审计线索中。
这种存储代码段可以是独立的过程或者是程序包中的过程,称为策略的处理器模块。
实际上由于安全性原因,它不必与基表本身处于同一模式中,您可能希望特意将它放置在不同的模式中。
由于只要 SELECT 出现时过程就会执行,非常类似于 DML 语句启动的触发器,您还可以将其看作 SELECT 语句触发器。
以下参数指定将一个处理器模块指定给策略:
handler_schema 拥有数据过程的模式
handler_module 过程名称
处理器模块还可以采用程序包的名称来代替过程名称。在这种情况下,参数 handler_module 在 package.procedure 的格式中指定。
FGA 数据字典视图
FGA 策略的定义位于数据字典视图 DBA_AUDIT_POLICIES 中。表 2 包含该视图中一些重要列的简短描述。
审计线索收集在 SYS 拥有的表 FGA_LOG$ 中。对于 SYS 拥有的任何原始表,此表上的某些视图以对用户友好的方式显示信息。DBA_FGA_AUDIT_TRAIL 是该表上的一个视图。
一个重要的列是 SQL_BIND,它指定查询中使用的绑定变量的值 — 这是显著增强该工具功能的一项信息。
另一个重要的列是 SCN,当发生特定的查询时,它记录系统更改号。
此信息用于识别用户在特定时间看到了什么,而不是现在的值,它使用了闪回查询,这种查询能够显示在指定的 SCN 值时的数据。
视图和 FGA
到目前为止我已经讨论了在表上应用 FGA;现在让我们来看如何在视图上使用 FGA。假定在 ACCOUNTS 表上定义视图 VW_ACCOUNTS 如下:
create view bank.vw_accounts as select * from bank.accounts;
select * from bank.vw_accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;
如果您只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。
通过将视图名称而不是表的名称传递给打包的过程 dbms_fga.add_policy 中的参数 object_name,可以完成这项工作。
随后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列将显示视图的名称,并且不会出现有关表访问的附加记录。
其它用途
除了记录对表的选择访问,FGA 还可用于某些其它情况:
您可以对数据仓库使用 FGA,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。您不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。
由于 FGA 捕获绑定变量,它可以帮助您了解绑定变量值的模式,这有助于设计直方图集合等。
处理器模块可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。
由于 FGA 可以作为 SELECT 语句的触发器,您可以在需要这种功能的任何时候使用它。
结论
FGA 使您在 Oracle 数据库中支持隐私和职能策略。因为审计发生在数据库内部而不是应用程序中,所以无论用户使用的访问方法是什么(通过诸如 SQL*Plus 等工具或者应用程序),都对操作进行审计,允许进行非常简单的设置。
