现实中的细粒度审计(2)
管理 FGA 策略
在前文中您看到了如何添加 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。
处理器模块
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 是该表上的一个视图。表 3 包含该视图中重要列的简短描述。
一个重要的列是 SQL_BIND,它指定查询中使用的绑定变量的值 — 这是显著增强该工具功能的一项信息。
另一个重要的列是 SCN,当发生特定的查询时,它记录系统更改号。此信息用于识别用户在特定时间看到了什么,而不是现在的值,它使用了闪回查询,这种查询能够显示在指定的 SCN 值时的数据。我将在本系列的第 2 部分中详细说明这种功能强大的特性。
视图和 FGA
到目前为止我已经讨论了在表上应用 FGA;现在让我们来看如何在视图上使用 FGA。假定在 ACCOUNTS 表上定义视图 VW_ACCOUNTS 如下:
create view vw_aclearcase/" target="_blank" >ccounts as select * from accounts;
现在,如果用户从视图中而不是从表中进行选择:
select * from vw_accounts;
您将看到以下审计线索:
select object_name, sql_text from dba_fga_audit_trail; OBJECT_NAME SQL_TEXT ----------- ------------------------------------------------- ACCOUNTS select * from vw_accounts
注意,是基表名称而不是视图名称出现在 OBJECT_NAME 列中,因为视图中的选择是从基表中进行选择。但是,SQL_TEXT 列记录了用户提交
的实际语句,而这正是您希望了解的。
如果您只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。通过将视图名称而不是表的名称传递给打包的过程 dbms_fga.add_policy 中的参数 object_name,可以完成这项工作。随后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列将显示视图的名称,并且不会出现有关表访问的附加记录。
其它用途
除了记录对表的选择访问,FGA 还可用于某些其它情况:
结论
FGA 使您在 Oracle 数据库中支持隐私和职能策略。因为审计发生在数据库内部而不是应用程序中,所以无论用户使用的访问方法是什么(通过诸如 SQL*Plus 等工具或者应用程序),都对操作进行审计,允许进行非常简单的设置。
下一次我将讨论高级 FGA 技术以及 Oracle Database 10g 中的新特性,这些特性使 FGA 的功能极为强大,适用于所有类型的审计情况。
Arup Nanda (arup@proligence.com) 是 IntelliClaim 的首席数据库设计人员,该公司位于 Connecticut 的 Norwalk,提供对卫生保健保险索赔管理高度安全和基于规则的优化。他是 2003 年度 Oracle DBA 奖的获得者,并与他人合作编著了即将出版的 Oracle 隐私安全性审计(Rampant TechPress 出版,2003)。
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。 |
表 2:数据字典视图 DBA_AUDIT_POLICIES 中重要的列
OBJECT_SCHEMA | 对其定义了 FGA 策略的表或视图的所有者 |
OBJECT_NAME | 表或视图的名称 |
POLICY_NAME | 策略的名称 — 例如,ACCOUNTS_ACCESS |
POLICY_TEXT | 在添加策略时指定的审计条件 — 例如,BALANCE >= 11000 |
POLICY_COLUMN | 审计列 — 例如,BALANCE |
ENABLED | 如果启用则为 YES,否则为 NO |
PF_SCHEMA | 拥有策略处理器模块的模式(如果存在) |
PF_PACKAGE | 处理器模块的程序包名称(如果存在) |
PF_FUNCTION | 处理器模块的过程名称(如果存在) |
表 3:DBA_FGA_AUDIT_TRAIL 视图中重要的列
SESSION_ID | 审计会话标识符;与 V$SESSION 视图中的会话标识符不同 |
TIMESTAMP | 审计记录生成时的时间标记 |
DB_USER | 发出查询的数据库用户 |
OS_USER | 操作系统用户 |
USERHOST | 用户连接的机器的主机名 |
CLIENT_ID | 客户标识符(如果由对打包过程 dbms_session.set_identifier 的调用所设置) |
EXT_NAME | 外部认证的客户名称,如 LDAP 用户 |
OBJECT_SCHEMA | 对该表的访问触发了审计的表所有者 |
OBJECT_NAME | 对该表的 SELECT 操作触发了审计的表名称 |
POLICY_NAME | 触发审计的策略名称(如果对表定义了多个策略,则每个策略将插入一条记录。在此情况下,该列显示哪些行是由哪个策略插入的。) |
SCN | 记录了审计的 Oracle 系统更改号 |
SQL_TEXT | 由用户提交的 SQL 语句 |
SQL_BIND | 由 SQL 语句使用的绑定变量(如果存在) |