网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  帮你完全了解 Oracle 标签安全测试     
  文章作者:未知  文章来源:未知  
  查看:128次  录入:管理员--2007-05-13  
  其中牵涉到几个名词,解释一下:

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

  EXEC sa_sysdba.create_policy('DOC_POLICY','DOC_LABEL');


  2。创建敏感等级:

  EXEC sa_components.create_level('DOC_POLICY', 1000, 'PUBLIC', 'Public Level');
  EXEC sa_components.create_level('DOC_POLICY', 2000, 'INTERNAL', 'Internal Level');
3。创建分隔:

  EXEC sa_components.create_compartment('DOC_POLICY', 200, 'FIN', 'FINANCE');
  EXEC sa_components.create_compartment('DOC_POLICY', 100, 'HR', 'HUMAN_RESOURCE');


  4。创建分组:

  EXEC sa_components.create_group('DOC_POLICY', 10, 'ALL', 'ALL_REGIONS');
  EXEC sa_components.create_group('DOC_POLICY', 20, 'WEST','WEST_REGION', 'ALL');
  EXEC sa_components.create_group('DOC_POLICY', 30, 'EAST', 'EAST_REGION', 'ALL');
((级别:分隔:组) 组成标签)(就是对于某个部门某个区域的用户的数据(记录)分别分配一个不同的标记,也就是标签的数字号,对用户也分配同样的标记)

 5。创建标签:

  EXEC sa_label_admin.create_label('DOC_POLICY', '10000', 'PUBLIC', TRUE);
  EXEC sa_label_admin.create_label('DOC_POLICY', '20200','INTERNAL:HR:WEST', TRUE);
  EXEC sa_label_admin.create_label('DOC_POLICY', '20400','INTERNAL:FIN:EAST', TRUE);
  EXEC sa_label_admin.create_label('DOC_POLICY', '30900','INTERNAL:HR,FIN:ALL', TRUE);
7。向用户分配标签:

  EXEC sa_user_admin.set_user_labels -
  ( policy_name => 'DOC_POLICY' -
  , user_name => 'TEST' -
  , max_read_label => 'INTERNAL:HR,FIN:ALL' -
  , max_write_label => 'INTERNAL:HR,FIN:ALL' -
  , min_write_label => 'PUBLIC' -
  , def_label => 'INTERNAL:HR,FIN:ALL' -
  , row_label => 'PUBLIC');
  EXEC sa_user_admin.set_user_labels -
  ( policy_name => 'DOC_POLICY' -
  , user_name => 'HR' -
  , max_read_label => 'INTERNAL:HR:WEST' -
  , max_write_label => 'INTERNAL:HR:WEST' -
  , min_write_label => 'PUBLIC' -
  , def_label => 'INTERNAL:HR:WEST' -
  , row_label => 'PUBLIC');
  EXEC sa_user_admin.set_user_labels -
  ( policy_name => 'DOC_POLICY' -
  , user_name => 'SCOTT' -
  , max_read_label => 'PUBLIC' -
  , max_write_label => 'PUBLIC' -
  , min_write_label => 'PUBLIC' -
  , def_label => 'PUBLIC' -
  , row_label => 'PUBLIC');
  INSERT INTO ts.document VALUES(1, 'SHARE_WARE',CHAR_TO_LABEL('DOC_POLICY','PUBLIC'));
  INSERT INTO ts.document VALUES (2, 'WEST_PAYROLL', 20200);
  INSERT INTO ts.document VALUES (3, 'EAST_SALES', 20400);
  INSERT INTO ts.document VALUES (4, 'COMP_PAYROLL', 30900);

