然后,针对 EMPNO < 1,000 创建用于全部列的策略。 begin
dbms_fga.add_policy (
object_schema => 'ACCMAN',
object_name => 'EMP',
policy_name => 'EMP_SEL_POL',
statement_types => 'SELECT');
audit_option => 'EMPNO < 1000',
handler_module => 'ENQUEUE_MESSAGE'
);
end;
第三,给 MONICA 和 ADAM 添加特殊的策略。 begin
dbms_fga.add_policy (
object_schema => 'ACCMAN',
object_name => 'EMP',
policy_name => 'EMP_SEL_POL',
audit_column => 'SALARY, BONUS',
statement_types => 'SELECT');
audit_option => 'EMPNO >= 1000 AND SAL <= 1000 and USER IN
(''MONICA'', ''ADAM'') AND USER != ''SAP_PAYROLL_APP''',
handler_module => 'ENQUEUE_MESSAGE'
);
end;
正如您所看到的,audit_option 中的条件之间是相互排斥的,所以当用户尝试执行 SELECT 语句时,只有一个策略是有效的,也只有一条记录会被写入。
您可以使用该策略构建 FGA 策略集。 然后,您可以根据需要自由地启用或禁止策略,这不会影响操作。
问题 主要有以下四个问题:
- 当选择做出之后如果处理器模块(如果定义了)抛出错误,将会在 Oracle 不同版本中引起不同的行为:
- 在 Oracle9i 数据库中,处理器模块 以无提示的方式 停止对该行进行检索,不会报错。 因此,如果有 100 行,其中 4 行满足了审计条件,处理器模块运行四次,每次都会失败。 该查询将仅仅返回 96 行,而不报告任何错误,您将绝不会知道事情已经发生了。 很显然,这种做法会产生不精确的结果。
- 在 Oracle Database 10g 第 1 版中,处理器模块将忽略处理器模块中的错误,按照预期检索所有 100 行。
- 在 Oracle Database 10g 第 2 版中,处理器模块将报告执行查询的用户会话方面的错误,而不返回任何行,甚至不返回那些不满足审计条件而没有执行处理器函数的 96 行。
所以,在实施 FGA 处理器模块之前请先对其进行全面测试。
- 审计线索表——FGA_LOG$——在系统表空间中。 当更多的 FGA 条目产生时,空间表就填满了,这可能导致数据库运行中断。
- 审计线索被写入表中,不过是以异步方式进行的。 这会产生事务处理和 I/O,它将增加到数据库中的整体 I/O 中。 如果您的数据库是受 I/O 所限,您将看到实施 FGA 处理器模块后对整个数据库的性能影响。
- 您可以使用自治事务处理以异步方式编写审计线索。 所以,即使用户回滚该事物处理,也不会删除该线索条目,导致错误的正值. 如果您想将 FGA 用作一种简单的机制来识别用户,您应该注意这些错误的正值。
操作清单
- 识别敏感的表和列。
- 识别要访问的敏感度——例如,工资低于 500 的。
- 将所有可能的组合放在一张纸上,然后将这些组合合并成 WHERE 条件(谓词),在这种方式下,只要一个谓词就将满足任何给定的条件。
- 在那些谓词中构建 FGA 策略。
- 启动 FGA 策略。
- 之后,分析 FGA 审计线索文件。
- 制作清除计划,清除 FGA 线索表。
4.2 激活虚拟专用数据库
背景 如果您已经很熟悉应用程序环境和虚拟专用数据库(也称为行级安全性或细粒度访问控制),您可以跳过该节,直接查看策略节。
虚拟专用数据库 (VPD) 是一个很大的主题,因此我在这里只将一些基本的。 要了解背景知识,请参考我的 Oracle 杂志中有关该主题的 文章;您也可以在我的书里面找到关于 FGA 方面的更多信息。
假设您有一个称为 ACCOUNTS 的表,表中有以下数据: SQL> select * from rates;
ACCNO ACC_NAME ACC_BAL
---------- -------------------- ----------
1 John 1000
2 Jill 1500
3 Joe 1200
4 Jack 1300
您想确保只有得到适当授权的人才可以查阅授权范围的帐户余额。也就是说,级别 1 看到的余额应该小于 1,000,级别 2 看到的余额应该小于 1,200,级别 3 可以看到所有的余额。 您还有另一张显示用户和级别的表。 SQL> select * from tab;
USERNAME USERLEVEL
------------------------------ ----------
CLERK1 1
CLERK2 2
CLERK3 3
要存储用户首次登录时的用户级别,因此需要创建应用程序环境:
(编辑:aniston)
|