Oracle Lable Security实现细粒度访问控制

梁铭图 2022-04-29 17:34:00
作者介绍

梁铭图,新炬网络首席架构师。具有十余年数据库运维、数据库设计、数据治理以及系统规划建设经验,拥有Oracle OCM和ACE Director、Togaf企业架构师(鉴定级)、IBM CATE等认证,曾获dbaplus年度MVP、华为云MVP等荣誉,并参与数据资产管理国家标准的编写工作。在数据库运维管理和架构设计、运维体系规划、数据资产管理方面有深入研究。

 

Oracle Label Security 简介

 

众所周知,GRANT是控制对象访问,Oracle Label Security是对表的数据行进行访问控制。

 

Oracle Label Security 使用分配给特定单个表行和应用程序用户的标签来控制单个表行的显示。

 

Oracle Label Security 的工作原理是将行标签与用户的标签授权进行比较,将敏感信息对授权用户进行控制访问。这样,具有不同权限级别的用户(例如,经理和销售代表)可以访问表中的特定数据行。也可以将 Oracle Label Security 策略应用于一个或多个应用程序表。

 

Oracle Label Security 的设计有点类似于 Oracle Virtual Private Database (VPD)。但是,与 VPD 不同的是,Oracle Label Security 提供了开箱即用的访问中介功能、数据字典表和基于策略的体系结构。

 

OLS标签包括level,compartment和group。

 

其中level是必选,compartment和group是可选。level表示敏感度级别,如果用户标签的值大于等于数据标签,则允许访问。compartment和group的比较就是看是否包含。



 

实施前检查

 

  • 组件安装检查



 

  • 检查是否配置和激活



该组件在很多地方是没有安装,如未安装需要手工运行catols.sql脚本进行安装,然后进行配置和激活。

 

创建安全策略(Policy)

 

策略是实现Oracle Label Security 的一组命名命令。行级别的数据标签和对这些行的模式访问总是与一个策略相关联。

 

以LBACSYS身份建立连接,然后执行创建命令。第一个参数是该策略的名字,第二个参数是一个列的名字,OLS将把该列添加到你将在标签控制下替换的表内。



 

定义级别、区间与分组

 

policy创建后,然后创建level,level数值越大则越重要。

 

  •  
  •  
  •  
EXEC sa_components.create_level('HN_POLICY', 1000, 'LOW', 'LOW LEVEL');EXEC sa_components.create_level('HN_POLICY', 2000, 'MIDDLE', 'MIDDLE LEVEL');EXEC sa_components.create_level('HN_POLICY', 3000, 'HIGH', 'HIGH LEVEL');



然后创建compartment,区间能够对一行数据的访问精确限定在一个级别之内。

 

  •  
  •  
  •  
EXEC sa_components.create_compartment('HN_POLICY', 100, 'GENERAL', 'GENERAL COMP');EXEC sa_components.create_compartment('HN_POLICY', 200, 'IMPORTANT', 'IMPORTANT COMP');EXEC sa_components.create_compartment('HN_POLICY', 300, 'VIP', 'VIP COMP');



接着创建group,和使用区间类似,使用分组是将访问限制在一个级别内的另一个可选用的方法。

 

  •  
  •  
  •  
EXEC sa_components.create_group('HN_POLICY', 10, 'APP', 'APP GROUP');EXEC sa_components.create_group('HN_POLICY', 20, 'DB', 'DB GROUP');EXEC sa_components.create_group('HN_POLICY', 30, 'DEV', 'DEV GROUP');



 

创建标签

 

OLS标签分为两类,用户和数据。标签使你能够将数据的不同用户所要求的各种不同类型访问迅速地组合在一起。

 

创建一个标签,类似方法如下:

 

  •  
EXEC sa_label_admin.create_label('HN_POLICY', '10100', 'LOW:GENERAL:', TRUE);

 

label是允许的level,compartment和group的组合。

 

标签列的插入可以直接插入数字或者to_data_label。



接着赋予用户label

 

  •  
  •  
  •  
exec sa_user_admin.set_user_labels('HN_POLICY','user1','LOW:GENERAL:');exec sa_user_admin.set_user_labels('HN_POLICY','user2','MIDDLE');exec sa_user_admin.set_user_labels('HN_POLICY','user3','HIGH:VIP:DEV');



然后对表应用标签。

 

  •  
exec sa_policy_admin.apply_table_policy('HN_POLICY','USER4','TTT','ALL_CONTROL')

 

user4.ttt表上多出一列HN_LABEL。



 

测试验证



测试表总数据量12条。

 

分别用user1,user2,user3登入数据库查询,可以看到,只能看到满足标签的数据。







 

小结

 

Label Security是与正规的表授权一起工作的。在完成CRUD授权之前,用户不能进行SELECT, INSERT, UPDATE, 或 DELETE 或DELETE操作。当一个SQL查询访问一个表时,Oracle Label Security将首先检查CRUD访问是否合适,然后,如果有一个安全策略被应用于一个表,则它将确保该访问被执行。

 

一般来说,Label Security 总是将security policy column放在where条件中,可以考虑与表分区结合提升查询性能。

最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告