目录
策略
等级(Level)
范围(Compartment)
组(Group)
例子
标记
对表应用策略
语法
例子
对用户应用策略
语法
例子
对会话应用策略
例子
强制访问控制功能仅在DM安全版提供
根据客体的敏感标记和主体的访问标记对客体访问实行限制的一种方法。
系统给主体和客体都分配一个特殊的安全标记,主体的安全标记反映了主体可信的程度,客体的安全标记则与其包含信息的敏感度一致。
策略
一组预定义的标记组件,包括等级、范围和组
1、策略的创建、修改、删除
只有具有 LABEL_DATABASE 数据库权限的用户才能执行创建修改删除操作
a、创建策略
MAC_CREATE_POLICY(
POLICY_NAME VARCHAR(128)
)
POLICY_NAME 新创建的策略名称。
b、修改策略
MAC_ALTER_POLICY(
POLICY_NAME VARCHAR(128),
NEW_NAME VARCHAR(128)
)
POLICY_NAME 待修改的策略名称
NEW_NAME 策略新名称
c、删除策略
MAC_DROP_POLICY(
POLICY_NAME VARCHAR(128),
DROP_COLUMN INT
)
POLICY_NAME 待删除的策略名称
DROP_COLUMN 对应用此策略的表的标记列的处理方式,取值为 0(默认) 或 1
0:不删除应用此策略的所有表对应的标记列
1:删除应用此策略的所有表对应的标记列
等级(Level)
线性有序的名称序列, 用 L=(l1,l2,…,lp)表示. 任意两个名称 li、lj 之间,若 i≤j,则 li≤lj,于是有 l1≤l2≤…≤lp, 其中 l1,l2,…,lp 称为等级分类。
?????? 一个策略最大可定义 10000 个等级。用户在定义策略中的等级时,需要为 其指定编号,其编号在 0-9999 之间(编号小的意味着级别较低)。
1、为策略添加等级
MAC_CREATE_LEVEL(
POLICY_NAME VARCHAR(128),
LEVEL_NUM INT,
LEVEL_NAME VARCHAR(128)
)
POLICY_NAME 要添加等级的策略名
LEVEL_NUM 创建的等级编号,在 0-9999 之间的整数
LEVEL_NAME 创建的等级名称,不能包含“:”和“,”
统一个策略中,等级ID和等级名称唯一,每个等级都有一个等级ID,ID越小安全等级越低
2、修改等级
MAC_ALTER_LEVEL(
POLICY_NAME VARCHAR(128),
LEVEL_NAME VARCHAR(128),
NEW_NAME VARCHAR(128)
);
POLICY_NAME 要修改等级名的策略名
LEVEL_NAME 待修改的等级名称
NEW_NAME 要修改成的等级名称
3、删除等级
MAC_DROP_LEVEL(
POLICY_NAME VARCHAR(128),
LEVEL_NAME VARCHAR(128)
)
POLICY_NAME 待删除等级所在策略名
LEVEL_NAME 待删除的等级名称
范围(Compartment)
?????? 是集合类型,设集合 C={c1,c2,…,cm}中每一元素都是一名称,c1,c2,…, cm 间彼此独立,无序,则集合 C 及其任意子集称为非等级类别集合,其中 c1,c2,…, cm 称为非等级类别。
?????? 在 DM 中,最大可定义 10000 个范围,需要用户设置编号,且编号在一个策略里面须是唯一的,编号之间没有级别高低之分。
为策略添加范围
1、添加范围
MAC_CREATE_COMPARTMENT(
POLICY_NAME VARCHAR(128),
COMPART_NUM INT,
COMPART_NAME VARCHAR(128)
)
POLICY_NAME 要添加范围的策略名
COMPART_NUM 创建的范围编号,在 0-9999 之间的整数
COMPART_NAME 创建的范围名称
同一个策略中,范围 ID 和范围名称唯一,范围独立无序,范围之间是平等关系,没有等级高低之分,范围之间的比较运算采用集合间的包含关系
2、修改范围
MAC_ALTER_COMPARTMENT(
POLICY_NAME VARCHAR(128),
COMPART_NAME VARCHAR(128),
NEW_NAME VARCHAR(128)
)
POLICY_NAME 要修改范围名的策略名
COMPART_NAME 待修改的范围名称
NEW_NAME 要修改成的范围名称
3、删除范围
MAC_DROP_COMPARTMENT(
POLICY_NAME VARCHAR(128),
COMPART_NAME VARCHAR(128)
);
POLICY_NAME 待删除范围所在策略名
COMPART_NAME 待删除的范围名称
组(Group)
?????? 树形结构,有父子之分,用来描述组织结构。设树 G={g1,g2,…,gm},其中每一元素都是一名称,g1,g2,…,gm 间有父子之 分,则 g1,g2,…,gm 称为组
?????? 在 DM 中,最多能定义 10000 个组,也就是说组织结构的层次最多为 10000。组中只 能有一个根组,除根组外,每个组有且仅有一个父组。
为策略添加组
1、添加组
MAC_CREATE_GROUP( POLICY_NAME
VARCHAR(128), GROUP_NUM INT,
GROUP_NAME VARCHAR(128),
PARENT_NAME VARCHAR(128)
)
POLICY_NAME 要添加组的策略名
GROUP_NUM 创建的组编号,在 0-9999 之间的整数
GROUP_NAME 创建的组名称 PARENT_NAME 新创建组的父组的名称
同一个策略中,组 ID 和组名称唯一,同一个策略中,只能有一个根组,如果 PARENT_NAME 为 NULL,则创建组,组之间的比较运算采用树形结构间的从属关系
2、修改组
MAC_ALTER_GROUP(
POLICY_NAME VARCHAR(128),
GROUP_NAME VARCHAR(128),
NEW_NAME VARCHAR(128)
)
POLICY_NAME 要修改组名的策略名
GROUP_NAME 待修改的组名称
NEW_NAME 要修改成的组名称
更新父组
MAC_ALTER_GROUP_PARENT(
POLICY_NAME VARCHAR(128),
GROUP_NAME VARCHAR(128),
PARENT_NAME VARCHAR(128)
)
POLICY_NAME 要更新父组的组所在的策略名
GROUP_NAME 待更新父组的组名称
PARENT_NAME 待修改成的父组名称
待修改组和待修改成的父组必须存在;父组不能是自身,同时不能是自己的子节点
3、删除组
MAC_DROP_GROUP (
POLICY_NAME VARCHAR(128),
GROUP_NAME VARCHAR(128),
)
POLICY_NAME 待删除组所在策略名
GROUP_NAME 待删除的组名称
待删除的组不能有子节点存在,否则删除失败
例子
--创建策略,SYSSSO用户
MAC_CREATE_POLICY('POLICY_TEST1');
--给策略添加等级,SYSSSO用户
MAC_CREATE_LEVEL('POLICY_TEST1',11,'L_01');
MAC_CREATE_LEVEL('POLICY_TEST1',12,'L_02');
MAC_CREATE_LEVEL('POLICY_TEST1',13,'L_03');
MAC_CREATE_LEVEL('POLICY_TEST1',14,'L_04');
--给策略添加范围,SYSSSO用户
MAC_CREATE_COMPARTMENT('POLICY_TEST1',11,'C_01');
MAC_CREATE_COMPARTMENT('POLICY_TEST1',12,'C_02');
MAC_CREATE_COMPARTMENT('POLICY_TEST1',13,'C_03');
--给策略添加组,SYSSSO用户
MAC_CREATE_GROUP('POLICY_TEST1',11,'G_01',NULL);
MAC_CREATE_GROUP('POLICY_TEST1',12,'G_02','G_01');
MAC_CREATE_GROUP('POLICY_TEST1',13,'G_03','G_02');
--创建一个用户
CREATE USER U_TEST1 IDENTIFIED BY "U_test1123"
PASSWORD_POLICY 1;
--创建一个表
CREATE TABLE U_TEST1.TAB_TEST1
(
C1 INT,
C2 VARCHAR(20)
);
--插入数据
INSERT INTO U_TEST1.TAB_TEST1 VALUES(1,'TEST1'),(2,'TEST2');
commit;
查询数据
标记
当把策略应用于用户或表时,该用户或表就获得了一个安全标记。
一个安全标记由多个组件组成,包括等级、范围和组。每个标记必须包含一个等级。
对表应用策略
将策略应用在一个表上时,就使该表处于一定的等级、范围和组内。一个表上可应用多个策略,但一个策略对表只能应用一次。
语法
(1) 表应用策略
MAC_APPLY_TABLE_POLICY(
POLICY_NAME VARCHAR(128),
SCHEMANAME VARCHAR(128),
TABLENAME VARCHAR(128),
COLNAME VARCHAR(128),
LABELVALUE VARCHAR(4000),
OPTION INT
)
POLICY_NAME 应用于指定表的策略名
SCHEMANAME 表所属模式名称
TABLENAME 策略所应用的表名称
COLNAME 用于记录标记的列名称
LABELVALUE 用于说明被应用了策略的表中,已有元组的等级、范围和组
OPTION 1 代表隐藏标记列,0 代表不隐藏标记列,默认为 0
策略不能应用在系统表、临时表、HUGE 表、水平分区表、物化视图、含有聚集主键的表、含有位图连接索引的表、含有位图索引的表上。
若对表应用策略时指定新增的这 一列隐藏,那么对表进行 INSERT 数据时,如果未指定标记列的列名,就不能对这一列插入数据,如果对其插入数据,则会出错;如果指明具体的列来插入数据,这一列是允许插入数据的。当执行 SELECT * 来查询该表数据时,标记列被隐藏不予显示;但也允许通过指明列名来查询该列。若不隐藏表标记列,则该列被视为一个普通列。当某个策略已被应用于表时,则其已有的等级、范围和组均不能被删除,除非从所有的用户和表上取消对该策略的应用。
(2) 取消表策略
MAC_REMOVE_TABLE_POLICY(
POLICY_NAME VARCHAR(128),
SCHEMANAME VARCHAR(128),
TABLENAME VARCHAR(128),
DROP_COLUMN INT
)
POLICY_NAME 表上待取消应用的策略
SCHEMANAME 表所属模式名称
TABLENAME 表名称
DROP_COLUMN 1 代表删除标记列,0 代表不删除标记列,默认为 0
例子
--对表U_TEST1.TAB_TEST1应用策略POLICY_TEST1,标记列名L01_COL 不隐藏标记列
MAC_APPLY_TABLE_POLICY('POLICY_TEST1','U_TEST1','TAB_TEST1','L01_COL','L_01::',0);
--对表取消应用策略
MAC_REMOVE_TABLE_POLICY('POLICY_TEST1','U_TEST1','TAB_TEST1',1);
对用户应用策略
对用户应用一个策略,要指定一个最高等级、最低等级、默认等级和行等级,其中默认等级介于最高等级和最低等级之间,最高等级限制了用户最高的读写权限,最低等级限制了用户的写权限,默认等级表示用户登录时会话标记的等级,行等级表示插入一行数据的标记使用的等级;指定范围和组,对范围需要指定读的范围、写的范围、 默认范围和行级范围,其中写范围必须是读范围的子集,默认范围是读范围的子集,行级范围是写范围和默认范围的交集的子集。组的规则与范围相同。
语法
(1) 设置用户等级
MAC_USER_SET_LEVELS(
POLICY_NAME VARCHAR(128),
USER_NAME VARCHAR(128),
MAX_LEVEL VARCHAR(128),
MIN_LEVEL VARCHAR(128),
DEF_LEVEL VARCHAR(128),
ROW_LEVEL VARCHAR(128)
);
POLICY_NAME 应用于用户的策略名称
USER_NAME 策略所应用的用户名称
MAX_LEVEL 应用于用户的最大等级
MIN_LEVEL 应用于用户的最小等级
DEF_LEVEL 应用于用户的默认等级
ROW_LEVEL 应用于用户的行等级
合法的 LEVEL 规则如下:
MAX_LEVEL >= MIN_LEVEL
MAX_LEVEL >= DEF_LEVEL >= MIN_LEVEL
DEF_LEVEL >= ROW_LEVEL >= MIN_LEVEL
(2) 设置用户范围
MAC_USER_SET_COMPARTMENTS(
POLICY_NAME VARCHAR(128),
USER_NAME VARCHAR(128),
READ VARCHAR(128),
WRITE VARCHAR(128),
DEFAULT VARCHAR(128),
ROW VARCHAR(128)
)
POLICY_NAME 应用于用户的策略名称
USER_NAME 策略所应用的用户名称
READ 应用于用户的可读范围 不能为空
WRITE 应用于用户的可写范围 ,write属于read,为空时使用read
DEFAULE 应用于用户的默认范围 ,属于read,为空时使用read
ROW 应用于用户的行范围。插入时不指定标记是使用,属于 DEFAULT 和 WRITE 的交集,为空时使用 DEFAULT 和 WRITE 的交集
(3) 设置用户组
MAC_USER_SET_GROUPS (
POLICY_NAME VARCHAR(128),
USER_NAME VARCHAR(128),
READ_GROUP VARCHAR(128),
WRITE_GROUP VARCHAR(128),
DEF_GROUP VARCHAR(128),
ROW_GROUP VARCHAR(128)
)
POLICY_NAME 应用于用户的策略名称
USER_NAME 策略所应用的用户名称
READ_GROUP 应用于用户的可读组
WRITE_GROUP 应用于用户的可写组 进行UPDATE,DELETE时使用,进行判断权限
DEF_GROUP 应用于用户的默认组
ROW_GROUP 应用于用户的行组,插入时不指定标记时使用
合法的用户组规则如下:
WRITE 属于 READ
DEFAULT 属于 READ
ROW 属于 DEFAULT 和 WRITE 的交集
(4) 清除用户策略
MAC_USER_REMOVE_POLICY(
POLICY_NAME VARCHAR(128),
USER_NAME VARCHAR(128)
)
POLICY_NAME 要清除的策略名
USER_NAME 用户名
例子
--设置用户U_TEST1等级L_04(用户最大等级),L_01(最小等级),L_03(默认等级),L_02(行等级)
MAC_USER_SET_LEVELS('POLICY_TEST1','U_TEST1','L_04','L_01','L_03','L_02');
--设置用户U_TEST1范围 可读范围C_01,C_02,C_03 可写范围C_01,C_02 默认范围C_01,C_03 行范围C_01
MAC_USER_SET_COMPARTMENTS('POLICY_TEST1','U_TEST1','C_01,C_02,C_03','C_01,C_02','C_01,C_03','C_01');
--设置用户组 可读组G_01,G_02,G_03 可写组G_01, G_02 默认组G_01, G_03 行组G_01
MAC_USER_SET_GROUPS('POLICY_TEST1','U_TEST1','G_01,G_02,G_03','G_01,G_02','G_01,G_03','G_01');
对会话应用策略
针对会话的标记设置,这些设置挂载在会话上,会话结束,信息被抛弃,不会影响系统表。
允许用户将会话上指定策略刷入相应的数 据字典,这时,用户标记会被会话标记覆盖,会话标记与用户标记一致
(1) 设置会话默认标记
MAC_SET_SESSION_LABEL(
POLICY_NAME VARCHAR(128),
LABELVALUE VARCHAR(4000)
)
POLICY_NAME 策略名
LABELVALUE 为会话设置的默认标记
设置的等级必须在用户的 MIN_LEVEL 和 MAX_LEVEL 之间,范围必须是用户 READ_COMP 的子集,组必须是用户 READ_GROUP 的子集
(2) 设置会话行标记
MAC_SET_SESSION_ROW_LABEL(
POLICY_NAME VARCHAR(128),
LABELVALUE VARCHAR(4000)
)
POLICY_NAME 策略名
LABELVALUE 为会话设置的行标记
(3) 清除会话标记
MAC_RESTORE_DEFAULT_LABELS(
POLICY_NAME VARCHAR(128)
)
(4) 保存会话标记
MAC_SAVE_DEFAULT_LABELS (
POLICY_NAME VARCHAR(128)
)
例子
策略应用后使用U_TEST1登录数据库
--查询记录的标记
SELECT SF_MAC_LABEL_TO_CHAR(2);
--对表应用的策略为不隐藏列,插入数据报错
INSERT INTO U_TEST1.TAB_TEST1 VALUES(3,'TEST3'),(4,'TEST4');
--对表应用的策略为不隐藏列,插入数据指定栏位
INSERT INTO U_TEST1.TAB_TEST1(C1,C2) VALUES(3,'TEST3'),(4,'TEST4');
--查询记录的标记,为用户的行标记
SELECT SF_MAC_LABEL_TO_CHAR(12);
使用SYSDBA账号查询该表无数据
--sysdba账号对表test1插入数据
INSERT INTO U_TEST1.TAB_TEST1(C1,C2) VALUES(5,'TEST5'),(6,'TEST6');
--查询数据,可查询到sysdba账号插入的数据
select * from U_TEST1.tab_test1;
--创建一个test2表
CREATE TABLE U_TEST1.TAB_TEST2
(
C1 INT,
C2 VARCHAR(20)
);
--SYSDBA插入数据
INSERT INTO U_TEST1.TAB_TEST2 VALUES(1,'TEST1'),(2,'TEST2');
commit;
--对表应用策略POLICY_TEST1,标记列名L_COL,隐藏列
MAC_APPLY_TABLE_POLICY('POLICY_TEST1','U_TEST1','TAB_TEST2','L_COL','L_03:C_01,C_03:G_01,G_03',1);;
--插入数据
INSERT INTO U_TEST1.TAB_TEST2 VALUES(1,'TEST1'),(2,'TEST2');
--查询数据
SELECT * FROM U_TEST1.TAB_TEST2;
--查询数据
SELECT C1,C2,L_COL FROM U_TEST1.TAB_TEST2;
--查询记录的标记,为默认标记
SELECT SF_MAC_LABEL_TO_CHAR(11);
--U_TEST1用户插入数据
INSERT INTO U_TEST1.TAB_TEST2 VALUES(3,'TEST3'),(4,'TEST4');
当前的sysdba用户访问表时不会有数据返回
--为SYSDBA应用策略
--设置SYSDBA用户等级
MAC_USER_SET_LEVELS('POLICY_TEST1','SYSDBA','L_03','L_03','L_03','L_03');
--设置SYSDBA用户范围
MAC_USER_SET_COMPARTMENTS('POLICY_TEST1','SYSDBA','C_01,C_02,C_03','C_01,C_02','C_01,C_03','C_01');
--设置SYSDBA用户组
MAC_USER_SET_GROUPS('POLICY_TEST1','SYSDBA','G_01,G_02,G_03','G_01,G_02','G_01,G_03','G_01');
sysdba能够访问部分数据
达梦数据库 - 新一代大型通用关系型数据库 | 达梦云适配中心
|