细粒度审计 FGA

传统的 Oracle 数据库审计选件允许您在宏观级别上跟踪用户在对象上所执行的操作 — 例如,如果您审计对某个表的 SELECT 语句,则可以跟踪是谁从表中选择了数据。但是,您不知道他们选择了什么。利用数据操纵语句 — 如 INSERT、UPDATEDELETE — 您可以通过使用触发器或使用 Oracle LogMiner 实用程序来分析归档日志,从而捕获任何的更改。因为简单的 SELECT 语句是不操纵数据的,它们既不启动触发器,也不记入到那些以后可以进行挖掘的归档日志中,所以这两种技术在涉及到 SELECT 语句的地方无法满足要求。

Oracle9i Database 推出了一种称为细粒度审计 (FGA) 的新特性,它改变了这种局面。该特性允许您将单个的 SELECT 语句联同用户提交的确切语句一起进行审计。除了简单地跟踪语句之外,FGA 还通过在每次用户选择特定的数据集时执行一段代码,提供了一种方法来模拟用于 SELECT 语句的触发器。在分为三部分的这一系列文章中,我将说明如何使用 FGA 解决实际问题。这第一部分的主要内容是构建基本的 FGA 系统。

示例安装

我们的示例基于一个银行系统,已经通过应用程序级的审计按照传统提供了用户访问特定数据的审计线索。但是,只要用户使用诸如 SQL*Plus 等工具从应用程序以外的地方访问数据,该系统就不能满足要求。在本文中,我将说明作为 DBA 的您能够如何使用 FGA 来完成捕获用户对特定行的 SELECT 访问的任务,无论访问的工具或机制是什么。

在我们的示例中,数据库有一个名为 ACCOUNTS 的表,由模式 BANK 拥有,其结构如下:

 

Name              Null?    Type---------------- -------- ------------
ACCT_NO           NOT NULL NUMBER
CUST_ID           NOT NULL NUMBER
BALANCE                    NUMBER(15,2) 

 

为了构造一个能够对任何在此表中选择的用户进行审计的系统,您需要定义对该表的 FGA 策略如下:

 

begin
dbms_fga.add_policy (
object_schema=>'BANK',
object_name=>'ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS');
end;

 

这段代码必须由具有执行程序包 dbms_fga 权限的用户来执行。但是,为了提高安全性,建议不要对用户 BANK(将要被审计的表的所有者)授予执行权限;而应该将权限授予一个安全的用户(比如 SECMAN),此用户应该执行添加策略的过程。

在定义了策略以后,当用户以通常的方式对表进行查询时,如下所示:

 

select * from bank.accounts; 

 

审计线索记录此操作。您可以使用以下语句查看线索:

 

select timestamp,db_user,os_user,object_schema,object_name,sql_text
from dba_fga_audit_trail;TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT
--------- ------- ------- ------- -------- ----------------------
22-SEP-03 BANK    ananda  BANK    ACCOUNTS select * from accounts

 

注意名为 DBA_FGA_AUDIT_TRAIL 的新视图,它记录细粒度的访问信息。其中显示了审计事件的时间标记、查询者的数据库用户 ID、操作系统用户 ID、查询中所使用表的名称和所有者,最后还有确切的查询语句。在 Oracle9i Database 之前不可能得到这种信息,但随着 FGA 的推出,获得此信息变得轻而易举。

在 Oracle9i Database 中,FGA 只能捕获 SELECT 语句。利用 Oracle Database 10g,FGA 还可以处理 DML 语句 — INSERT、UPDATEDELETE — 使其成为完整的审计特性。在本系列的第 3 部分,我将详细说明这些新的功能。

审计列和审计条件

让我们更详细地检查前面的示例。我们要求审计对该表所使用的任何 SELECT 语句。但是在现实中,可能不必要这样做,并且这样可能会使存储线索的审计表承受不起。当用户选择含有敏感信息的余额列时,银行可能需要进行审计,但当用户选择特定客户的帐号时,可能不需要进行审计。列 BALANCE(选择它可触发审计)称为审计列,在此情况下,dbms_fga.add_policy 过程的参数指定该列如下:

 

audit_column => 'BALANCE'

 

如果每次用户从表中选择时都记录审计线索,则线索的大小将增长,导致空间和管理问题,因此您可能希望只有在满足特定条件时进行审计,而不是每次都进行审计。也许只有当用户访问极为富有的户主帐号时,银行需要审计 — 例如,只有当用户选择了余额为 11,000 美元或更多的帐号时需要审计。这种类型的条件称为审计条件,并作为一项参数传递到 dbms_fga.add_policy 过程,如下所示:

 

