一个不错的博客,东东还多些!http://onlyzq.cnblogs.com
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
强制访问控制是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)安全标记 创建一个安全标记:
安全标记可以应用到用户、行和列上。在插入数据时,也可以指定直接指定安全标记串,规则为按策略中组件的顺序,依次指定组件值,同一个组件的不同值用逗号隔开,不同组件之间用冒号隔开。 1.2策略应用 (1)用户安全标记 授予安全标记给用户时,同时可以指定访问权限。 GRANT SECURITY LABEL DataAccess.ManagerLabel TO USER JOE FOR READ ACCESS; 其中一个用户能被授予多个安全标记,但对于一个安全策略中的标记最多只能授予一个读访问权限安全标记和一个写访问权限安全标记。 (2)行级安全标记 使用安全标记在行级保护表。
DB2SECURITYLABEL是标记列的类型,实际内部处理为VARBINARY(128)。标记列隐含是NOT NULL WITH DEFAULT,默认值是用户的写安全标记。 (3)列级安全标记 使用安全标记在列级保护表。
(4)表级安全标记 标记安全标记实际是利用列级安全标记实现。
在所有的列上设置同一个安全标记,把一个表作为一个整体和一个安全标记关联,这样节约了行级安全标记比较的时间开销和存储的空间开销。 注意:一个表上只能有一个安全策略,一个列上也只能使用表中安全策略的一个标记,一个表上也只能有一个行级标记列。 1.3访问规则 创建安全策略的时候,就必须指定标记的比较规则。DB2LABCRULES为现有的唯一比较规则,分为读规则和写规则。 读规则:
写规则:
通过DB2LBACREADARRAY和DB2LBACWRITEARRAY可以看到,读写规则实际是“同级写,向下读”。 1.4访问特权 授予用户特权: GRANT EXEMPTION ON RULE DB2LBACREADSET FOR DataAccess TO USER JOE 这里特权的含义就是在对指定规则的免除,即用户在访问数据时不用遵照指定规则。 特权的类型如下:
1.5系统冲突 (1)与视图的冲突:用户访问视图的用户的标记去访问基表,即直接对基表实施标记保护。 (2)与参照完整性的冲突:不对内部生成的引用表扫描应用 LBAC 读访问规则;不对内部生成的被引用表扫描应用 LBAC 读访问规则;当对引用表执行 CASCADE 操作时,应用 LBAC 写规则。 (3)与CHECK约束的冲突:在验证CHECK约束时,不应用LBAC读规则。 (4)与主键和唯一键约束的冲突:在验证一个主键或唯一键约束时,不应用LBAC规则。(如果推理信息是一个问题,那么对唯一键的列加一个列标记吧) (5)与索引覆盖的冲突:系统优化,直接使用索引获取数据时,如果索引列中包含标记列,则执行该优化,否则不执行该优化。 (6)可以和水平分区相结合。 1.6系统权限 (1)安全管理员权限(SECADM),执行如下操作需要该权限。
SYSADM是唯一可以授予SECADM权的用户,其并不固有的能访问一个受保护的表。 (2)SETSESSIONUSER权限 改变当前用户授权ID到一个不同的授权ID,实际就是切换用户来访问不同的数据。SETSESSIONUSER能被授予给一个用户或组,该权限允许拥有者切换ID到任何一个拥有该权限的用户ID。切换语句为SET SESSION AUTHORIZATION。 2.1安全元素 (1)标记组件 有三种不同的组件:级、格和组。 a)级(level) 级用于标识数据的敏感度的级别,数据越敏感其级越高。每个级的组成形式有数字形式和字符形式。数字的范围在0-9999之间。 创建级的存储过程:
b)格(compartment) 格用于数据标签的敏感度的区域,格没有级别。格的数字和字符形式和级类似,不同的是各个格之间没有敏感度高低之分。格最多可以包含10000个元素。 创建格的存储过程:
c)组(group) 组用于标识拥有或访问数据的组织结构。属于同一个部门的数据的标签可以具有同一个组。组是分等级的,用户可以利用组来根据自身的组织结构标识数据。组最多可以包含10000个元素。 创建组的存储过程:
(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个字符,包括数字,空格和下划线。标签字符串是大小写不敏感,并且均以大写形式显示。 当一个合法的标记被创建时,一个数字标识与此标记的字符串相关联。这个数字标识用于存储在表格的标记列中。 创建标记的存储过程:
2.2策略应用 (1)用户安全标记 在一个用户上应用一个策略,分别指定级、格和组。 指定最大级、默认级、行插入级和最小级。四个级之间的关系是max_level>=def_level>=row_level>=min_level。 指定等级的存储过程:
指定格要指定读集合、写集合、默认集合和行插入集合。其中读集合包含写集合和默认集合,行插入集合包含于写集合和默认集合。
指定组同指定格。 指定组的存储过程:
用户进入系统后会生成一个会话标记和一个行插入标记。会话标签等于默认级加上默认格集合加上默认组集合。行插入标记同理可得。用户可以修改自己的会话标记和行插入标记,但必须是在合理的范围内。 (2)行级安全标记 策略能应用到表上,将在表中增加一列,以记录每一元组的标签,管理员可以选择显示或者隐藏这一列。缺省地,这一列的数据类型是NUMBER,此列在表或者模式上应用策略时增加进去,而不是在创建策略时。在删除一个策略时,凡是应用了策略的基表,可以指明将标签列删除,也可以不删除,从基表或模式中清除一个策略时,同样可以指明将标签列删除,也可以不删除。在已有数据的基表上应用安全策略,新增加的标签列取值为NULL。 一个表上可以应用多个策略,一个策略可以应用到多个表上。 在表上应用策略的存储过程:
策略同时能应用到模式上,即对模式里的所有没有应用该策略的表都应用该策略。不管何时,在模式下创建一个新的表,则自动应用该策略。
2.3访问规则 用户必须包含表上的所有策略才能对表中数据进行访问。对其中每一个标记都进行读访问控制或写访问控制。 读访问规则:
2.4 访问特权 访问特权包括READ、FULL、COMPACCESS和PROFILE_ACCESS。
2.5系统冲突 对于冲突的处理,《ORACLE LABEL SECURITY》中没有进行具体描述。 2.6系统权限 为了能完成标记安全功能,实施标记安全的用户的必须具有如下角色和权限:
3、DM6 MAC 3.1安全元素 (1)安全元素 a)等级:线性有序,一个策略中最多能定义32767个等级,每个等级对应一个正整数,介于1-32767之间。 创建等级的语句是: ALTER POLICY P1 ADD LEVEL L1 AS 1; 创建范围的语句是: ALTER POLICY P1 ADD CATEGORY C1; c)组:树形结构,有父子之分。可以用来描述组织结构。一个组最多只能拥有64个元素,也就是说组织结构的层次最多为64。 创建组的语句是:
(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来修改用户插入数据的默认标记 在用户上应用策略的语句是:
表上应用策略 在一个表上应用策略,来实现用户对行的访问控制。该策略对应建立一个标记列,用来存储该行数据的标记。标记列有一个属性“是否隐藏”。如果隐藏,除非显式指定该列,查询时不显示该列,插入时也不用为该列指定值;如果不隐藏,则和普通的列没有差别。初始标记值作为表上已有数据的标记值。一个表上可以应用多个策略,最多为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 强制访问控制功能对比
|