电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

现实问题的细粒度审计,第 3 部分


发布日期:2022/12/17
 

在本系列的前两个部分中我向您介绍了细粒度审计 (FGA) 的概念它用来在 Oraclei Database 和更高版本中跟蹤选定的语句我还说明了如何在复杂的环境中(比如说在一个 Web 应用程序内部)通过应用程序上下文和客户端标识符来使用这个特性这两篇文章为您提供了足够的信息使您可以为几乎所有类型的数据库系统(无论它有多复杂)构建一个 FGA 设置程序在这个第三部分同时也是最后一部分中我将说明 Oracle Database g 为表带来的 FGA 增强

Oraclei Database 中的 FGA

让我们简要地重述一下 FGA 的好处关于完整的讨论请参考本系列的第 部分和第 部分

正规审计(通过 AUDIT 语句)记录使用的语句 — 如 SELECT 或 INSERT — 以及谁发出它从哪一个终端什么时候等等然而信息最重要的部分 — 哪条特定记录被修改了以及数据本身的变化 — 没有捕获到相反许多用户编写触发器来捕获变化前后的数据值并把它们记录在用户自定义的表中但因为触发器只可能在 DML 语句(如 insertupdate 和 delete)上使用所以访问的一个主要的方面 — SELECT 语句 — 不能通过这种途径来审计

因此 FGA 的价值在于它只捕获 SELECT 语句与触发器和 Log Miner 工具一起FGA 提供了一种机制来审计各种类型的值修改和不涉及到修改的数据访问

FGA 不仅填补了审计 SELECT 语句的空白而且还提供了其它的一些引人注目的额外好处这些好处使得数据库管理员的工作变得更加轻松例如FGA 允许一个用户自定义的过程在指定的审计条件出现的时候执行因此您可以认为它是 SELECT 语句上的一个触发器 — 这是一个在其它方式下没有提供的功能这个技巧可能非常有用 — 例如任何时候当有人选择了收入超过 百万美元的员工的工资记录时发送一封邮件给一个安全审计员以在用户自定义的表中生成审计记录这些表可以不受限制地进行处理(这与 SYS 拥有的 FGA_LOG$ 表不同)利用审计线索识别数据访问类型以找出最可能的索引机制等等

由于这些及其它的原因FGA 成为数据库管理员工具箱中最重要的工具之一不过在 Oraclei Database 中它缺少一个重要的特性在 SELECT 语句之外的语句上使用

所有类型的 DML

在 Oracle Database g 中FGA 已变得很完善 — 它可以审计所有类型的 DML 语句而不只是 SELECT

让我们看一个例子在本系列的第 部分中我介绍了一个名称为 ACCOUNTS 的表在那个表上定义的 FGA 策略为

begin

dbms_fgaadd_policy (

object_schema => BANK

object_name => ACCOUNTS

policy_name => ACCOUNTS_ACCESS

audit_column=> BALANCE

audit_condition => BALANCE >=

);

end;

在 Oracle i Database 下这个策略只能审计 SELECT 语句然而在 Oracle Database g 中您可以扩展它使它包含 INSERTUPDATE 和 DELETE您可以通过指定一个新的参数来实现这个目的

statement_types => INSERT UPDATE DELETE SELECT

这个参数将在所有包括的语句类型上启用审计您甚至可能考虑为每种语句类型创建单独的策略这将允许您随意地启用和禁用策略 — 尤其是控制审计线索的创建以管理它们占用的空间不过statement_type 参数默认情况下只审计 SELECT 语句

在策略中添加新的参数之后发出以下语句

update accounts set balance = where balance >= ;

这将使一条记录插入到 FGA_LOG$ 表中注意这条记录是由一个自动事务插入的即使您回滚 update 语句这条记录也将存在您可以从另一个会话来检查线索是否存在

select lsqltext from fga_log$;

LSQLTEXT

update accounts set balance = where balance >=

该行还包括其它所有的相关详细信息(如表名称策略名称和事务 ID)

与触发器方法相比较

那么 FGA 能做什么原来的基于触发器的方法不能做的事情?

在 Oracle Database g 之前DML 语句审计是在一个触发器中进行的类似于以下方式(注意这不是真实的代码只是一个代表性的示例)

CREATE TRIGGER XXXXX

ON Table

AFTER INSERT OR UPDATE OR DELETE

