三权分立的应用

文章来自达梦技术社区http://bbs.dameng.com/

  摘要:在数据库的应用系统中,有时需要将数据访问的权限控制到行级,通过应用系统实现的方法也有很多,但如何保障高安全性、提高大数据量的查询效率问题一直是人们讨论的话题。达梦数据库(简称DM)三权分立安全管理机制提供了很好的解决方案。利用DM的强制访问控制,可以使数据的访问粒度达到行级,具有控制灵活,高安全性、即使数据量较大时查询效率高等特点。本文从一个实际应用为例,介绍DM三权分立的应用,为应用系统提供一套解决方案以做参考。
1 三权分立简介
   摘要:在数据库的应用系统中,有时需要将数据访问的权限控制到行级,通过应用系统实现的方法也有很多,但如何保障高安全性、提高大数据量的查询效率问题一直是人们讨论的话题。达梦数据库(简称DM)三权分立安全管理机制提供了很好的解决方案。利用DM的强制访问控制,可以使数据的访问粒度达到行级,具有控制灵活,高安全性、即使数据量较大时查询效率高等特点。本文从一个实际应用为例,介绍DM三权分立的应用,为应用系统提供一套解决方案以做参考。
1 三权分立简介
   DM三权分立安全管理机制旨在构建高安全性数据库,以三权分立安全管理机制为基础的DM安全版数据库的安全级别已达到B1级。
 DM在安全管理方面采用了三权分立的安全管理体制,即把系统管理员分为数据库管理员DBA,数据库安全管理员SSO,数据库审计员AUDITOR三类:
(1)数据库管理员(DBA)
   系统预设了数据库管理员账号SYSDBA,每个数据库至少需要一个数据库管理员来管理,他负责安装和升级达梦数据库管理系统、配置达梦数据库参数、创建数据库对象、自主访问权限的分配、数据导入导出以及数据库的备份和恢复。
(2)数据库审计员(AUDITOR)
   系统预设了数据库审计员账号SYSAUDITOR,负责配置数据库的审计设置,定义新的数据库审计员,查看数据库的审计记录。
(3)数据库安全员(SSO)
   系统预设了数据库安全员账号SYSSSO,负责对系统进行强制访问控制,定义新的数据库安全员,设置系统的策略及标记。
 把数据库的普通用户、审计用户与标记用户的权限及相关处理完全分开,包括系统预设系统登录、用户、系统角色、用户角色及权限分配和控制。它们三者之间互相联系、互相制约,共同完成数据库的管理工作。
1.1 策略及标记的概念
   系统可定义多个策略(policy),每个策略互相独立。一个策略包括一组预定义的标记组件,包括等级分类和非等级类别。
   一个策略可以应用在多个用户或表上,在单个用户或表上也可以应用多个策略。标记用于标识数据库中主体及客体的敏感度(sensitivity)。一个标记由多个组件组成,其组件包括等级分类(level)和非等级类别(category)。每个标记必须包含一个等级分类组件,非等级类别组件则是可选的。
 (1)等级分类(level):
   它是一线性有序的名称序列,用L=(l1,l2,…,lp)表示。其中li(1≤i≤p)表示第i个名称,任意两个名称li、lj之间,若i≤j,则li≤lj,于是有l1≤l2≤…≤lp,其中l1,l2,…,lp称为等级分类(以下简称等级)。
   在DM中,一个策略最大可定义9999个等级。用户在定义策略中的等级时,需要为其指定编号,其编号在1-9999之间(编号小的意味着级别较低)。
(2)非等级类别
   设集合C = {c1,c2,…,cm}中每一元素都是一名称,c1,c2,…,cm间彼此独立,无序,则集合C及其任意子集称为非等级类别集合,其中c1,c2,…,cm称为非等级类别(以下简称为范围)。
   在DM5中,最大可定义10000个范围,范围不需要用户设置编号,且没有级别高低之分。
