DB2、ORACLE和DM的强制访问控制模型对比

本文从标记安全的六个方面对DB2、ORACLE和DM的模型进行描述,这个六个方面分别是:安全元素、策略应用、访问规则、访问特权、系统冲突、系统权限。

  强制访问控制是B1级安全产品必须实现的一个基本安全特性,达梦数据库安全版的强制访问控制功能在实现过程中研究并吸取了现有主流数据库产品的部分安全实现机制,包括DB2的LBAC(Label Based Access Control)和ORACLE的LABEL SECRURITY。下面将从标记安全的六个方面对DB2、ORACLE和DM的模型进行描述,这个六个方面分别是:安全元素、策略应用、访问规则、访问特权、系统冲突、系统权限。

  1 DB2 LBAC

  1.1安全元素

  (1)安全标记组件

  支持三种类型的组件:数组、集合和树型。

  a)创建数组组件

  CREATE SECURITY LABEL COMPONENT level ARRAY [ ’Top Secret’, ’Secret’, ’Employee’, ’Public’ ]

  b)创建集合组件

  CREATE SECURITY LABEL COMPONENT project Set ={’A’, ’B’, ’C’, ’D’}

  c)创建树型组件

  CREATE SECURITY LABEL COMPONENT department Tree={’G1’ ROOT, ’G2’ UNDER ’G1’, ’G2’ UNDER ’G1’}

  其中每个元素的名称不能超过32个字节,且同一组件内名称不能重复;数组最多可以包含65535个元素,集合和树型最多能包含64个元素。

  (2)安全策略

  创建一个安全策略:

  CREATE SECURITY POLICY DataAccess COMPONENTS level,department WITH DB2LABCRULES

  定义一个策略要指定标记组件和访问规则。每个策略最多只能包含16个标记组件。系统现在只支持一中访问规则DB2LABCRULES,这个在访问规则小节中详细讲述。

  (3)安全标记

  创建一个安全标记:

以下是引用片段:
  CREATE SECURITY LABEL DataAccess.ManagerLabel COMPONENT level ’secret’
  project ’A’, ’B’, ’C’
  department ’G1’;

  安全标记可以应用到用户、行和列上。在插入数据时,也可以指定直接指定安全标记串,规则为按策略中组件的顺序,依次指定组件值,同一个组件的不同值用逗号隔开,不同组件之间用冒号隔开。

  1.2策略应用

  (1)用户安全标记

  授予安全标记给用户时,同时可以指定访问权限。

  GRANT SECURITY LABEL DataAccess.ManagerLabel TO USER JOE FOR READ ACCESS;

有三类访问权限:READ ACCESS、WRITE ACCESS和ALL ACCESS。如果读写安全标记同时存在,必须满足如下条件:数组类型组件的值,两个安全标记中必须相同;集合类型组件的值,写访问权限安全标记必须包含于读访问权限安全标记中;树类型组件的值,写访问权限安全标记必须和读访问权限安全标记相同或者其子孙节点。

  其中一个用户能被授予多个安全标记,但对于一个安全策略中的标记最多只能授予一个读访问权限安全标记和一个写访问权限安全标记。

  (2)行级安全标记

  使用安全标记在行级保护表。

以下是引用片段:
  CREATE TABLE T1 (
  A DB2SECURITYLABEL,
  B INTEGER,
  C CHAR(5))
  SECURITY POLICY DataAccess

  DB2SECURITYLABEL是标记列的类型,实际内部处理为VARBINARY(128)。标记列隐含是NOT NULL WITH DEFAULT,默认值是用户的写安全标记。

  (3)列级安全标记

  使用安全标记在列级保护表。

以下是引用片段:
  CREATE TABLE T1 (
  A CHAR(8) SECURED WITH ManagerLabel,
  B INTEGER,
  C CHAR(5))
  SECURITY POLICY DataAccess

  (4)表级安全标记

  标记安全标记实际是利用列级安全标记实现。

以下是引用片段:
  CREATE TABLE T1 (
  A CHAR(8) SECURED WITH ManagerLabel,
  B INTEGER SECURED WITH ManagerLabel,
  C CHAR(5) SECURED WITH ManagerLabel)
  SECURITY POLICY DataAccess

  在所有的列上设置同一个安全标记,把一个表作为一个整体和一个安全标记关联,这样节约了行级安全标记比较的时间开销和存储的空间开销。

  注意:一个表上只能有一个安全策略,一个列上也只能使用表中安全策略的一个标记,一个表上也只能有一个行级标记列。

  1.3访问规则

  创建安全策略的时候,就必须指定标记的比较规则。DB2LABCRULES为现有的唯一比较规则,分为读规则和写规则。

  读规则:

  •    DB2LBACREADARRAY:用户安全标记的数组组件必须大于或等于对象安全标记的数组组件;
  •    DB2LBACREADSET:用户安全标记的集合组件必须包含对象安全标记的集合组件;
  •    DB2LBACREADTREE:用户标签的树组件必须至少包含一个对象安全标记的树组件元素(或这些元素的祖先)。