audit_condition => 'BALANCE >= 11000'

 

让我们来看这两个参数如何起作用。现在策略定义的形式类似于:

 

begin
dbms_fga.add_policy (
object_schema=>'BANK',
object_name=>'ACCOUNTS',
policy_name=>'ACCOUNTS_ACCESS',
audit_column => 'BALANCE',
audit_condition => 'BALANCE >= 11000');
end;

 

在此情况下,只有当用户选择列 BALANCE 并且检索的行包含大于或等于 $11,000 的余额时,才会审计该操作。如果这两个条件中有一个不为真,则该操作不会被写入到审计线索中。表 1 中的示例演示了何时审计操作和何时不审计操作的各种情况。

优化器模式

FGA 需要基于开销的优化 (CBO),以便正确地工作。在基于规则的优化时,只要用户从表中进行选择,无论是否选择了相关的列,都始终生成审计线索,增加了误导项目出现的可能性。为使 FGA 正确地工作,除了在实例级启用 CBO 之外,在 SQL 语句中应该没有规则暗示,并且必须至少使用评估选项对查询中的所有表进行分析。

管理 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_accounts 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,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。您不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。

     

     

  • 由于 FGA 捕获绑定变量,它可以帮助您了解绑定变量值的模式,这有助于设计直方图集合等。

     

     

  • 前文已经提到,处理器模块可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。

     

     

  • 由于 FGA 可以作为 SELECT 语句的触发器,您可以在需要这种功能的任何时候使用它。

 

结论

FGA 使您在 Oracle 数据库中支持隐私和职能策略。因为审计发生在数据库内部而不是应用程序中,所以无论用户使用的访问方法是什么(通过诸如 SQL*Plus 等工具或者应用程序),都对操作进行审计,允许进行非常简单的设置。

表 1:演示何时审计操作以及何时不审计操作的各种情况

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 语句使用的绑定变量(如果存在)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵连乘问题的算法分析

问题描述&#xff1a;给定n个矩阵&#xff1a;A1,A2,...,An&#xff0c;其中Ai与Ai1是可乘的&#xff0c;i1&#xff0c;2...&#xff0c;n-1。确定计算矩阵连乘积的计算次序&#xff0c;使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模&…

等一分钟看了会流泪

转载于:https://blog.51cto.com/hljheiwangwei/269127

Silverlight 解谜游戏 之十六 消失的蒙娜丽莎

在《Silverlight 解谜游戏 之三 消除名单》中我们通过在物品轮廓画出Path 来达到消除物品的效果&#xff0c;由于游戏中的物品都是Office 图片的一部分所以无法使其真正消失&#xff0c;本篇我们将添加一个独立于Office 图片的物品&#xff0c;使其能动态消失。 看看题板上多出…

明令禁止工作“996”,是对“生而为人”的基本尊重

离GitHub上996.ICU项目的发布时间已过去好一段时间了&#xff0c;作为一名计算机专业的在读生&#xff0c;对996有一点体会&#xff0c;最直观的体会就是为了提升技术&#xff0c;连续一个学期在实验室工作超过10个小时。 人民日报发文《被“996”围困的年轻人&#xff0c;像是…

ASP.NET教程5

添加方法&#xff0c;在Sql Server创建表&#xff0c;主表与外键表关联&#xff0c;在asp.net中如何绑定下拉式选单DropDownList&#xff0c;并如何重构DropDownList Web控件&#xff0c;创建SELECT与Insert存储过程&#xff0c;以及应用Transaction事务。 文件格式&#xff1a…

火柴 UVa11375

1.题目描述&#xff1a;点击打开链接 2.解题思路&#xff1a;本题利用递推关系解决。首先可以把“已经使用过的火柴数i”看做状态&#xff0c;可以得到一个图&#xff0c;从前往后每添加一个数字x&#xff0c;就从状态i转移到了ic[x]&#xff0c;其中c[x]代表数字x需要的火柴数…

EntitySpaces2009的开发文档地址

EntitySpaces2009的开发文档地址&#xff0c;开发文档做得还是很不错的&#xff0c;主要的和关键的问题都在其中说明了&#xff0c;比示例做得好。 http://developer.entityspaces.net/documentation/Default.aspx转载于:https://www.cnblogs.com/Rising/archive/2010/01/31/16…

ACM 博弈专题(5种模板)

最近算法课在学博弈论的知识&#xff0c;顺手把算法题中的涉及到博弈论一并总结了 这篇文章的有些内容是参考了大佬的 可能有遗漏。。。。 (一)巴什博弈&#xff08;BAsh Game) 题目模板 只有一堆n个物品两个人轮流取&#xff0c;每次只能取1~m个物品&#xff0c;谁先取完&am…