1.2 DM的强制访问控制
   DM5为每个表都提供了自主访问控制(DAC,Discretionary Access Control),除此之外,其还利用标记提供了强制访问控制(MAC,Mandatory Access Control)。当在一个表上应用了基于标记的一个安全策略时,每条元组均具备了与该策略相关的一个标记(LABEL),此标记反应了该元组的敏感度(sensitivity),由此,在该策略上,通过比较用户的标记与元组的标记可决定对该元组的访问级别。
   DM5的DAC策略优先于MAC策略。为了能访问一条元组,用户不仅首先要满足DAC条件,还必须满足MAC的条件。
   用户访问表时,必须保证应用于表上的所有策略均适用于该用户,否则访问被拒绝。若表上未应用任何策略,则用户只需满足DAC条件即可。读访问时,要满足用户等级大于等于数据标记的等级,用户能读的范围是数据标记范围的非空子集,则能读取改行数据;写访问(包括增删改)时,要满足用户等级等于数据标记的等级,用户能写的范围是数据标记范围的非空子集。
  在应用于表的所有策略上,用户插入一条元组时,该元组的标记即为用户的写标记(用户等级加上用户写范围组成的标记);标记列可以被显式更新,必须满足标记列更新前和更新后,用户对该元组都可写,即前后标记值中范围都是在用户写标记的范围内(同时用户标记的等级不小于元组标记的等级)。
   对于视图及存储过程,当前用户在调用它们访问数据时,其策略标记与视图及存储过程访问的任何基表上元组的策略标记的比较都必须符合上述规则。
   用户可以通过自己设置连接的读写标记,以便看到不同的数据视图。设置只对该次连接生效,并不改变字典表中用户的读写标记。DM三权分立安全管理机制旨在构建高安全性数据库,以三权分立安全管理机制为基础的DM安全版数据库的安全级别已达到B1级。
   DM在安全管理方面采用了三权分立的安全管理体制,即把系统管理员分为数据库管理员DBA,数据库安全管理员SSO,数据库审计员AUDITOR三类:
(1)数据库管理员(DBA)
  系统预设了数据库管理员账号SYSDBA,每个数据库至少需要一个数据库管理员来管理,他负责安装和升级达梦数据库管理系统、配置达梦数据库参数、创建数据库对象、自主访问权限的分配、数据导入导出以及数据库的备份和恢复。
(2)数据库审计员(AUDITOR)
   系统预设了数据库审计员账号SYSAUDITOR,负责配置数据库的审计设置,定义新的数据库审计员,查看数据库的审计记录。
(3)数据库安全员(SSO)
  系统预设了数据库安全员账号SYSSSO,负责对系统进行强制访问控制,定义新的数据库安全员,设置系统的策略及标记。
 把数据库的普通用户、审计用户与标记用户的权限及相关处理完全分开,包括系统预设系统登录、用户、系统角色、用户角色及权限分配和控制。它们三者之间互相联系、互相制约,共同完成数据库的管理工作。
1.1 策略及标记的概念
  系统可定义多个策略(policy),每个策略互相独立。一个策略包括一组预定义的标记组件,包括等级分类和非等级类别。
 一个策略可以应用在多个用户或表上,在单个用户或表上也可以应用多个策略。标记用于标识数据库中主体及客体的敏感度(sensitivity)。一个标记由多个组件组成,其组件包括等级分类(level)和非等级类别(category)。每个标记必须包含一个等级分类组件,非等级类别组件则是可选的。
 (1)等级分类(level):
  它是一线性有序的名称序列,用L=(l1,l2,…,lp)表示。其中li(1≤i≤p)表示第i个名称,任意两个名称li、lj之间,若i≤j,则li≤lj,于是有l1≤l2≤…≤lp,其中l1,l2,…,lp称为等级分类(以下简称等级)。
   在DM中,一个策略最大可定义9999个等级。用户在定义策略中的等级时,需要为其指定编号,其编号在1-9999之间(编号小的意味着级别较低)。