写规则:
  •    DB2LBACWRITEARRAY:用户安全标记的数组组件必须等于对象安全标记的数组组件;
  •    DB2LBACWRITESET:同读规则;
  •    DB2LBACWRITETREE:同读规则。

  通过DB2LBACREADARRAY和DB2LBACWRITEARRAY可以看到,读写规则实际是“同级写,向下读”。

  1.4访问特权

  授予用户特权:

  GRANT EXEMPTION ON RULE DB2LBACREADSET FOR DataAccess TO USER JOE

  这里特权的含义就是在对指定规则的免除,即用户在访问数据时不用遵照指定规则。

  特权的类型如下:

  •    DB2LBACREADARRAY
  •    DB2LBACREADSET
  •    DB2LBACREADTREE
  •    DB2LBACWRITEARRAY WRITEDOWN
  •    DB2LBACWRITEARRAY WRITEUP
  •    DB2LBACWRITESET
  •    DB2LBACWRITETREE
  •    ALL
  1.5系统冲突

  (1)与视图的冲突:用户访问视图的用户的标记去访问基表,即直接对基表实施标记保护。

  (2)与参照完整性的冲突:不对内部生成的引用表扫描应用 LBAC 读访问规则;不对内部生成的被引用表扫描应用 LBAC 读访问规则;当对引用表执行 CASCADE 操作时,应用 LBAC 写规则。

  (3)与CHECK约束的冲突:在验证CHECK约束时,不应用LBAC读规则。

  (4)与主键和唯一键约束的冲突:在验证一个主键或唯一键约束时,不应用LBAC规则。(如果推理信息是一个问题,那么对唯一键的列加一个列标记吧)

  (5)与索引覆盖的冲突:系统优化,直接使用索引获取数据时,如果索引列中包含标记列,则执行该优化,否则不执行该优化。

  (6)可以和水平分区相结合。

  1.6系统权限

  (1)安全管理员权限(SECADM),执行如下操作需要该权限。

  •    创建和删除标记组件
  •    创建和删除安全策略
  •    创建和删除安全标记
  •    授予和回收安全标记
  •    授予和回收免除权
  •    授予和回收SETSESSIONUSER权

  SYSADM是唯一可以授予SECADM权的用户,其并不固有的能访问一个受保护的表。

  (2)SETSESSIONUSER权限

  改变当前用户授权ID到一个不同的授权ID,实际就是切换用户来访问不同的数据。SETSESSIONUSER能被授予给一个用户或组,该权限允许拥有者切换ID到任何一个拥有该权限的用户ID。切换语句为SET SESSION AUTHORIZATION。

2 ORACLE LABEL SECURITY

  2.1安全元素

  (1)标记组件

  有三种不同的组件:级、格和组。

  a)级(level)

  级用于标识数据的敏感度的级别,数据越敏感其级越高。每个级的组成形式有数字形式和字符形式。数字的范围在0-9999之间。

  创建级的存储过程:

以下是引用片段:
  PROCEDURE CREATE_LEVEL (
  policy_name IN VARCHAR2, // 策略名
  level_num IN INTEGER, // 级号
  short_name IN VARCHAR2, // 短名称
  long_name IN VARCHAR2); // 长名称

  b)格(compartment)

  格用于数据标签的敏感度的区域,格没有级别。格的数字和字符形式和级类似,不同的是各个格之间没有敏感度高低之分。格最多可以包含10000个元素。

  创建格的存储过程:

以下是引用片段:
  PROCEDURE CREATE_COMPARTMENT (
  policy_name IN VARCHAR2, // 策略名
  comp_num IN INTEGER, // 格号
  short_name IN VARCHAR2, // 短名称
  long_name IN VARCHAR2); // 长名称

  c)组(group)

  组用于标识拥有或访问数据的组织结构。属于同一个部门的数据的标签可以具有同一个组。组是分等级的,用户可以利用组来根据自身的组织结构标识数据。组最多可以包含10000个元素。

  创建组的存储过程:

