三、细粒度审计:
细粒度审计 (FGA)(通过 Oracle9i 引入)可以理解为“基于政策的审计”。与标准的审计功能相反,FGA 可用于指定生成审计记录必需的条件:
FGA 政策通过使用“dbms_fga”程序包以编程方式绑定到对象(表、视图)。类似于用于通过 VPD (dbms_rls) 进行访问控制的程序包,它允许您创建任何需要的条件,例如:仅当以下条件为真时审计事件:
在早上九点到下午六点之间或在星期六和星期日对某个表进行了访问。
使用了公司网络外部的某个 IP 地址。
选定或更新了特定列。
使用了该列的特定值。
这将创建更有意义的审计线索,因为无需记录每一个人对表的每一次访问。从 Oracle 数据库 10g 开始,FGA 支持在一个策略中使用“选择”、“插入”、“更新”和“删除”语句的任意组合。事实上,绑定到表的 FGA 政策简化了审计政策的管理,因为这将只需在数据库中对其更改一次,不用在每个应用程序中一次次进行。此外。无论用户通过何种方式连接至数据库(通过应用程序、Web 接口或通过 SQLPlus),其操作都会记录下来。
1、使用细粒度审计:
(1)创建测试表:
create table ACCOUNT
(AACT_NO number not null,
CUST_ID number not null,
BALANCE number(15,2)
);
(2)添加审计策略:
begin
DBMS_FGA.DROP_POLICY(object_schema = 'TEST',
object_name = 'ACCOUNT',
policy_name = 'ACCOUNT_ACCESS');
end;
这段代码必须由具有执行程序包 dbms_fga 权限的用户来执行。建议应该建立一个专门的用户来专门负责添加审计策略。该过程有许多参数,具体含义如下:
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)在定义了策略以后,当用户以通常的方式对表进行查询时,如下所示:
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
--------- ------- ------- ------- -------- ----------------------
26-MAR-10 TESTananda TESTACCOUNT select from account
注意名为 DBA_FGA_AUDIT_TRAIL 的新视图,它记录细粒度的访问信息。其中显示了审计事件的时间标记、查询者的数据库用户 ID、操作系统用户 ID、查询中所使用表的名称和所有者,最后还有确切的查询语句。
2、审计列和审计条件:
默认情况下会对被审计对象的所有列开启审计,当任何一列被访问时都会纪录一条审计信息,这在现实情况下不太常见,因为这样会使审计信息表增长过快造成存储空间的压力,因此通常都会设置审计条件,当条件触发时再发起审计。例如我们可以对Account表的Balance列设置审计条件,当访问该列并触发审计条件时才进行审计。如下所示:
begin
dbms_fga.add_policy (
object_schema='TEST',
object_name='ACCOUNT',
policy_name='ACCOUNT_ACCESS',
audit_column = 'BALANCE',
audit_condition = 'BALANCE = 11000'
);
end;
该策略将在访问BALANCE列并且只有访问列值大于等于11000时才发起审计。因此根据该条件户有如下不同审计状态:
SQL 语句审计状态
select balance from account;进行审计。用户选择了在添加策略时所指定的审计列 BALANCE。
select from account;进行审计。即使用户没有明确指定列 BALANCE, 也隐含地选择了它。
select cust_id from account where balance 10000;进行审计。即使用户没有明确指定列 BALANCE,where 子句也隐含地选择了它。
select cust_id from account;不进行审计。用户没有选择列 BALANCE。
select count() from account;不进行审计。用户没有明确或隐含地选择列 BALANCE。
3、优化器模式:
FGA 需要基于成本的优化 (CBO),以便正确地工作。在基于规则的优化时,只要用户从表中进行选择,无论是否选择了相关的列,都始终生成审计线索,增加了误导项目出现的可能性。为使 FGA 正确地工作,除了在实例级启用 CBO 之外,在 SQL 语句中应该没有规则暗示(hint),并且必须至少使用评估选项对查询中的所有表进行分析。
4、管理 FGA 策略
要删除策略,您可以使用以下语句:
begin
dbms_fga.drop_policy (
object_schema = 'TEST',
object_name = 'ACCOUNT',
policy_name = 'ACCOUNT_ACCESS'
);
end;
对于更改策略而言,没有随取随用的解决方案。要更改策略中的任何参数,必须删除策略,再使用更改后的参数添加策略。但是可以暂时禁用已有策略,如下所示:
begin
dbms_fga.enable_policy (
object_schema = 'TEST',
object_name = 'ACCOUNT',
policy_name = 'ACCOUNT_ACCESS',
enable = FALSE
);
end;
若要重新启用它,可使用同一函数,只需将参数 enable 设置为 TRUE。
5、FGA 数据字典视图:
FGA 策略的定义位于数据字典视图 DBA_AUDIT_POLICIES 中。该市途中各列含义如下:
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 语句使用的绑定变量(如果存在)
6、视图和 FGA:
假定在 ACCOUNTS 表上定义视图 VW_ACCOUNT 如下:
create view vw_account as select from account;
现在,如果用户从视图中而不是从表中进行选择:
select from vw_account;
您将看到以下审计线索:
select object_name, sql_text from dba_fga_audit_trail;
OBJECT_NAME SQL_TEXT
----------- -------------------------------------------------
ACCOUNTselect from vw_account
注意,是基表名称而不是视图名称出现在 OBJECT_NAME 列中,因为视图中的选择是从基表中进行选择。但是,SQL_TEXT 列记录了用户提交的实际语句。
如果只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。通过将视图名称而不是表的名称传递给打包的过程 dbms_fga.add_policy 中的参数 object_name,可以完成这项工作。随后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列将显示视图的名称,并且不会出现有关表访问的附加记录。
7、其它用途:
除了记录对表的选择访问,FGA 还可用于某些其它情况:
可以对数据仓库使用 FGA,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。
由于 FGA 捕获绑定变量,它可以帮助了解绑定变量值的模式,这有助于设计直方图集合等。
可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。
由于 FGA 可以作为 SELECT 语句的触发器,可以在需要这种功能的任何时候使用它。
8、FGA在10G中的增强:
(1)对所有DML的审计:
在9i中FGA只能对Select语句进行审计,而不能对其他DML语句(Update、Delete、Insert)进行审计,如果想对其他DML语句进行审计那么只能采取数据库处发起的形式来实现。在10G中实现了对所有DML语句的审计,如下所示:
begin
dbms_fga.add_policy (
object_schema = 'TEST',
object_name = 'ACCOUNT',
policy_name = 'ACCOUNT_ACCESS',
audit_column= 'BALANCE',
audit_condition = 'BALANCE = 3000',
statement_types = 'INSERT, UPDATE, DELETE, SELECT'
);
end;
通过statement_types = 'INSERT, UPDATE, DELETE, SELECT'参数制定了新的策略,该策略可以对Select之外的所有DML操作进行审计。因此根据新的审计条件和审计策略会有如下不同情况:
第 1 种情况
之前:BALANCE = 1000
用户发出:
update account set balance = 1200 where ACCOUNT_NO = …
旧的和新的 balance 都小于 3,000,审计条件不满足;因此这条语句将不会被审计。
第 2 种情况
之前:BALANCE = 1000
用户发出:
update account set balance = 3200 where ACCOUNT_NO = …
新的 balance 大于 3,000,审计条件满足;因此这条语句将 会被审计。
第 3 种情况
之前:BALANCE = 3200
用户发出:
update account set balance = 1200 where ACCOUNT_NO = …
新的 balance 小于 3,000,但旧的 balance 大于 3,000。因此审计条件满足,这条语句将被审计。
第 4 种情况
用户插入一行,其中有 BALANCE 3000。
insert into account values (9999,1200,'X');
因为 balance 1,200 不满足审计条件,所以这条语句不被审计。如果 balance 列大于或等于 3,000,它将被审计。
第 5 种情况
用户插入一行,其中 balance 的值为空。
insert into account (account_no, status) values (9997, 'X');
因为 balance 为空,该列没有任何默认值,所以审计条件不满足(比较 NULL = 3000 结果为 FALSE),这条语句不会被审计。重要注意事项:假设该列有一个大于 3,000 的默认值时,这条语句仍然不会被审计,即使插入行的 balance 列值大于 3000。 注意对于DML语句的审计是由一个自动事务插入的;即使回滚 DML语句的操作,审计记录也将存在不会跟着回滚。
(2)制定相关的列策略:
在表 ACCOUNT 上定义的一个策略,如下:
begin
dbms_fga.add_policy (
object_schema = 'TEST',
object_name = 'ACCOUNT',
policy_name = 'ACCOUNT_SEL',
audit_column= 'ACCOUNT_NO, BALANCE',
audit_condition = 'BALANCE = 3000',
statement_types = 'SELECT'
);
end;
在某些情况下,列的组合可能很重要,而不是某个特定的列。以上策略是在 ACCOUNT_NO 和 BALANCE 上定义的。那么如果用户发出以下语句:
select balance from accounts where account_no = 9995;
这条语句将被审计,因为 balance 列被选中,且余额为 3,200,大于 3,000,满足审计条件。
如果一个用户想查出在银行的总余额,他发出:
select sum(balance) from account;
这条查询几乎没什么害处;它不明确指出帐户所有者和帐户余额。因此安全策略可能不会要求审计这条查询。不过,这条查询
select balance from account where account_no = 9995
必须被审计;因为它明确地指定了一个帐户。默认地,所有语句都被审计(无论使用了什么样的列组合)。这将创建大量不需要的审计线索项目,并可能带来一些空间限制问题。为了限制它们,您可以指定仅当在查询中使用了希望的列组合时才开始审计。当定义策略时,您可以使用一个新的参数:
audit_column_opts = DBMS_FGA.ALL_COLUMNS
这个参数将使策略仅当列 ACCOUNT_NO 和 BALANCE 在查询中都被访问时才创建审计线索项目。例如,以下查询将产生一个审计线索项目。
select account_no, balance from account;
但这条查询不会产生审计线索项目。
select account_no from account;
使用这个参数将把审计的数量限制在一个更易管理的大小。如果希望采用默认的行为 ― 即任意列被选中时都进行审计,那么您可以对同一参数的使用不同值。
audit_column_opts = DBMS_FGA.ANY_COLUMNS
3.8.3 与标准审计的结合:
通过制定如下审计策略实现标准审计与细粒度审计的结合
begin
dbms_fga.add_policy (
object_schema = 'TEST',
object_name = 'ACCOUNT',
policy_name = 'ACCOUNT_SEL',
audit_column = 'ACCOUNT_NO, BALANCE',
audit_condition = 'BALANCE = 3000',
statement_types = 'SELECT',
audit_column_opts = DBMS_FGA.ALL_COLUMNS,
audit_trail = DB
);
end;
通过指定audit_trail = DB参数实现在细粒度审计时开启标准审计。在 Oracle Database 10g 中,标准审计也得到了巨大的改进。通过 AUDIT 命令执行标准审计,它现在能够捕获大量其它有用的信息。在内容和功能方面,标准审计类似于细粒度审计。然而,作为一个数据库管理员,有兴趣知道所有的审计项目,而不只是一个审计项目。一个新的视图,DBA_COMMON_AUDIT_TRAIL,结合了标准审计线索和 FGA审计线索。用以下查询来检查它们二者如:
select from dba_common_audit_trail;通过这条查询可以同时查看两种审计收集的信息。
四、FGA 审计和标准审计的差异 :
标准审计必须用参数 AUDIT_TRAIL 在数据库级启用。这个参数不是动态的;您必须重启数据库来使其生效。相比而言,FGA 不需要任何参数修改。
一旦被设置在一个对象上,标准审计将保持在那里。要解除它,必须用 NOAUDIT 命令删除审计选项。这可能很不方便,因为在一个表上丢弃审计选项也将丢弃元数据信息。然而,FGA 可以临时禁用和启用,不丢失任何元数据信息。
FGA 只能够处理四种类型的语句:SELECT、INSERT、UPDATE 和 DELETE。相比而言,常规审计可以处理其它许多语句和权限,甚至会话连接和断开。
标准审计每次会话只创建一条记录(按会话)或每次访问对象创建一条记录(按访问)这种占用资源很少的方式对于控制审计线索表中的空间非常重要。FGA 并不是同样节省资源;它每次访问运行一次 ― 使得线索更大。
通过记录线索,标准审计可以用来检测任何中断企图,如果企图没有成功,则将产生错误代码。而 FGA 不能。
标准审计可以写数据库表或 OS 文件。后者在审计员(不是数据库管理员)能够访问线索时非常有用。在 Windows 下,非数据库审计线索记录在事件日志中,并且可以用不同的方式对其进行访问。这个选项保护了审计线索的完整性。然而,FGA 日志仅写到数据库表 FGA_LOG$ 中。可以在 FGA 中创建用户自定义的审计处理程序来写 OS 文件,但它们的完整性不能保证。
标准审计可以设置用于默认对象。当表是在运行期创建时,这个功能变得极为有用:默认的审计选项允许没有数据库管理员干预的审计。这在 FGA 中是不可能的,用户必须在一个现有的表上创建策略,上述的情况只能在表已创建之后才可能发生。
在 FGA 中,审计更加灵活 ― 仅当访问某些列,当某个特定的条件为真时等等。这种多功能性在您需要控制线索的增长时非常方便。
在 FGA 中,SQL 赋值变量默认被捕获。在标准审计中,必须把初始化参数 audit_trail设为 db_extended,以启用这一功能。
权限差异:标准审计需要审计系统或语句权限;FGA 只需要 dbms_fga 程序包上的运行权限。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html