(2)非等级类别
  设集合C = {c1,c2,…,cm}中每一元素都是一名称,c1,c2,…,cm间彼此独立,无序,则集合C及其任意子集称为非等级类别集合,其中c1,c2,…,cm称为非等级类别(以下简称为范围)。
   在DM5中,最大可定义10000个范围,范围不需要用户设置编号,且没有级别高低之分。
1.2 DM的强制访问控制
  DM5为每个表都提供了自主访问控制(DAC,Discretionary Access Control),除此之外,其还利用标记提供了强制访问控制(MAC,Mandatory Access Control)。当在一个表上应用了基于标记的一个安全策略时,每条元组均具备了与该策略相关的一个标记(LABEL),此标记反应了该元组的敏感度(sensitivity),由此,在该策略上,通过比较用户的标记与元组的标记可决定对该元组的访问级别。
  DM5的DAC策略优先于MAC策略。为了能访问一条元组,用户不仅首先要满足DAC条件,还必须满足MAC的条件。
  用户访问表时,必须保证应用于表上的所有策略均适用于该用户,否则访问被拒绝。若表上未应用任何策略,则用户只需满足DAC条件即可。读访问时,要满足用户等级大于等于数据标记的等级,用户能读的范围是数据标记范围的非空子集,则能读取改行数据;写访问(包括增删改)时,要满足用户等级等于数据标记的等级,用户能写的范围是数据标记范围的非空子集。
  在应用于表的所有策略上,用户插入一条元组时,该元组的标记即为用户的写标记(用户等级加上用户写范围组成的标记);标记列可以被显式更新,必须满足标记列更新前和更新后,用户对该元组都可写,即前后标记值中范围都是在用户写标记的范围内(同时用户标记的等级不小于元组标记的等级)。
  对于视图及存储过程,当前用户在调用它们访问数据时,其策略标记与视图及存储过程访问的任何基表上元组的策略标记的比较都必须符合上述规则。
   用户可以通过自己设置连接的读写标记,以便看到不同的数据视图。设置只对该次连接生效,并不改变字典表中用户的读写标记。

 设置读标记
  INT  SET_READ_LABEL(POLICY_NAME VARCHAR(128), // 策略名
       LABEL_STR VARCHAR(2000)) // 字符串标记

 设置写标记
  INT  SET_WRITE_LABEL(POLICY_NAME VARCHAR(128), // 策略名
        LABEL_STR VARCHAR(2000)) // 字符串标记

  两个函数均使用用户连接的当前库,设置成功返回1,失败返回0或错误码。
  用户设置的连接读标记的等级必须和用户标记相同,读范围是用户读范围的子集;用户设置的连接写标记的等级必须和用户标记相同,写范围是用户写范围的子集;
1.3 标记的格式和存储
(1)标记的格式 
  在DM5中,标记用字符串表示,其最大长度为2000。格式如下:

 :{,}

  在以上格式中,等级和范围必须严格按照顺序进行排列(中间不能包含空格),否则为不合法的标记。假定系统中存在策略P,其包含等级A1,A2,A3和范围B1,B2,B3,B4,则下列标记为合法标记:
 A1:
 A1:B1
 A1:B1,B2
而下列标记为不合法标记:
 A1
 A1:B1,
 :
 :B1,B2
 B1,B2
(2)标记的存储及标记列
 标记以数字标识的形式存储于数据库中。当一个策略被应用到表上时,需要指定标记的存储列名,此列的类型为VARBINARY,此时表上每条元组的标记均存在于该列中。存储格式为:

标志(2)等级(2)范围(N)

  两个字节的标志位表示范围占用的字节数;等级占用两个字节;范围占用0-2000个字节。在范围字段中,用位图来表示范围是否存在。
  在应用策略时,还可设置标记列是否被隐藏,即用户在做插入时,若不指定列清单,则在值列表中可以不设置该列的值,另外,在查询时,也不显示该列数据。