让sky Driver成为你的可见硬盘

网盘就不用多说了&#xff0c;国内国外的都很多&#xff0c;但是sky Driver以25G的大容量还是吸引着我&#xff0c;看来还是盖茨比较称钱&#xff08;sorry&#xff0c;方言&#xff0c;意思就是nb的意思&#xff09;&#xff0c;但是一向以用户体验非常不错著称的microsoft在这…

初学博弈论

一、巴什博奕(Bash Game) 基本描述&#xff1a; 只有一堆n个石子&#xff0c;两个人轮流从这堆石子中取石子&#xff0c;规定每次至少取一个&#xff0c;最多取m个&#xff0c;最后取完的人获胜。 分析&#xff1a; 当n < m的时候&#xff0c;显然先手获胜&#xff0c;因…

设计模式----Adapter(适配器)

作用: 将一个类的接口转换成客户希望的另外一个接口。Adapt 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 UML示意图 1)采用继承原有接口类的方式 2)采用组合原有接口类的方式 解析: Adapt模式其实就是把完成同样的一个功能但是接口不能兼容的类桥接在一起…

浅谈算法——博弈论

注&#xff1a;下列游戏都建立在双方都有最优策略的情况下&#xff0c;若未加以说明&#xff0c;则每人每次至少取一个石子。 例1&#xff1a;取石子游戏之一 有两个游戏者&#xff1a;A和B。有n颗石子。 约定&#xff1a;两人轮流取走石子&#xff0c;每次可取1、2或3颗。A先…

linux系统管理学习笔记之八---进程与作业的管理

linux系统管理学习笔记之八---进程与作业的管理 2010-01-05 13:00:42标签&#xff1a;linux 进程    [推送到技术圈] 版权声明&#xff1a;原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。ht…

C++中的srand(time(null))利用时间设置随机种子产生随机数

首先需要声明的是&#xff0c;计算机不会产生绝对随机的随机数&#xff0c;计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数&#xff0c;即使计算机怎样发展&#xff0c;它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数&#xff0c;即伪…

srand(设置随机数种子)

srand&#xff08;设置随机数种子&#xff09; 相关函数rand&#xff0c;random srandom 表头文件#include<stdlib.h> 定义函数void srand (unsigned int seed); 函数说明srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数&#xff0c;通常可以利用g…

Exchange 2003升级至Exchange 2007

环境: 三台机器:DC Exchange2003 Exchange2007 计算机名:DC MAIL NEWMAIL 前提条件: 1.Exchange组织设置为纯模式。 2.Exchange 2003安装SP2 3.拥有Schema Master角色的DC及所有GC运行在Windows 2003 SP1或更高以上 4.AD域提升到最高 不被Exchange 2007支持的组件有: Nov…

蓝桥杯 标题:纵横火柴旗子

【编程题】这是一个纵横火柴棒游戏。如图[1.jpg]&#xff0c;在一个3x4的方格中&#xff0c;游戏的双方轮流放置火柴棒。其规则是&#xff1a;1. 不能放置在已经放置火柴棒的地方&#xff08;即只能在空格中放置&#xff09;。2. 火柴棒的方向只能是垂直或水平放置。3. 火柴棒不…

易语言源代码毁来者来了!!

2009年12月7号16:34分&#xff0c;恐怖现象在次出现了&#xff01; 在编译易程序时&#xff0c;突然提示&#xff0c;某某模块找不到了&#xff0c;我跑到软件目录下一看&#xff0c;妈啊不得了&#xff0c;目录中一百多个文件能删除的全部都被删除了&#xff0c;只剩余几个残破…

矩阵连乘 动态规划 详解

矩阵连乘问题----动态规划(转载)&#xff1a; 给定n个矩阵&#xff5b;A1,A2,…,An&#xff5d;&#xff0c;其中Ai与Ai1是可乘的&#xff0c;i1&#xff0c;2…&#xff0c;n-1。如何确定计算矩阵连乘积的计算次序&#xff0c;使得依此次序计算矩阵连乘积需要的数乘次数最少。…

网上威客的猫腻

近期在威客网上转了转 在国内的几大威客&#xff08;任务中国 taskcn,项目交易网sxsoft&#xff09;等上看了看 发现那竞标人真是多啊 经过一两次尝试&#xff08;想弄点小零花钱嘛&#xff09; 发现其中还真有不少猫腻 这里重灾区就是项目交易网 www.sxsoft.com 该网站是北京一…