目录
8.1. 关于标记和强制访问控制
8.2. 管理强制访问控制
8.2.1. 开启强制访问控制
8.2.2. 强制访问控制要素
8.2.3. 标记和策略特权的使用
8.3. 示例
8.1. 关于标记和强制访问控制
KingbaseES支持标记和强制访问控制,保护用户数据,防止非法窃取。强制访问控制强制访问控制(Mandatory AccessControl——MAC)与自主访问相比,MAC提供更严格和灵活的控制方式。MAC首先为所控制的主体和客体指派安全标记,然后依据这些标记进行访问仲裁。并且,只有主体标记能支配客体标记时才允许主体访问。标签和强制访问的定义如下:
- 标记
标记是由等级和范围构成,并且,标记是可以比较的,其比较结果的含义是代表了数据的敏感程度。如果赋予用户某些标记,然后给数据再赋予标记,这样,将用户的标记和数据的标记进行比较,按照一定规则来决定用户是否可以对数据进行访问。
- 强制访问控制
用于将系统中的信息分密级和类进行管理,以保证每个用户只能访问到那些被标明可以由他访问的信息的一种访问约束机制。通俗的来说,在强制访问控制下,用户(或其他主体)与元组(或其他客体)都被标记了固定的安全属性(如安全级、访问权限等),在每次访问发生时,系统检测安全属性以便确定一个用户是否有权访问该元组。
8.2. 管理强制访问控制
8.2.1. 开启强制访问控制
8.2.1.1. 加载插件
修改 kingbase.conf 文件中 shared_preload_libraries
参数,并重启数据库。
shared_preload_libraries = 'sysmac'
8.2.1.2. 控制参数
参数sysmac.enable_mac(boolean)控制强制访问控制是否打开,默认为false,表示不启用强制访问控制。
8.2.2. 强制访问控制要素
在KingbaseES数据库中,数据能否被访问的仲裁结果取决于以下三个要素:数据标记、用户的会话标记和用户的特权。
8.2.2.1. 数据标记
在KingbaseES中,安全管理员可以根据数据的具体密级为数据定义标记。标记包含两个元素:等级和范围
等级代表数据的敏感度,它关系到数据的安全性,用以防止未授权的用户查询和修改高密级的数据。即,拥有低等级的用户无法访问高密级的数据。例如,可以根据敏感度将数据分为如下等级:机密、秘密和普通。
范围用于将数据分类,例如,可以用范围将数据分为陆军信息、海军信息和空军信息。
标记可以是以下两种形式:
标记只包含等级元素,例如: “机密:”;
标记包含一个等级和范围集合,例如:“秘密:空军,陆军”。
8.2.2.2. 授予权限
安全员可以给用户授予标记权限,以决定用户可以何种形式(读或写)访问那些数据。当表中的元组被标记标识后,只有用户被授予了访问该标记的权限后,可以读取到该元组或者写该元组。当元组具有多个数据标记时,用户必须具有所有标记的权限才可以访问该元组。
8.2.2.3. 策略特权
策略下的特权允许用户绕开部分标记仲裁规则来访问数据。安全员可以给用户授予策略下的特权,使得用户可以不依靠会话标记对数据执行读写操作。
KingbaseES的强制访问控制规则遵循简单保密模型,即"向下读,区间写"模型,实现信息流向总是向上的保密信息传递。下读规则是指用户只能读和自己等级一样或者等级比自己低的数据。区间写是上写模型,上写规则是指用户只能写入和自己等级一样或者等级比自己高的数据。
8.2.3. 标记和策略特权的使用
8.2.3.1. 管理策略特权
KingbaseES为一些特殊的操作提供特权,以提高数据访问控制的灵活性,下面列举了所有能够被授予可信用户的策略特权。
READ
当用户具有READ特权时,用户可以读取安全策略所保护的所有数据,此外拥有READ特权的用户仍然可以根据标记仲裁写相应的数据。
FULL
当用户具有FULL特权,用户可以读取安全策略所保护的所有数据,此外还可以写所有数据,KingbaseES对具有FULL特权的用户所进行的操作,不进行强制访问控制。
WRITEUP
WRITEUP特权允许用户提升数据标记的等级,但用户只能将等级提升到用户最大等级,并且不能修改数据的范围。例如用户的最大等级为秘密,用户不能将数据的等级提升到机密这个级别。
WRITEDOWN
WRITEDOWN特权允许用户降低数据标记的等级,但用户只能将等级降低到用户最小等级,并且不能修改数据的范围。
WRITEACROSS
WRITEACROSS特权允许用户修改数据标记的范围,但不能修改数据标记的等级。此外新的范围必须仍然是用户最大写范围的子集,并且在上写规则中,用户最小写范围必须是新范围的子集。
8.2.3.1.1. 创建策略
语法格式:
SYSMAC.CREATE_POLICY (policy_name TEXT,column_name TEXT,hide_column BOOL);
功能:
创建新的安全策略,定义策略列的名称,并指定策略选项。默认情况下,策略创建后都处于启用状态.
参数说明:
policy_name:指定策略的名称,该名称必须在数据库中唯一。
column_name:当策略应用于表上时,将自动在表上增加一列,该参数就是用于指定策略列的名称。该名称必须在数据库中唯一。
hide_column:指定当策略用于表上时,是否隐藏策略列。TRUE代表隐藏,FALSE代表不隐藏。
示例:
SELECT SYSMAC.CREATE_POLICY ('P1','P1_C',FALSE);
8.2.3.1.2. 禁用策略
语法格式:
SYSMAC.DISABLE_POLICY(policy_name TEXT);
功能:
禁用安全策略,而不是将策略从表上移除。策略禁用后,系统将不再对受策略保护的表实施访问控制。
参数说明:
policy_name:指定要禁用的安全策略名称。
示例:
SELECT SYSMAC.DISABLE_POLICY ('P1');
8.2.3.1.3. 启用策略
语法格式:
SYSMAC.ENABLE_POLICY(policy_name TEXT);
功能:
启用安全策略。策略启用后,系统将继续对受策略保护的表实施访问控制。
参数说明:
policy_name:指定需要被启用的安全策略名称。
示例:
SELECT SYSMAC.ENABLE_POLICY('P1');
8.2.3.1.4. 删除策略
语法格式:
SYSMAC.DROP_POLICY (policy_name TEXT,drop_column BOOL);
功能:
删除数据库中的安全策略,并同时删除该策略下的所有数据标记和用户会话标记。此外用户可以指定是否删除受到该安全策略保护的表中的策略列。
参数说明:
policy_name:指定要删除的安全策略名称。
drop_column:指定是否删除受到安全策略保护的表中的策略列。TRUE代表删除,FALSE代表不删除。
示例:
SELECT SYSMAC.DROP_POLICY('P1', true);
8.2.3.1.5. 创建等级
语法格式:
SYSMAC.CREATE_LEVEL(policy_name TEXT, level_name TEXT, levid SMALLINT)
功能:
创建指定策略名下的等级,并指定等级的ID。用户指定的ID值的大小决定了等级的敏感性级别,数值越大级别越高。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
level_name:指定等级的名称,等级名称在策略下唯一。
levid:指定等级的ID值,等级ID的取值范围为[1,9999],并在策略下唯一。
示例:
SELECT SYSMAC.CREATE_LEVEL('P1','L1',10);
8.2.3.1.6. 删除等级
语法格式:
SYSMAC.DROP_LEVEL(policy_name TEXT, level_name TEXT)
SYSMAC.DROP_LEVEL(policy_name TEXT, levid SMALLINT)
功能:
删除指定策略下的等级。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
level_name:指定等级的名称。
levid:指定等级的ID值。
示例:
SELECT SYSMAC.DROP_LEVEL ('P1', 'L1');
SELECT SYSMAC.DROP_LEVEL ('P1', 10);
8.2.3.1.7. 创建范围
语法格式:
SYSMAC.CREATE_COMPARTMENT (policy_name TEXT,comp_name TEXT,comp_id SMALLINT)
功能:
创建指定策略下的范围,并指定范围ID。用户指定的范围ID值决定了范围在标记字符串中出现的先后顺序。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
comp_name:指定范围的名称,范围名称在策略下唯一。
comp_id:指定范围的ID值,范围ID的取值范围为[1,9999],并在策略下唯一。
示例:
SELECT SYSMAC.CREATE_COMPARTMENT ('P1','PA',100);
8.2.3.1.8. 删除范围
语法格式:
SYSMAC.DROP_COMPARTMENT(policy_name TEXT,comp_name TEXT)
SYSMAC.DROP_COMPARTMENT(policy_name TEXT,comp_id SMALLINT)
功能:
删除指定策略下的范围。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
comp_name:指定范围的名称。
comp_id:指定范围的ID值。
示例:
SELECT SYSMAC.DROP_COMPARTMENT('P1', 'PA');
SELECT SYSMAC.DROP_COMPARTMENT('P1', 100);
8.2.3.2. 管理标记
8.2.3.2.1. 创建标记
语法格式:
SYSMAC.CREATE_LABEL(policy_name TEXT, label TEXT,labelid INT)
功能:
创建指定策略下的标记,并指定标记ID。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
label:指定标记字符串,关于标记的字符串的语法格式请参见“标记的语法规定”小节。
labelid:指定标记的ID值,标记ID的取值范围是[1,99999999],并且必须是同一数据库下唯一。
示例:
SELECT SYSMAC.CREATE_LABEL('P1','L1:C4',11);
8.2.3.2.2. 修改标记
语法格式:
SYSMAC.ALTER_LABEL(policy_name TEXT, label TEXT,newlabel TEXT)
SYSMAC.ALTER_LABEL(policy_name TEXT, labelid INT, newlabel TEXT)
功能:
修改指定策略下的标记。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
label:指定要修改的标记字符串。
labelid:指定要修改的标记ID。
newlabel:指定新的标记字符串。
示例:
SELECT SYSMAC.ALTER_LABEL('P1','L1:C4','L1:C5');
SELECT SYSMAC.ALTER_LABEL('P1',11,'L1:C5');
8.2.3.2.3. 删除标记
语法格式:
SYSMAC.DROP_LABEL(policy_name TEXT, label TEXT)
SYSMAC.DROP_LABEL(policy_name TEXT,labelid INT)
功能:
删除指定策略下的标记。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
label:指定要删除的标记字符串。
labelid:指定要删除的标记ID。
示例:
SELECT SYSMAC.DROP_LABEL('P1','L1:C4');
SELECT SYSMAC.DROP_LABEL('P1',11);
8.2.3.2.4. 标记ID与标记的转换
语法格式:
VARCHAR SYSMAC.LABEL_TO_CHAR (labelid INT);
INT SYSMAC.CHAR_TO_LABEL (policy_name TEXT,label_string TEXT);
功能:
函数SYSMAC.LABEL_TO_CHAR通过参数标记ID返回对应的标记字符串,SYSMAC.CHAR_TO_LABEL通过策略名称和标记字符串返回标记ID。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
label_string:指定要转换的标记字符串。
labelid:指定要转换的标记ID。
示例:
SELECT A,P1_C,SYSMAC.LABEL_TO_CHAR(P1_C) FROM T1;
SELECT A,P1_C,SYSMAC.LABEL_TO_CHAR('P1', 'L1:C4') FROM T1;
8.2.3.3. 设置和管理用户策略
8.2.3.3.1. 授予用户等级
语法格式:
SYSMAC.SET_LEVELS( policy_name TEXT, user_name TEXT, max_level TEXT, min_level TEXT, def_level TEXT, row_level TEXT )
功能:
指定用户的最大等级和最小等级,以及用户登陆数据库时默认的会话等级和写入等级。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
user_name:指定用户名称。
max_level:指定读写访问的最高等级。
min_level:指定写访问的最低等级,min_level必须小于等于max_level。如果min_level为NULL,那么系统自动将其设置为指定策略下的最低等级。
def_level:指定用户登录系统的默认会话等级。def_level必须小于等于 row_level,如果def_level为NULL,那么系统自动将其值设置为row_level
row_level:指定用户的写入等级。row_level必须小于等于max_level, 如果row_level为NULL,那么系统自动将其值设置为max_level。
示例:
SELECT SYSMAC.SET_LEVELS('P1','U1','L5','L2','L4','L3');
8.2.3.3.2. 授予用户范围
语法格式:
SYSMAC.SET_COMPARTMENTS( policy_name TEXT, user_name TEXT, read_compartments TEXT, max_write_compartments TEXT, defaut_compartments TEXT, row_compartments TEXT, min_write_compartments TEXT )
功能:
指定用户的读写范围,以及用户登陆数据库时默认的会话范围和写入范围。安全员在给用户授予范围之前必须先给用户授予等级。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
user_name:指定用户名称。
read_compartments:指定用户具有读权限的范围列表,范围之间以逗号分隔。
max_write_compartments:指定用户具有最大写权限的范围列表,范围之间以逗号分隔。最大写范围集合必须是读范围集合的子集。 如果max_write_compartments为NULL,那么系统自动将其值设置为read_compartments。
defaut_compartments:指定用户登录系统后默认的具有读权限的范围列表,范围之间以逗号分隔。默认的范围集合必须是默认写入范围集合的子集。如果defaut_compartments为NULL,那么系统自动将其设置为row_compartments。
row_compartments:指定默认的写入范围列表,范围之间以逗号分隔。写入范围集合必须是最大写范围集合的子集。如果row_compartments为NULL,那么系统自动将其值设置为max_write_compartments。
min_write_compartments:指定用户具有最小写权限的范围列表,范围之间以逗号分隔。最小写范围集合必须是默认写入范围集合的子集。如果min_write_compartments为NULL,那么最小写范围集合为空,系统不会自动设置其值。
示例:
SELECT SYSMAC.SET_COMPARTMENTS('P1','U1','C1,C2,C3,C4,C5','C1,C2,C3','C1,C2,C4', 'C1,C2');
8.2.3.3.3. 授予用户标记
语法格式:
SYSMAC.SET_USER_LABELS( policy_name TEXT, user_name TEXT, max_read_label TEXT, max_write_label TEXT, min_write_label TEXT, def_label TEXT, row_label TEXT )
功能:
通过给用户授予会话标记,来设置用户的等级和范围。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
user_name:指定用户名称。
max_read_label:指定用户的最大读标记,该标记包含授予用户的最大等级和具有读权限的范围集合。
max_write_label:指定用户的最大写标记,该标记包含授予用户的最大等级和具有写权限的范围,该参数必须满足如下条件:
a) max_write_label.level= max_read_label.level。
b) max_write_label.comps为 max_read_label.comps的子集。
如果该参数为空,那么系统自动将其值设置为max_read_label。
row_label:指定用户的写入标记,其值必须满足如下条件:
a) row_label.level <= max_write_label.level。
b) row_label.level >= min_write_label.level。
c) row_label.comps为max_write_label.comps的子集。
如果该参数为空,那么系统将其值设置为max_write_label;
min_write_label:指定用户的最小写标记,该标记包含授予用户的最小等级和最小写范围,该参数必须满足如下条件:
a) min_write_label.level <= row_label.level。
b) min_write_label.comps为row_label.comps的子集。
如果该参数为空,那么系统将其值设置为策略内的最小等级。
def_label:用户的默认会话标记,其值必须满足如下条件:
a) def_label.level <= row_label.level。
b) def_label.comps为 row_label.comps的子集。
如果该参数为空,那么系统将其值设置为row_label。
示例:
SELECT SYSMAC.SET_USER_LABELS('P1', 'U1', 'L5:C1,C2,C3,C4,C5', 'L5:C1,C2,C3', 'L2:', 'L4:C1,C2,C4', 'L3:C1,C2');
8.2.3.3.4. 设置用户默认标记
语法格式:
SYSMAC.SET_DEFAULT_LABEL( policy_name TEXT, username TEXT, label TEXT )
功能:
设置用户登录系统时默认的会话标记。安全员在给用户设置默认标记之前必须先给用户授予标记。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
user_name:指定用户名称。
label:设置用户登陆系统时的初始化会话标签。
其值必须满足如下条件:
a) label.level <= 用户的写入标记的等级。
b) label.comps集合是写入标记范围集合的子集。
示例:
SELECT SYSMAC.SET_DEFAULT_LABEL('P1',U1,'L1:C4');
8.2.3.3.5. 设置用户默认写入标记
语法格式:
SYSMAC.SET_DEF_ROW_LABEL( policy_name TEXT, user_name TEXT, label TEXT )
功能:
设置用户登录系统时默认的写入标记。安全员在给用户设置默认写入标记之前必须先给用户授予标记。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
user_name:指定用户名称。
label:指定用户用户的写入标记。其值必须满足如下条件:
a) label.level >= 用户的最小等级。
b) label.level <= 用户的最大等级。
c) label.comps集合是最大写范围的子集。
此外,该值必须仍然可以支配用户的默认标记和最小写标记,并满足如下条件:
a) label.level >= 用户默认标记的等级。
b) label.level >= 用户最小写标记的等级。
c) 默认标记的范围集合仍然是label.comps集合的子集。
d) 最小写标记的范围集合仍然是label.comps集合的子集。
示例:
SELECT SYSMAC.SET_DEF_ROW_LABEL('P1',U1,'L1:C4');
8.2.3.3.6. 向用户授予特权
语法格式:
SYSMAC.SET_USER_PRIVS ( policy_name TEXT, user_name TEXT, privileges TEXT )
功能:
为用户授予系统预设的策略特权。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
user_name:指定用户名称。
privileges:指定用户的特权列表,权限间由“,”隔开。当privilege为NULL时,相当于回收用户的所有策略特权。
示例:
SELECT SYSMAC.SET_USER_PRIVS('P1','U2','FULL');
8.2.3.3.7. 回收用户的所有权限
语法格式:
SYSMAC.DROP_USER_ACCESS( policy_name TEXT, user_name TEXT )
功能:
收回用户指定策略下所有的权限和特权。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
user_name:指定用户名称。
示例:
SELECT SYSMAC.DROP_USER_ACCESS('P1',U1);
8.2.3.4. 设置和管理表策略
8.2.3.4.1. 对用户表应用行级策略
语法格式:
SYSMAC.APPLY_TABLE_POLICY ( policy_name TEXT, schema_name TEXT, table_name TEXT )
功能:
将策略应用于指定模式下的用户表。粒度是行级。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
schema_name:指定数据库下的模式名称。
table_name: 指定需要安全策略保护的表名。
8.2.3.4.2. 移除用户表行级策略
语法格式:
SYSMAC.REMOVE_TABLE_POLICY( policy_name TEXT, schema_name TEXT, table_name TEXT, drop_column BOOL )
功能:
将策略从指定模式下的用户表上移除。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
schema_name:指定数据库下的模式名称。
table_name: 指定被策略policy_name保护的表名。
drop_column:指定从表上移除策略时是否移除策略列。
8.3. 示例
----对主体进行标记
--建立一个策略
\c - sso
SELECT SYSMAC.CREATE_POLICY ('P1','P1_COLUMN',TRUE);
--建立等级
SELECT SYSMAC.CREATE_LEVEL('P1','GENERAL',10);
SELECT SYSMAC.CREATE_LEVEL('P1','PRIVACY',20);
SELECT SYSMAC.CREATE_LEVEL('P1','SECRET',30);
--建立范围
SELECT SYSMAC.CREATE_COMPARTMENT('P1','MANAGER',40);
SELECT SYSMAC.CREATE_COMPARTMENT ('P1','QA',30);
SELECT SYSMAC.CREATE_COMPARTMENT ('P1','RD',20);
SELECT SYSMAC.CREATE_COMPARTMENT ('P1','UNIMPORTANT',10);
--创建用户URD_Manager、UQA_Manager和UGeneral_Manager
\c - system
CREATE USER URD_Manager;
CREATE USER UQA_Manager;
CREATE USER UGeneral_Manager;
ALTER USER URD_Manager WITH PASSWORD '12345678ab';
ALTER USER UQA_Manager PASSWORD '12345678ab';
ALTER USER UGeneral_Manager PASSWORD '12345678ab';
--分别为三个用户设置标记(最大读标记、最大写标记、最小写标记、默认会话标记、默认写标记)
\c - sso
SELECT SYSMAC.SET_USER_LABELS('P1','UGeneral_Manager', 'SECRET:MANAGER,QA,UNIMPORTANT', 'SECRET:MANAGER,QA','SECRET:', 'SECRET:', 'SECRET:MANAGER,QA');
SELECT SYSMAC.SET_USER_LABELS('P1','UQA_Manager', 'PRIVACY:RD,UNIMPORTANT','PRIVACY:RD','PRIVACY:RD', 'PRIVACY:RD','PRIVACY:RD');
SELECT SYSMAC.SET_USER_LABELS('P1','URD_Manager', 'PRIVACY:QA,RD,UNIMPORTANT','PRIVACY:QA,RD','PRIVACY:QA,RD','PRIVACY:QA,RD','PRIVACY:QA,RD');
----对客体进行标记
\c - system
CREATE TABLE TU_INFO(ID INT, NAME CHAR(10));
--将用户表的权限授予用户UQA_Manager和URD_Manager、UGeneral_Manager
GRANT ALL ON TU_INFO TO UQA_Manager;
GRANT ALL ON TU_INFO TO URD_Manager;
GRANT ALL ON TU_INFO TO UGeneral_Manager;
--数据库安全员权限将策略应用于表TU_INFO
\c - sso
select SYSMAC.APPLY_TABLE_POLICY('P1', 'PUBLIC','TU_INFO');
--建立数据标记
CALL SYSMAC.CREATE_LABEL('P1','GENERAL:UNIMPORTANT',11);
CALL SYSMAC.CREATE_LABEL('P1','PRIVACY:QA',21);
CALL SYSMAC.CREATE_LABEL('P1','PRIVACY:RD',22);
CALL SYSMAC.CREATE_LABEL('P1','PRIVACY:',23);
CALL SYSMAC.CREATE_LABEL('P1','SECRET:',24);
CALL SYSMAC.CREATE_LABEL('P1','PRIVACY:QA,RD',25);
CALL SYSMAC.CREATE_LABEL('P1', 'SECRET:MANAGER,UNIMPORTANT',31);
CALL SYSMAC.CREATE_LABEL('P1', 'SECRET:MANAGER,QA,UNIMPORTANT',32);
CALL SYSMAC.CREATE_LABEL('P1', 'SECRET:MANAGER,RD,QA',33);
CALL SYSMAC.CREATE_LABEL('P1','SECRET:MANAGER,RD,QA,UNIMPORTANT',34);
CALL SYSMAC.CREATE_LABEL('P1', 'SECRET:MANAGER,QA',35);
--以用户UQA_Manager 登录
INSERT INTO TU_INFO VALUES(1,'WANG');
--查询表中的数据及敏感标记:
SELECT P1_COLUMN, * FROM TU_INFO;
--以用户URD_MANAGER 登录
INSERT INTO TU_INFO VALUES(2,'ZHANG');
--查询表中的数据及敏感标记:
SELECT P1_COLUMN, * FROM TU_INFO;
--更新用户UQA_MANAGER的数据
UPDATE TU_INFO SET NAME='WANG1' WHERE ID=1;
--更新自己的数据
UPDATE TU_INFO SET NAME='ZHANG1' WHERE ID=2;
--查询
SELECT * FROM TU_INFO;
--清理环境
\c - sso
CALL SYSMAC.REMOVE_TABLE_POLICY('P1', 'PUBLIC', 'TU_INFO' ,TRUE);
CALL SYSMAC.DROP_USER_ACCESS('P1','URD_MANAGER');
CALL SYSMAC.DROP_USER_ACCESS('P1','UQA_MANAGER');
CALL SYSMAC.DROP_USER_ACCESS('P1','UGENERAL_MANAGER');
CALL SYSMAC.DROP_POLICY('P1',TRUE);
\c - system
DROP TABLE TU_INFO;
DROP USER URD_MANAGER;
DROP USER UQA_MANAGER;
DROP USER UGENERAL_MANAGER;
----对视图,函数,触发器进行标记
\c - system
CREATE USER U1;
CREATE USER U2;
CREATE TABLE tt(ID INT, NAME CHAR(10));
insert into tt values(1, '111');
insert into tt values(2, '222');
--创建视图
create view tv as select * from tt;
grant all on tt to U1;
grant all on tt to U2;
grant all on tv to U1;
grant all on tv to U2;
--创建函数
\set SQLTERM /
CREATE OR REPLACE FUNCTION ff(
)returns bool
AS $$
BEGIN
RAISE NOTICE 'function test';
return true;
END $$LANGUAGE PLSQL;
/
--创建存储过程
CREATE OR REPLACE PROCEDURE pp() AS
BEGIN
RAISE NOTICE 'procedure test';
END;
/
\set SQLTERM ;
grant all on function ff to U1;
grant all on function ff to U2;
grant all on procedure pp to U1;
grant all on procedure pp to U2;
alter user U1 with password '12345678ab';
alter user U2 with password '12345678ab';
\c - sso
CALL SYSMAC.CREATE_POLICY ('P1','P1_COLUMN',false);
CALL SYSMAC.CREATE_LEVEL('P1','L1',10);
CALL SYSMAC.CREATE_LEVEL('P1','L2',20);
CALL SYSMAC.CREATE_LEVEL('P1','L3',30);
CALL SYSMAC.CREATE_COMPARTMENT ('P1','C1',100);
CALL SYSMAC.CREATE_COMPARTMENT ('P1','C2',200);
CALL SYSMAC.CREATE_COMPARTMENT ('P1','C3',300);
CALL SYSMAC.CREATE_LABEL('P1','L1:C1',50);
CALL SYSMAC.CREATE_LABEL('P1','L2:C1',60);
CALL SYSMAC.CREATE_LABEL('P1','L3:C1',70);
CALL SYSMAC.SET_USER_LABELS('P1','U1','L3:C1','L3:C1','L3:C1', 'L3:C1','L3:C1');
CALL SYSMAC.SET_USER_LABELS('P1','U2','L1:C1', 'L1:C1','L1:C1','L1:C1','L1:C1');
CALL sysmac.apply_obj_policy('P1', 'view', 'PUBLIC', 'tv', 'L2:C1');
CALL sysmac.apply_obj_policy('P1', 'function', 'PUBLIC', 'ff', 'L2:C1');
CALL sysmac.apply_obj_policy('P1', 'procedure', 'PUBLIC', 'pp', 'L2:C1');
--U1 下列三个操作都成功
\c - u1
select * from tv;
call ff();
call pp();
--U2 下列三个操作都失败
\c - u2
select * from tv;
call ff();
call pp();
--清理环境
\c - sso
call sysmac.drop_obj_policy('P1', 'view', 'PUBLIC', 'tv');
call sysmac.drop_obj_policy('P1', 'function', 'PUBLIC', 'ff');
call sysmac.drop_obj_policy('P1', 'procedure', 'PUBLIC', 'pp');
call sysmac.drop_user_access('P1', 'U1');
call sysmac.drop_user_access('P1', 'U2');
call sysmac.drop_policy('P1', true);
\c - system
drop view tv;
drop table tt;
drop function ff();
drop procedure pp();
drop user U1;
drop user U2;