标记列与表上的其他列的处理基本一样,可以建索引,设置列约束、改列名等,但不能被用户显式删除,除非在表上取消该策略。
  为了便于用户进行标记的设置及查询等操作,DM提供了一些标记转换函数,用于将其与数字标识进行相互转换。具体如下:

 VARCHAR(2000) 
  LABEL_TO_CHAR(POLICY_NAME VARCHAR(128), // 策略名
  LABEL VARBINARY(1024))  // 标记二进制串

  该函数用于将标记数字标识转换为字符串格式的标记。

 BIGINT
  LABEL_FROM_CHAR(POLICY_NAME VARCHAR(128), // 策略名
  LABEL_STR VARCHAR(2000)) // 字符串标记

  该函数用于将字符串格式的标记转换为其数字标识。

2 应用举例
  现通过一个具体的应用来说明三权分立的应用。
2.1 应用背景
  假设某公司有一套办公OA系统,主要用于填写工作周报。填写工作周报的部门有:开发部(编号:KF)、测试部(编号:CS)、市场部(编号:SC)和人力资源部(编号:HR)。
  要求每个部门的员工只能写本部门的工作周报,除了人力资源部外每个部门的员工只能查看自己部门的工作周报,不能查看其他部门的工作周报;人力资源部可以查看所有部门员工的工作周报,但不能修改和删除任何工作周报记录。要求将数据权限控制到行级。
  假设存储工作周报信息的表名为work_info,其表结构如下:
表1    工作周报表结构

字段名类型中文说明
idvarchar(20)工作周报标识号
work_contentcontent工作周报内容
user_idvarchar(20)填写周报的员工id

  张三是开发部员工,李四是测试部员工,王五是市场部员工,小明是人力资源部员工。他们对表work_info中各部门的数据的读写权限矩阵如下:
表2    用户对表work_info中数据万维网的读写权限矩阵

部门权限张三李四王五小明
开发部读权限  
写权限   
测试部读权限  
写权限   
市场部读权限  
写权限   
人力资源部读权限   
写权限   

2.2 应用三权分立
(1)用SYSDBA用户登录数据库,建立数据库;
  创建名为sqfldb的数据库,登录名和用户名均为sqfl,密码为123123。脚本如下:

-- 以SYSDBA登录,创建数据库和登录用户
 create database sqfldb datafile 'sqfldb.dbf' size 128;
 set current database sqfldb;
 create login sqfl identified by "123123" default database sqfldb;
 create user sqfl;
 grant dba to sqfl;
 alter user sqfl related by sqfl;

(2)用sqfl用户登录数据库,创建表结构;

-- 以sqfl登录,创建表结构
 create table work_info(
  id    varchar(50) not null,
  work_content  clob,
  user_id varchar(20),
  primary key(id)
 );

(3)用SYSSSO用户登录数据库,创建安全策略,并对表work_info应用此策略;
  根据需求,可以将每个部门编号设计为安全策略的范围。

-- 以SYSSSO登录
-- 设置当前数据库为sqfldb
 set current database sqfldb;
-- 创建名为sp的安全策略
 create policy sp;
-- 为策略sp添加名为level1的级别
 alter policy sp add level level1 as 100;
-- 为策略sp添加范围KF,CS,SC,HR
 alter policy sp add category KF;
 alter policy sp add category CS;
 alter policy sp add category SC;
 alter policy sp add category HR;
-- 对表work_info应用安全策略sp,标记列名为label_col,隐藏该列
 alter table policy sqfl. work_info add sp column label_col hide label 'level1: ';

说明:对应用策略的表,必须要指定标记列名,用于存放标记。可设置标记列是否被隐藏,即用户在做插入时,若不指定列清单,则在值列表中可以不设置该列的值,另外,在查询时,也不显示该列数据。上述脚本指定了标记列的列名为label_col,并且设置为隐藏。即表work_info应用安全策略sp后,多了一个隐藏列label_col。
(4)为用户sqfl应用策略sp,并设置最大权限;

