金仓数据库 强制访问控制的初步学习
关键字:
KingbaseES、安全、强制访问控制、人大金仓、KingbaseES
基本使用和相关参数说明
准备工作
修改 kingbase.conf 文件中 shared_preload_libraries 参数,
shared_preload_libraries = 'sysmac'
sysmac.enable_mac = true
重启数据库
----对视图,函数,触发器进行标记
\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 ;
2、授权
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';
3、创建策略
\c - sso
CALL SYSMAC.CREATE_POLICY ('P1','P1_COLUMN',false);
参数说明:
policy_name:指定策略的名称,该名称必须在数据库中唯一。
column_name:当策略应用于表上时,将自动在表上增加一列,该参数就是用于指定策略列的名称。该名称必须在数据库中唯一。
hide_column:指定当策略用于表上时,是否隐藏策略列。TRUE代表隐藏,FALSE代表不隐藏。
4、建立等级
CALL SYSMAC.CREATE_LEVEL('P1','L1',10);
CALL SYSMAC.CREATE_LEVEL('P1','L2',20);
CALL SYSMAC.CREATE_LEVEL('P1','L3',30);
功能:
创建指定策略名下的等级,并指定等级的ID。用户指定的ID值的大小决定了等级的敏感性级别,数值越大级别越高。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
level_name:指定等级的名称,等级名称在策略下唯一。
levid:指定等级的ID值,等级ID的取值范围为[1,9999],并在策略下唯一。
5、建立范围
CALL SYSMAC.CREATE_COMPARTMENT ('P1','C1',100);
CALL SYSMAC.CREATE_COMPARTMENT ('P1','C2',200);
CALL SYSMAC.CREATE_COMPARTMENT ('P1','C3',300);
功能:
创建指定策略下的范围,并指定范围ID。用户指定的范围ID值决定了范围在标记字符串中出现的先后顺序。
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
comp_name:指定范围的名称,范围名称在策略下唯一。
comp_id:指定范围的ID值,范围ID的取值范围为[1,9999],并在策略下唯一。
6、创建标记
CALL SYSMAC.CREATE_LABEL('P1','L1:C1',50);
CALL SYSMAC.CREATE_LABEL('P1','L2:C1',60);
CALL SYSMAC.CREATE_LABEL('P1','L3:C1',70);
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
label:指定标记字符串,关于标记的字符串的语法格式请参见“标记的语法格式”。
labelid:指定标记的ID值,标记ID的取值范围是[1,99999999],并且必须是同一数据库下唯一。
7、授予用户标记
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');
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
username:指定用户名称。
max_read_label:指定用户的最大读标记,该标记包含授予用户的最大等级和具有读权限的范围集合。
max_write_label:指定用户的最大写标记,该标记包含授予用户的最大等级和具有写权限的范围。
row_label:指定用户的写入标记。
min_write_label:指定用户的最小写标记,该标记包含授予用户的最小等级和最小写范围。
def_label:用户的默认会话标记。
8、增加对象标记
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');
参数说明:
policy_name:指定数据库中已经创建的安全策略名称。
object_type:指定被策略policy_name保护的对象类型。支持的对象类型有:table、view 、function、procedure、trigger、sequence、index、package、synonym。
schema_name:指定数据库下的模式名称。
object_name: 指定被策略policy_name保护的对象名称。
label:指定标记字符串,关于标记的字符串的语法格式请参见数据标记。
支持的对象有:“TABLE”、“VIEW”、“INDEX”、“PROCEDURE”、“FUNCTION”、“PACKAGE”、“SEQUENCE”、“TRIGGER”、 “SYNONYM”。可通过系统表sysmac.sysmac_obj查询对象标记信息。
9、验证强防设置是否成功
--U1 下列三个操作都成功
\c - u1
select * from tv;
call ff();
call pp();
--U2 下列三个操作都失败
\c - u2
select * from tv;
call ff();
call pp();
10、删除对象标记
\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');
11、删除
call sysmac.drop_user_access('P1', 'U1');
call sysmac.drop_user_access('P1', 'U2');
12、删除策略
call sysmac.drop_policy('P1', true);
13、清理环境
\c - system
drop view tv;
drop table tt;
drop function ff();
drop procedure pp();
drop user U1;
drop user U2;
参考文档:
《KingbaseES安全指南.pdf》