以下是引用片段:
  PROCEDURE CREATE_GROUP (
  policy_name IN VARCHAR2, // 策略名
  group_num IN INTEGER, // 组号
  short_name IN VARCHAR2, // 短名称
  long_name IN VARCHAR2, // 长名称
  parent_name IN VARCHAR2 DEFAULT NULL); // 父组名


(1)策略

  一个策略必须包含一个等级组件,最多只能包含一个格和一个组组件。

  创建策略存储过程:

  PROCEDURE CREATE_POLICY (

  policy_name IN VARCHAR2, // 策略名

  column_name IN VARCHAR2 DEFAULT NULL, //标记列的默认名

  default_options IN VARCHAR2 DEFAULT NULL); //默认选项

  (2)标记

  标签的语法:

  LEVEL:COMPARTMENT1,...,COMPARTMENTn:GROUP1,...,GROUPn

  标签字符串的最大长度为4000个字符,包括数字,空格和下划线。标签字符串是大小写不敏感,并且均以大写形式显示。

  当一个合法的标记被创建时,一个数字标识与此标记的字符串相关联。这个数字标识用于存储在表格的标记列中。

  创建标记的存储过程:

以下是引用片段:
  PROCEDURE CREATE_LABEL (
  policy_name IN VARCHAR2, // 策略名
  label_tag IN INTEGER, // 标记号
  label_value IN VARCHAR2, // 标记值
  data_label IN BOOLEAN DEFAULT TRUE); // 是否为数据标记\
  2.2策略应用

  (1)用户安全标记

  在一个用户上应用一个策略,分别指定级、格和组。

  指定最大级、默认级、行插入级和最小级。四个级之间的关系是max_level>=def_level>=row_level>=min_level。

  指定等级的存储过程:

以下是引用片段:
  PROCEDURE SET_LEVELS (
  policy_name IN VARCHAR2, // 策略名
  user_name IN VARCHAR2, // 用户名
  max_level IN VARCHAR2, // 最大级
  min_level IN VARCHAR2 DEFAULT NULL, // 最小级
  def_level IN VARCHAR2 DEFAULT NULL, // 默认级
  row_level IN VARCHAR2 DEFAULT NULL); // 行插入级

  指定格要指定读集合、写集合、默认集合和行插入集合。其中读集合包含写集合和默认集合,行插入集合包含于写集合和默认集合。

指定格的存储过程:

以下是引用片段:
  PROCEDURE SET_COMPARTMENTS (
  policy_name IN VARCHAR2, // 策略名
  user_name IN VARCHAR2, // 用户名
  read_comps IN VARCHAR2, // 读集合
  write_comps IN VARCHAR2 DEFAULT NULL, // 写集合
  def_comps IN VARCHAR2 DEFAULT NULL, // 默认集合
  row_comps IN VARCHAR2 DEFAULT NULL); // 行插入集合

  指定组同指定格。

  指定组的存储过程:

以下是引用片段:
  PROCEDURE SET_GROUPS (
  policy_name IN VARCHAR2, // 策略名
  user_name IN VARCHAR2, // 用户名
  read_groups IN VARCHAR2, // 读集合
  write_groups IN VARCHAR2 DEFAULT NULL, // 写集合
  def_group IN VARCHAR2 DEFAULT NULL, // 默认集合
  row_groups IN VARCHAR2 DEFAULT NULL); // 行插入集合

  用户进入系统后会生成一个会话标记和一个行插入标记。会话标签等于默认级加上默认格集合加上默认组集合。行插入标记同理可得。用户可以修改自己的会话标记和行插入标记,但必须是在合理的范围内。

  (2)行级安全标记

  策略能应用到表上,将在表中增加一列,以记录每一元组的标签,管理员可以选择显示或者隐藏这一列。缺省地,这一列的数据类型是NUMBER,此列在表或者模式上应用策略时增加进去,而不是在创建策略时。在删除一个策略时,凡是应用了策略的基表,可以指明将标签列删除,也可以不删除,从基表或模式中清除一个策略时,同样可以指明将标签列删除,也可以不删除。在已有数据的基表上应用安全策略,新增加的标签列取值为NULL。

  一个表上可以应用多个策略,一个策略可以应用到多个表上。

  在表上应用策略的存储过程:

以下是引用片段:
  PROCEDURE APPLY_TABLE_POLICY (
  policy_name IN VARCHAR2, // 策略名
  schema_name IN VARCHAR2, // 模式名
  table_name IN VARCHAR2, // 表名
  table_options IN VARCHAR2 DEFAULT NULL, // 表选项
  label_function IN VARCHAR2 DEFAULT NULL, // 标记值
  predicate IN VARCHAR2 DEFAULT NULL); // 读控制谓词

  策略同时能应用到模式上,即对模式里的所有没有应用该策略的表都应用该策略。不管何时,在模式下创建一个新的表,则自动应用该策略。

在模式上应用策略的存储过程:

以下是引用片段:
  PROCEDURE APPLY_SCHEMA_POLICY (
  policy_name IN VARCHAR2, // 策略名
  schema_name IN VARCHAR2, // 模式名
  default_options IN VARCHAR2 DEFAULT NULL); // 默认选项

  2.3访问规则

  用户必须包含表上的所有策略才能对表中数据进行访问。对其中每一个标记都进行读访问控制或写访问控制。

  读访问规则:

  •    用户的默认级必须大于等于数据的级
  •    用户的默认标记必须包含至少一个数据的组(或者是其某一个的父亲组)
  •    用户的默认标记必须包含数据的所有的格
  •    写访问规则:
  •    数据标签的级必须大于等于用户标签的最小级,小于或等于用户的会话标签的级;
  •    当存在组时,用户标签的有写权限的组必须至少包含一个出现在数据标签中的组(也可以是父亲组)。另外,用户标签的格必须包含所有数据标签的格;
  •    如果不存在组,用户标签必须包含数据标签中的所有的格,并有写权限。

  2.4 访问特权

  访问特权包括READ、FULL、COMPACCESS和PROFILE_ACCESS。

  •    READ: 用户可以访问任何被策略保护的数据,而不用管其授权和会话标签,甚至可以没有标签授权。
  •    FULL:利用FULL特权用户可以写任何数据,此时不用强制执行读访问和写访问算法。
  •    行标记特权包括WRITEUP、WRITEDOWN和WRITEACROSS。
  •    WRITEUP:用户可以提升一个行的级,而不用管组和格。这个提升的级最高可以至用户的最高的级。并且这个行的原始的级可能比用户的最低的级还低。
  •    WRITEDOWN:用户可以降低一个行的级,而不用管组和格。这个降低的级最低可以至用户的最低的级。并且这个行的原始的级可能比用户的最低的级还低
  •    WRITEACROSS:用户可以修改数据的组和格,而不用修改数据的级。在保证数据的标签为合法的前提下,这个修改没有其他限制。用户可以把他能够访问的组修改至一个他不能访问的组。
  2.5系统冲突

  对于冲突的处理,《ORACLE LABEL SECURITY》中没有进行具体描述。

  2.6系统权限

  为了能完成标记安全功能,实施标记安全的用户的必须具有如下角色和权限:

  •    LBAC_DBA role
  •    EXECUTE privilege on the SA_SYSDBA package

  3、DM6 MAC

  3.1安全元素

  (1)安全元素

  a)等级:线性有序,一个策略中最多能定义32767个等级,每个等级对应一个正整数,介于1-32767之间。

  创建等级的语句是:

  ALTER POLICY P1 ADD LEVEL L1 AS 1;

b)范围:独立无序,范围之间是平等关系。一个策略中能最多能包含64个范围。

  创建范围的语句是:

  ALTER POLICY P1 ADD CATEGORY C1;

  c)组:树形结构,有父子之分。可以用来描述组织结构。一个组最多只能拥有64个元素,也就是说组织结构的层次最多为64。

  创建组的语句是:

以下是引用片段:
  ALTER POLICY P1 ADD GROUP G1 AS ROOT;
  ALTER POLICY P1 ADD GROUP G2 UNDER G1;

  (2)安全策略

  一个安全策略至少包含一个等级元素,最多包含一个范围和组元素。

  创建策略的语句是:

  CREATE POLICY P1;

  (3)安全标记

  LEVEL:CATEGORY1,..., CATEGORYn:GROUP1,...,GROUPn

  标记列的存储结构如图3.1所示:

标记列存储格式

  图3.1 标记列存储格式

  标记的类型为VARBINARY(20),第一个字节为标志;接着两个字节表示等级,最多可以表示65535个等级;接着八个字节表示范围,即64个位分别代表一个范围;接着八个字节表示组,也是64个位分别代表一个组。用位表示都是从低位到高位,位的序号对应范围或组的ID。

  为了尽可能的压缩存储空间,用标志字节的高4个位表示范围存储的实际字节数,低四为表示组存储的实际字节数。因为用户实际定义的范围和组的数量不到64个,这样能压缩不少存储空间。

  3.2策略应用

  (1)在用户上应用策略

  对用户应用一个策略,要指定一个最高等级、最低等级、默认等级和行等级,其中默认等级介于最高等级和最低等级之间,最高等级限制了用户最高的读写权限,最低等级限制了用户的写权限,默认等级表示用户登录时会话标记的等级,行等级表示插入一行数据的标记使用的等级;指定范围和组,对范围和组可以分别设定三个属性:写属性、默认属性和行属性。写属性表示在该范围或组里用户是否有写权限;默认属性表示用户登录时会话标记的范围或组;行属性表示用户插入一行数据的标记使用的范围或组。

  用户登录DM数据库后,有一个会话标记,该标记由默认等级、默认范围和默认组组成。它决定用户对数据的访问权限。用户插入一行数据,如果不指定数据的标记,则系统默认有一个行标记,该标记由行等级、有行属性的范围和组组成。用户可以通过SET_SESSION_LABEL来修改用户当前连接,通过SET_ROW_LABEL来修改用户插入数据的默认标记

  在用户上应用策略的语句是:

以下是引用片段:
  ALTER USER POLICY U1 ADD POLICY P1
  MAX LEVEL L1 MIN LEVEL L4 DEF LEVEL L2 ROW LEVEL L3
  CATEGORY C1 DEFAULT, C2 DEFAULT WRITE ROW
  GROUP G1 DEFAULT WRITE, G2 WRITE ROW


(2)在表上应用策略

  在一个表上应用策略,来实现用户对行的访问控制。该策略对应建立一个标记列,用来存储该行数据的标记。标记列有一个属性“是否隐藏”。如果隐藏,除非显式指定该列,查询时不显示该列,插入时也不用为该列指定值;如果不隐藏,则和普通的列没有差别。初始标记值作为表上已有数据的标记值。一个表上可以应用多个策略,最多为32个,一个策略可以应用到多个表上。

  在表上应用策略的语句是:

  ALTER TABLE POLICY T1 ADD POLICY P1 COLUMN P1_LAB NOT HIDE LABEL ‘L1:C1:G1, G2’;

  3.3访问规则

  用户能访问一个表,必须拥有该表上所有策略的标记,而且满足以下规则才能做相应的访问。用户标记指用户的会话标记,和行的标记进行比较。

  读访问规则:

  •    用户的默认等级必须大于等于数据的等级;
  •    用户的默认标记必须包含至少一个数据的组(或者是其某一个的父亲组);
  •    用户的默认标记必须包含数据的所有的范围。

  写访问规则:

  •    数据标记的等级必须大于等于用户标记的最小等级,小于或等于用户的会话标记的等级;
  •    用户的标记必须包含至少一个数据的组(或者是其某一个的父亲组)的写权限;
  •    用户的标记必须包含数据的所有的范围上的写权限。
  3.4访问特权

  同2.4节,不包含特权COMPACCESS和PROFILE_ACCESS。

  授予特权的语句是:

  ALTER USER POLICY U2 MODIFY P1 GRANT FULL;

  3.5系统冲突

  同1.5节中1-5条,增加了如下冲突处理:

  (1)存储过程和触发器的冲突:同视图处理,只对存储过程和触发器中操作的表实施强制访问控制,并不对存储过程和触发器的执行进行强制访问控制。

  (2)与水平分区的冲突:可以对水平分区表应用策略,但不能按标记列的值进行水平分区。

  (3)与垂直分区的冲突:在垂直分区表上不能应用策略,因为垂直分区表上不允许修改表结构。

  3.6系统权限

  进行标记管理的用户必须具有DB_POLICY_ADMIN或DB_POLICY_OPER权限。系统默认安全管理员为SYSSSO。

  系统安全员本身不能访问任何用户数据,只能访问系统字典表,进行策略的维护、表策略的应用和用户策略的应用。

  4、总结

  下面对基于标记的强制访问控制做一个简单的功能比较,当然,实际ORACLE和DB2的实现要复杂得多。DM强制访问控制有待实际需求来进一步完善。

  表4.1 强制访问控制功能对比

功能
ORACLE
DB2
DM6
等级(level)
范围(category)
组织(group)
一个策略支持三个以上组件
×
×
一个策略应用到多个表
一个表上应用多个策略
×
标记列隐藏
×
行级标记
列级标记
×
×
表级标记
×
×
对模式应用标记
×
×
标记比较规则可选固定
×
×
用户会话标记
读写权限标记分离
特权

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值