三权分立的应用.docx
- 文档编号:4533980
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:10
- 大小:62.04KB
三权分立的应用.docx
《三权分立的应用.docx》由会员分享,可在线阅读,更多相关《三权分立的应用.docx(10页珍藏版)》请在冰豆网上搜索。
三权分立的应用
三权分立的应用
三权分立的应用
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.2DM的强制访问控制
DM5为每个表都提供了自主访问控制(DAC,DiscretionaryAccessControl),除此之外,其还利用标记提供了强制访问控制(MAC,MandatoryAccessControl)。
当在一个表上应用了基于标记的一个安全策略时,每条元组均具备了与该策略相关的一个标记(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称为非等级类别(以下简称为范围)。
:
:
B1,B2
B1,B2
(2)标记的存储及标记列
标记以数字标识的形式存储于数据库中。
当一个策略被应用到表上时,需要指定标记的存储列名,此列的类型为VARBINARY,此时表上每条元组的标记均存在于该列中。
存储格式为:
标志
(2)
等级
(2)
范围(N)
两个字节的标志位表示范围占用的字节数;等级占用两个字节;范围占用0-2000个字节。
在范围字段中,用位图来表示范围是否存在。
在应用策略时,还可设置标记列是否被隐藏,即用户在做插入时,若不指定列清单,则在值列表中可以不设置该列的值,另外,在查询时,也不显示该列数据。
标记列与表上的其他列的处理基本一样,可以建索引,设置列约束、改列名等,但不能被用户显式删除,除非在表上取消该策略。
为了便于用户进行标记的设置及查询等操作,DM提供了一些标记转换函数,用于将其与数字标识进行相互转换。
具体如下:
VARCHAR(2000)
LABEL_TO_CHAR(POLICY_NAMEVARCHAR(128), //策略名
LABELVARBINARY(1024)) //标记二进制串
该函数用于将标记数字标识转换为字符串格式的标记。
BIGINT
LABEL_FROM_CHAR(POLICY_NAMEVARCHAR(128), //策略名
LABEL_STRVARCHAR(2000)) //字符串标记
该函数用于将字符串格式的标记转换为其数字标识。
2应用举例
现通过一个具体的应用来说明三权分立的应用。
2.1应用背景
假设某公司有一套办公OA系统,主要用于填写工作周报。
填写工作周报的部门有:
开发部(编号:
KF)、测试部(编号:
CS)、市场部(编号:
SC)和人力资源部(编号:
HR)。
要求每个部门的员工只能写本部门的工作周报,除了人力资源部外每个部门的员工只能查看自己部门的工作周报,不能查看其他部门的工作周报;人力资源部可以查看所有部门员工的工作周报,但不能修改和删除任何工作周报记录。
要求将数据权限控制到行级。
假设存储工作周报信息的表名为work_info,其表结构如下:
表1 工作周报表结构
字段名
类型
中文说明
id
varchar(20)
工作周报标识号
work_content
content
工作周报内容
user_id
varchar(20)
填写周报的员工id
张三是开发部员工,李四是测试部员工,王五是市场部员工,小明是人力资源部员工。
他们对表work_info中各部门的数据的读写权限矩阵如下:
表2 用户对表work_info中数据万维网的读写权限矩阵
部门
权限
张三
李四
王五
小明
开发部
读权限
√
√
写权限
√
测试部
读权限
√
√
写权限
√
市场部
读权限
√
√
写权限
√
人力资源部
读权限
√
写权限
√
2.2应用三权分立
(1)用SYSDBA用户登录数据库,建立数据库;
创建名为sqfldb的数据库,登录名和用户名均为sqfl,密码为123123。
脚本如下:
--以SYSDBA登录,创建数据库和登录用户
createdatabasesqfldbdatafile'sqfldb.dbf'size128;
setcurrentdatabasesqfldb;
createloginsqflidentifiedby"123123"defaultdatabasesqfldb;
createusersqfl;
grantdbatosqfl;
alterusersqflrelatedbysqfl;
(2)用sqfl用户登录数据库,创建表结构;
--以sqfl登录,创建表结构
createtablework_info(
id varchar(50)notnull,
work_content clob,
user_idvarchar(20),
primarykey(id)
);
(3)用SYSSSO用户登录数据库,创建安全策略,并对表work_info应用此策略;
根据需求,可以将每个部门编号设计为安全策略的范围。
--以SYSSSO登录
--设置当前数据库为sqfldb
setcurrentdatabasesqfldb;
--创建名为sp的安全策略
createpolicysp;
--为策略sp添加名为level1的级别
alterpolicyspaddlevellevel1as100;
--为策略sp添加范围KF,CS,SC,HR
alterpolicyspaddcategoryKF;
alterpolicyspaddcategoryCS;
alterpolicyspaddcategorySC;
alterpolicyspaddcategoryHR;
--对表work_info应用安全策略sp,标记列名为label_col,隐藏该列
altertablepolicysqfl.work_infoaddspcolumnlabel_colhidelabel'level1:
';
说明:
对应用策略的表,必须要指定标记列名,用于存放标记。
可设置标记列是否被隐藏,即用户在做插入时,若不指定列清单,则在值列表中可以不设置该列的值,另外,在查询时,也不显示该列数据。
上述脚本指定了标记列的列名为label_col,并且设置为隐藏。
即表work_info应用安全策略sp后,多了一个隐藏列label_col。
(4)为用户sqfl应用策略sp,并设置最大权限;
--以SYSSSO登录
--设置当前数据库为sqfldb
setcurrentdatabasesqfldb;
--为用户sqfl应用策略sp,级别level1,对范围KF,CS,SC,HR都有写权限
alteruserpolicysckaddsplevellevel1categoryKFwrite,CSwrite,SCwrite,HRwrite;
说明:
必须要对用户sqfl设置所有范围的写权限,否则在后续的脚本中,设置当前会话的写权限时,用户sqfl若不具有某范围的写权限,则设置会失败。
(5)插入测试数据;
通过set_read_label函数设置当前用户的读权限,通过set_write_label函数设置当前用户的写权限。
插入的记录的标记列的值为当前连接设置的写标记。
设置只对该次连接生效,并不改变字典表中用户的读写标记。
--以sqfl登录
--设置当前连接为张三的权限,对开发部(KF)有读写权限
setcurrentdatabasesqfldb;
selectset_read_label('sp','level1:
KF');
selectset_write_label('sp','level1:
KF');
insertintowork_infovalues('W001','张三周报内容W001','张三');
--说明:
此时id为W001的记录的标记列label_col已被自动填充为当前连接的写标记,即level1:
KF
--设置当前连接为李四的权限,对测试部(CS)有读写权限
setcurrentdatabasesqfldb;
selectset_read_label('sp','level1:
CS');
selectset_write_label('sp','level1:
CS');
insertintowork_infovalues('W002','李四周报内容W002','李四');
--说明:
此时id为W002的记录的标记列label_col已被自动填充为当前连接的写标记,即level1:
CS
--设置当前连接为王五的权限,对市场部(SC)有读写权限
setcurrentdatabasesqfldb;
selectset_read_label('sp','level1:
SC');
selectset_write_label('sp','level1:
SC');
insertintowork_infovalues('W003','王五周报内容W003','王五');
--说明:
此时id为W003的记录的标记列label_col已被自动填充为当前连接的写标记,即level1:
SC
--设置当前连接为小明的权限,对人力资源部(HR)有写权限,其他部门都有读权限
setcurrentdatabasesqfldb;
selectset_read_label('sp','level1:
KF,CS,SC,HR');
selectset_write_label('sp','level1:
HR');
insertintowork_infovalues('W004','小明周报内容W004','小明');
--说明:
此时id为W004的记录的标记列label_col已被自动填充为当前连接的写标记,即level1:
HR
2.3结果验证
应用了安全策略的表中的记录能被查询到的前提条件是:
假设当前连接设置的读标记为L,如果L的等级大于或等于记录中标记的等级,并且L的范围包含记录中标记的范围,则当前连接可以查询到这些记录;否则查询不到这些记录。
应用了安全策略的表中的记录能被修改或删除的前提条件是:
假设当前连接设置的写标记为L,如果L的等级等于记录中标记的等级,并且L的范围包含记录中标记的范围,则当前连接可以修改或删除这些记录;否则不可以修改或删除这些记录。
应用了安全策略的表,当前连接可以插入数据的前提条件是:
必须设置当前连接的安全策略,并且和该表上应用的策略相同。
另外,SYSDBA和SYSSSO所做的所有操作都将被审计,受到SYSAUDITOR的监督。
用SYSAUDITOR登录数据库,可以查看到所有的审计记录。
注意:
当设置当前连接的写标记时,读标记中必须包含写标记中的所有范围。
现在用以上的规则验证应用了安全策略后的结果:
(1)以sqfl登录,用张三的身份查询数据;
--以sqfl登录
--设置当前连接为张三的权限
setcurrentdatabasesqfldb;
selectset_read_label('sp','level1:
KF');
selectset_write_label('sp','level1:
KF');
selectid,work_content,user_id,label_col,label_to_char('sp',label_col)fromwork_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列的数字标识值(如x010*******)会因数据库不同而有可能不同。
该说明适用于下面所有使用到label_col列和label_to_char函数的地方。
(2)以sqfl登录,用李四的身份查询数据;
--以sqfl登录
--设置当前连接为李四的权限
setcurrentdatabasesqfldb;
selectset_read_label('sp','level1:
CS');
selectset_write_label('sp','level1:
CS');
selectid,work_content,user_id,label_col,label_to_char('sp',label_col)fromwork_info;
查询结果:
id work_content user_id label_col 表达式1
-----------------------------------------------------------------
W002 李四周报内容W002 李四 0x0100640002 level1:
CS
结果说明:
由于用户李四只对测试部的数据有读写权限,所以只查询到id为W002的记录。
测试部的所有用户都可以看到id为W002的记录。
实际上,字符串标记中的等级小于或等于level1的值100且范围中包含有CS的记录都可以被测试部的用户看到。
(3)以sqfl登录,用王五的身份查询数据;
--以sqfl登录
--设置当前连接为王五的权限
setcurrentdatabasesqfldb;
selectset_read_label('sp','level1:
SC');
selectset_write_label('sp','level1:
SC');
selectid,work_content,user_id,label_col,label_to_char('sp',label_col)fromwork_info;
查询结果:
id work_content user_id label_col 表达式1
-----------------------------------------------------------------
W003 王五周报内容W003 王五 0x0100640003 level1:
SC
结果说明:
由于用户王五只对市场部的数据有读写权限,所以只查询到id为W003的记录。
市场部的所有用户都可以看到id为W003的记录。
实际上,字符串标记中的等级小于或等于level1的值100且范围中包含有SC的记录都可以被市场部的用户看到。
(4)以sqfl登录,用小明的身份查询数据;
--以sqfl登录
--设置当前连接为小明的权限
setcurrentdatabasesqfldb;
selectset_read_label('sp','level1:
KF,CS,SC,HR');
selectset_write_label('sp','level1:
HR');
selectid,work_content,user_id,label_col,label_to_char('sp',label_col)fromwork_info;
查询结果:
id work_content user_id label_col 表达式1
-----------------------------------------------------------------
W001 张三周报内容W001
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 三权分立 应用