-- 以SYSSSO登录
-- 设置当前数据库为sqfldb
 set current database sqfldb;
-- 为用户sqfl应用策略sp,级别level1,对范围KF,CS,SC,HR都有写权限
 alter user policy sck add sp level level1 category KF write, CS write, SC write, HR write;

  说明:必须要对用户sqfl设置所有范围的写权限,否则在后续的脚本中,设置当前会话的写权限时,用户sqfl若不具有某范围的写权限,则设置会失败。
(5)插入测试数据;
   通过set_read_label函数设置当前用户的读权限,通过set_write_label函数设置当前用户的写权限。插入的记录的标记列的值为当前连接设置的写标记。设置只对该次连接生效,并不改变字典表中用户的读写标记。

-- 以sqfl登录
-- 设置当前连接为张三的权限,对开发部(KF)有读写权限
 set current database sqfldb;
 select set_read_label('sp','level1:KF');
 select set_write_label('sp','level1:KF');
 insert into work_info values('W001','张三周报内容W001','张三');
-- 说明:此时id为W001的记录的标记列label_col已被自动填充为当前连接的写标记,即level1:KF
 
-- 设置当前连接为李四的权限,对测试部(CS)有读写权限
 set current database sqfldb;
 select set_read_label('sp','level1:CS');
 select set_write_label('sp','level1:CS');
 insert into work_info values('W002',' 李四周报内容W002', '李四');
-- 说明:此时id为W002的记录的标记列label_col已被自动填充为当前连接的写标记,即level1:CS

-- 设置当前连接为王五的权限,对市场部(SC)有读写权限
 set current database sqfldb;
 select set_read_label('sp','level1:SC');
 select set_write_label('sp','level1:SC');
 insert into work_info values('W003','王五周报内容W003', '王五');
-- 说明:此时id为W003的记录的标记列label_col已被自动填充为当前连接的写标记,即level1:SC

-- 设置当前连接为小明的权限,对人力资源部(HR)有写权限,其他部门都有读权限
 set current database sqfldb;
 select set_read_label('sp','level1:KF,CS,SC,HR');
 select set_write_label('sp','level1:HR');
 insert into work_info values('W004','小明周报内容W004', '小明');
-- 说明:此时id为W004的记录的标记列label_col已被自动填充为当前连接的写标记,即level1:HR

2.3 结果验证
  应用了安全策略的表中的记录能被查询到的前提条件是:假设当前连接设置的读标记为L,如果L的等级大于或等于记录中标记的等级,并且L的范围包含记录中标记的范围,则当前连接可以查询到这些记录;否则查询不到这些记录。
  应用了安全策略的表中的记录能被修改或删除的前提条件是:假设当前连接设置的写标记为L,如果L的等级等于记录中标记的等级,并且L的范围包含记录中标记的范围,则当前连接可以修改或删除这些记录;否则不可以修改或删除这些记录。
  应用了安全策略的表,当前连接可以插入数据的前提条件是:必须设置当前连接的安全策略,并且和该表上应用的策略相同。
  另外,SYSDBA和SYSSSO所做的所有操作都将被审计,受到SYSAUDITOR的监督。用SYSAUDITOR登录数据库,可以查看到所有的审计记录。

注意:当设置当前连接的写标记时,读标记中必须包含写标记中的所有范围。

现在用以上的规则验证应用了安全策略后的结果:
(1)以sqfl登录,用张三的身份查询数据;

-- 以sqfl登录
-- 设置当前连接为张三的权限
 set current database sqfldb;
 select set_read_label('sp','level1:KF');
 select set_write_label('sp','level1:KF');
 select id,work_content,user_id,label_col, label_to_char('sp',label_col) from work_info;