8。测试:

  SQL> CONN test/test


  已连接。

  SQL> INSERT INTO TS.document VALUES
  2 (1, 'SHARE_WARE',CHAR_TO_LABEL
  3 ('DOC_POLICY','PUBLIC'));


  已创建 1 行。

  SQL> INSERT INTO TS.document VALUES
  2 (2, 'WEST_PAYROLL', 20200);


  已创建 1 行。

  SQL> INSERT INTO TS.document VALUES
  2 (3, 'EAST_SALES', 20400);


  已创建 1 行。

  SQL> INSERT INTO TS.document VALUES
  2 (4, 'COMP_PAYROLL', 30900);


  已创建 1 行。

  SQL>
  SQL> commit;


  提交完成。

  SQL> SELECT docname, doc_label
  2 FROM ts.document;
  DOCNAME DOC_LABEL
  SHARE_WARE 10000
  WEST_PAYROLL 20200
  EAST_SALES 20400
  COMP_PAYROLL 30900
  SQL> desc ts.document


  名称 是否为空? 类型

  DOCID NUMBER
  DOCNAME VARCHAR2(60)
  DOC_LABEL NUMBER(10)
  SQL> conn hr/hr


  已连接。

  SQL> SELECT docname, doc_label
  2 FROM ts.document;
  DOCNAME DOC_LABEL
  SHARE_WARE 10000
  WEST_PAYROLL 20200
  SQL> conn hr/hr


  已连接。

  SQL>
  SQL> INSERT INTO TS.document VALUES
  2 (1, 'SHARE_WARE',CHAR_TO_LABEL
  3 ('DOC_POLICY','PUBLIC'));


  已创建 1 行。

  SQL> INSERT INTO TS.document VALUES
  2 (2, 'WEST_PAYROLL', 20200);


  已创建 1 行。

  SQL> INSERT INTO TS.document VALUES
  2 (3, 'EAST_SALES', 20400);
  INSERT INTO TS.document VALUES
  *


  第 1 行出现错误:

  ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句
  ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20
  ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1
  ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错
  SQL> INSERT INTO TS.document VALUES
  2 (4, 'COMP_PAYROLL', 30900);
  INSERT INTO TS.document VALUES
  *


  第 1 行出现错误:

  ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句
  ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20
  ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1
  ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错
  SQL> conn scott/tiger


  已连接。

  SQL> INSERT INTO TS.document VALUES
  2 (1, 'SHARE_WARE',CHAR_TO_LABEL
  3 ('DOC_POLICY','PUBLIC'));


  已创建 1 行。

  SQL> INSERT INTO TS.document VALUES
  2 (2, 'WEST_PAYROLL', 20200);
  INSERT INTO TS.document VALUES
  *


  第 1 行出现错误:

  ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句
  ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20
  ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1
  ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错
  SQL> INSERT INTO TS.document VALUES
  2 (3, 'EAST_SALES', 20400);
  INSERT INTO TS.document VALUES
  *


  第 1 行出现错误:

  ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句
  ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20
  ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1
  ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错
  SQL> INSERT INTO TS.document VALUES
  2 (4, 'COMP_PAYROLL', 30900);
  INSERT INTO TS.document VALUES
  *


  第 1 行出现错误:

  ORA-12406: 未经策略 DOC_POLICY 授权的 SQL 语句
  ORA-06512: 在 "LBACSYS.LBAC_STANDARD", line 20
  ORA-06512: 在 "LBACSYS.LBAC$AI0_45004", line 1
  ORA-04088: 触发器 'LBACSYS.LBAC$AI0_45004' 执行过程中出错
  SQL>


  对于DML(insert,update,delete)操作呢?其实,Oracle是自动在表上添加了触发器,这一点我们可以在设置完label以后,通过dba_triggers视图验证,添加的是INSERT AFTER EACH ROW,UPDATE AFTER EACH ROW和DELETE BEFORE EACH ROW三个trigger

  触发器 'LBACSYS.LBAC$AI0_45004'代码:

  DECLARE v_allowed NUMBER;
  new_label LBAC_LABEL;
  BEGIN
  IF lbac_session.policy_disabled('DOC_POLICY') OR (lbac_standard.secure_context('LBAC$0_LAB', 'LBAC$BYPASS') = 2)
  THEN RETURN;
  END IF;
  IF :new.DOC_LABEL IS NULL OR (NOT lbac_utl.data_label(:new.DOC_LABEL))
  THEN
  lbac_standard.raise_facility_error('TRUSTED', 'LBAC', 12406, 'DOC_POLICY');
  END IF;
  IF bitand(nvl(lbac_standard.secure_context('LBAC$LABELS', :new.DOC_LABEL),0),3)=0
  THEN
  lbac_standard.raise_facility_error('TRUSTED', 'LBAC', 12406, 'DOC_POLICY');
  END IF;
  IF bitand(nvl(lbac_standard.secure_context('LBAC$LABELS',:new.DOC_LABEL),0),2)=2
  THEN
  lbac_services.audit_privilege('DOC_POLICY',2,0,TRUE,'insert privilege used');
  END IF;
  END;

 
 
上一篇: Oracle OCCI的一个简单的包装类的实现    下一篇: 教你手工创建数据库的全部脚本及说明
  相关文档
教你快速掌握"oracle"的管道化表函数 03-06
Oracle进程导致CPU 100%的具体解决步骤 08-05
Oracle数据库不同版本间用exp来导数据 09-01
全面解析oracle数据库中管理实例的方法 (1) 04-24
Oracle数据库中独一无二的Cache对象 05-13
“数字公交”项目中的Oracle开发技巧 05-27
深入讲解如何才能杀掉带锁的oracle进程 02-01
巧用dbms_rowid包获得rowid的详细信息 05-16
Oracle中用Rowid查找和删除重复记录 04-11
rac环境中查询不到其他实例执行的sql 02-27
怎样使用sql server数据库的查询累计值 11-15
从Oracle的FORM中调用REPORT的实用技巧 08-05
深刻理解Oracle数据库的启动和关闭 01-15
用Oracle 9i全索引扫描快速访问数据 04-11
从问题入手帮你解决Oracle杀死死锁进程 05-27
诊断数据库系统性能 oracle中跟踪sql语句 09-11
实例讲解如何通过oracle成功发送邮件 04-10
解决不同字符集数据库间的数据同步问题 03-07
在线日志文件都是active或current的现象 02-26
用utl_inaddr包获取已经连接用户的ip地址 05-29
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息