FOR EACH ROW

BEGIN

INSERT INTO AUDIT_LOG

Old Value New Value Time

END

触发器捕获旧的值和新的值并填充 AUDIT_LOG 表如果需要还可以将它变为自动事务最大的问题是触发器是对每行触发的而不是每条语句一次例如以下语句

update accounts set balance = where balance >= ;

对全部 条记录触发在审计表中插入 这种方法可能严重地损害 update 语句的性能甚至可能因审计线索中的空间问题而导致失败使用语句触发器也无济于事因为它不能捕获个别记录的任何新的或旧的值比较而言在 FGA 方法中只创建一条记录并且插入只在每条语句上执行一次而不是每行一次 — 即使有的话对性能的影响也很小

在 FGA 中您可以指定相关的列来限定审计线索仅在这些列被访问时才创建在触发器中通过使用触发器定义的 WHERE这种功能也可以实现不过其中存在一个非常重要的差异 — 在触发器中只有当列被修改时(而不是被访问时)才检查它们在 FGA 中无论何时列被访问(无论它们被修改与否)审计就开始这个特性使得 FGA 比触发器具有更多的功能

另一个优点是 FGA 工具的适用性有时在一个视图上定义的 INSTEAD OF 触发器在基表上更新视图另一个 INSTEAD OF 触发器不能捕获由其它的触发器所作的修改因此这些修改不能被记录然而FGA 是建立在视图或表的基础上的它能够捕获变化而不论变化来自哪里 — 用户语句或触发器

那么是否存在触发器比 FGA 更好的情况呢?可能有两种情况

记住FGA 通过一个自动事务来插入审计线索这种事务在它自己的上下文中提交当 DML 语句失败或被回滚时插入的线索记录不被回滚如果用户更新了一些东西但没有提交则不执行修改但不管怎样将创建审计线索这可能导致在审计线索中产生几个虚假的实际项目 — 一种不希望出现的潜在情况随后使用通过闪回查询捕获的 SCN 号码对表进行分析将可能揭露这个问题但这个过程可能非常复杂但如果这种风险是不可接受的那么基于触发器的方法将优于 FGA 成为首选

FGA 记录用户发出的 SQL 语句和 SCN 号码但不记录在修改之前和之后的值必须使用一个单独的工具来从表中通过闪回查询取出这些值因为闪回查询依赖于 UNDO 段中包含的信息(这些信息是有限的)因此这个工具可能不会从过去很久的时间点上取出旧的值基于触发器的方法在源数据上捕获变化因此保证旧的值和新的值都有记录

在变化期间 FGA 的行为

数据始终在变化因此它有可能变得适用于审计条件 — 虽然之前它不适用于审计条件反之亦然这个问题带来了一些关于 FGA 在不同情况下的行为的有趣问题考虑我们的例子其中在 UPDATE 上已经定义了 FGA 策略条件为 BALANCE >= 审计列是 BALANCE

种情况

之前BALANCE =

用户发出

update accounts set balance = where ACCOUNT_NO =

旧的和新的 balance 都小于 审计条件不满足因此这条语句将不会被审计

种情况

之前BALANCE =

用户发出

update accounts set balance = where ACCOUNT_NO =

新的 balance 大于 审计条件满足因此这条语句将 会被审计

种情况

之前BALANCE =

用户发出

update accounts set balance = where ACCOUNT_NO =

新的 balance 小于 但旧的 balance 大于 因此审计条件满足这条语句将被审计

种情况

用户插入一行其中有 BALANCE <

insert into accounts values (X);

因为 balance 不满足审计条件所以这条语句不被审计如果 balance 列大于或等于 它将被审计

种情况

用户插入一行其中 balance 的值为空

insert into accounts (account_no status) values ( X);

因为 balance 为空该列没有任何默认值所以审计条件不满足(比较 NULL >= 结果为 FALSE)这条语句不会被审计重要注意事项假设该列有一个大于 的默认值时这条语句仍然不会被审计即使插入行的 balance 列值大于

所有相关的列?

考虑在表 ACCOUNTS 上定义的一个策略如下

begin

dbms_fgaadd_policy (

object_schema => ANANDA

obje

上一篇:维珍航空联合甲骨文TCS开RFID试验

下一篇:使用 ADDM 快速轻松解决常见的性能问题