查询结果:

 id  work_content  user_id  label_col  表达式1
-----------------------------------------------------------------
 W001 张三周报内容W001 张三  0x0100640001 level1:KF

结果说明:由于用户张三只对开发部的数据有读写权限,所以只查询到id为W001的记录。开发部的所有用户都可以看到id为W001的记录。实际上,字符串标记中的等级小于或等于level1的值100且范围中包含有KF的记录都可以被开发部的用户看到。
注意:列label_col是表work_info应用策略sp时指定的标记列,该列的数据类型为VARBINARY,通过函数label_to_char可以将标记数字标识解析为字符串格式的标记。另外label_col列的数字标识值(如0x0100640001)会因数据库不同而有可能不同。
该说明适用于下面所有使用到label_col列和label_to_char函数的地方。
(2)以sqfl登录,用李四的身份查询数据;

 -- 以sqfl登录
 --设置当前连接为李四的权限
 set current database sqfldb;
 select set_read_label('sp','level1:CS');
 select set_write_label('sp','level1:CS ');
 select id,work_content,user_id,label_col, label_to_char('sp',label_col) from work_info;

查询结果:

 id  work_content  user_id  label_col  表达式1
 -----------------------------------------------------------------
 W002 李四周报内容W002 李四  0x0100640002 level1:CS

结果说明:由于用户李四只对测试部的数据有读写权限,所以只查询到id为W002的记录。测试部的所有用户都可以看到id为W002的记录。实际上,字符串标记中的等级小于或等于level1的值100且范围中包含有CS的记录都可以被测试部的用户看到。
(3)以sqfl登录,用王五的身份查询数据;

-- 以sqfl登录
--设置当前连接为王五的权限
 set current database sqfldb;
 select set_read_label('sp','level1:SC');
 select set_write_label('sp','level1:SC ');
 select id,work_content,user_id,label_col, label_to_char('sp',label_col) from work_info;

查询结果:

 id  work_content  user_id  label_col  表达式1
-----------------------------------------------------------------
 W003 王五周报内容W003 王五  0x0100640003 level1:SC

结果说明:
  由于用户王五只对市场部的数据有读写权限,所以只查询到id为W003的记录。市场部的所有用户都可以看到id为W003的记录。实际上,字符串标记中的等级小于或等于level1的值100且范围中包含有SC的记录都可以被市场部的用户看到。
(4)以sqfl登录,用小明的身份查询数据;

-- 以sqfl登录
--设置当前连接为小明的权限
 set current database sqfldb;
 select set_read_label('sp','level1:KF,CS,SC,HR');
 select set_write_label('sp','level1:HR ');
 select id,work_content,user_id,label_col, label_to_char('sp',label_col) from work_info;

查询结果:

 id  work_content  user_id  label_col  表达式1
-----------------------------------------------------------------
 W001 张三周报内容W001 张三  0x0100640001 level1:KF
 W002 李四周报内容W002 李四  0x0100640002 level1:CS
 W003 王五周报内容W003 王五  0x0100640003 level1:SC
 W004 小明周报内容W004 小明  0x0100640004 level1:HR
结果说明:
  因为用户小明只对人力资源部有写权限,对开发部、测试部和市场部有读权限,所以可以查询到所有记录。人力资源部的所有用户都可以看到开发部、测试部、市场部和人力资源部的所有记录。实际上,字符串标记中的等级小于或等于level1的值100且范围中包含有KF、CS、SC或HR的记录都可以被人力资源部的用户看到。另外用户小明只能修改或删除id为W004的记录,对其他记录不能修改和删除,因为没有写的权限。
3 总结
  从以上应用可以看出,应用DM的三权分立可以真正实现数据行级控制,DM安全版通过高效的算法完成标记的比较,提高了大数据量时的数据查询效率,为实际应用提供了很好的解决方案。

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

转载于:http://blog.itpub.net/23392679/viewspace-627963/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值