ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 利用Label Security实现行级安全性 Step By Step

利用Label Security实现行级安全性 Step By Step

原创 Linux操作系统 作者:jiuniang012 时间:2009-07-17 00:29:38 0 删除 编辑
利用Label Security实现行级安全性 Step By Step
前言:
在Oracle9i中有一个组件称为Oracle Label Security,这个组件实现了基于自定义策略而对数据库中的表甚或是整个Schema提供行级安全性功能。实际上Oracle Label Security是在Oracle8.1.7中提出的,在9i版本中功能得到了大幅度增强。

本文通过一个简单的例子对Oracle Label Security的功能作初步的探讨,本文使用的环境是Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 for Windows 32 bit。

流程:
首先我们了解一下实现Oracle Label Security的大体流程。
通过Oracle提供的一系列存储过程,先创建一个policy,然后在policy中创建level,compartment,group,之 后通过这些定义好的level,compartment,group再定义label,然后将policy绑定到某张表或者某个schema,最后再给相 应的用户设置label。

其中牵涉到几个名词,解释一下:
Policy:就是安全策略,一个安全策略是level,compartment,group,label的集合。
Level:等级,这是最基础的安全控制等级,必须设置。
Compartment:分隔(这不是官方翻译),提供第二级的安全控制,是可选的。
Group:组(这不是官方翻译),提供第三级的安全控制,是可选的。
Label:标签,最终体现到每一行上的安全标签,必须设置。只有用户被赋予的标签和此行上的标签相同或者等级更高的时候,该行才能够被用户存取。

方法:
然后再来了解一下Oracle实现Label Security的大体方法。
在设置完Label以后,通过SQL Trace,我们可以看到用户发出的select语句执行计划有了变化,即使是全表扫描,也会多出一个filter的操作。
select *
from
documents

Rows Row Source Operation
------- ---------------------------------------------------
5 FILTER (cr=7 pr=0 pw=0 time=184 us)
5 TABLE ACCESS FULL DOCUMENTS (cr=7 pr=0 pw=0 time=131 us)
通过查看raw trace file可以看到Oracle在parse这个SQL的时候,自动添加了一个条件:
begin :con := LBAC_RLS.READ_FILTER(:sn, :on); end;
而这个条件的具体操作在trace file中也有保存,此处就不多说了。总之,通过trace我们知道对于设置了label的表的select操作,Oracle自动添加了条件来保证用户只能选择到自己能够看到的记录。

那么,对于DML(insert,update,delete)操作呢?其实,Oracle是自动在表上添加了触发器,这一点我们可以在设置完 label以后,通过dba_triggers视图验证,添加的是INSERT AFTER EACH ROW,UPDATE AFTER EACH ROW和DELETE BEFORE EACH ROW三个trigger,Oracle的很多功能在内部其实都是通过trigger完成,比如高级复制同样如此,但是Oracle一直声称这些 trigger是内部实现的,所以比用户自定义的trigger效率要高。当然,内部trigger和自定义trigger在实现机制上是否真的不同,还 有待验证。


[转自: http://q.yesky.com/group/review-11029055.html]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9466564/viewspace-609389/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-02

  • 博文量
    126
  • 访问量
    211255