基本强制访问控制功能部分

创建一个策略

select create_policy(
        policy_name,
        column_name,
        default_options
);
参数解释
policy_name 策略名。
column_name 创建策略后对应该策略的列名(为表授权时新增列的列名)。
default_options 默认策略项,在客体上使用该策略并且未指定策略项,则默认使用该策略项填充。
神通数据库支持以下策略项
LABEL_DEFAULT 使用该策略时,进行insert操作未指定标签则使用用户的默认标签。
LABEL_UPDATE 使用该策略时,修改行的安全标记需要用户被授予相应的权限。
READ_CONTROL 使用该策略时,只对读操作做权限检查。
WRITE_CONTROL 使用该策略时,只对写操作做权限检查。
INSERT_CONTROL 使用该策略时,只对 INSERT 操作做权限检查。
UPDATE_CONTROL 使用该策略时,只对 UPDATE 操作做权限检查。
DELETE_CONTROL 使用该策略时,只对 DELETE 操作做权限检查。
ALL_CONTROL 使用该策略时,将对上述所有策略涉及到的操作做权限检查。
NO_CONTROL 使用该策略时,此策略不生效。

创建安全隔间

select create_compartment(
        policy_name,
        comp_num,
        short_name,
        long_name
);
参数解释
policy_name 隔间所属的策略名。
comp_num 隔间名的数字形式,在所属策略下必须唯一,范围要求【0,9999】
short_name 隔间名的缩写形式,在所属策略下必须唯一。
long_name 隔间名的全称形式,在所属策略下必须唯一。

创建安全级别

select create_level(
        policy_name,
        level_num,
        short_name,
        long_name
);
参数解释
policy_name 级别所属的策略名。
level_num 级别名的数字形式,在所属策略下必须唯一,范围要求【0,9999】
short_name 级别名的缩写形式,在所属策略下必须唯一。
long_name 级别名的全称形式,在所属策略下必须唯一。

设置用户的安全标记

select set_user_labels(
        policy_name,
        user_name,
        max_read_label,
        min_write_label,
        default_label,
        compartment_abbr,
);
参数解释
policy_name 策略名。
user_name 用户名称。
max_read_label 用户的最大读标签,描述用户拥有的最大读写级别和读隔间集合。
min_write_label 用户的最小写标签,描述用户拥有的最小写级别和写隔间集合。
default_label 用户的默认标签,可为空,为空时使用最大读级别+最小写隔间组成默认标签。
compartment_abbr 表示标签中隔间集合使用的是否是数字形式。FALSE表示使用的数字形式, TRUE表示没有使用数字形式。可为空,默认为TRUE。

注解

可通过再次设置更新用户的安全标记。

在表上应用策略

select apply_table_policy(
        policy_name,
        schema_name,
        table_name,
        apply_row_control,
        option,
        add_control_col
);
参数解释
policy_name 策略名。
schema_name 表所属的模式名。
table_name 表名。
apply_row_control 是否启用策略,TRUE表示启用策略,FALSE表示不启用策略。
option 策略项,若传入空字符串,则使用该策略的默认策略项。
add_control_col 是否创建控制列,通常在逻辑恢复时使用,数据表和控制列已经恢复, 恢复配置时不去检查或创建控制列,可为空,默认为TRUE。

注解

在表上应用策略之前请确保其属主已经应用了该策略。

在模式上应用策略

select apply_schema_policy(
        policy_name,
        schema_name,
        option
);
参数解释
policy_name 策略名。
schema_name 表所属的模式名。
option 策略项,若传入空字符串,则使用该策略的默认策略项。

注解

在模式上应用策略,其下的所有表均受该策略控制,允许对模式下的表单独设置。

在对象上应用策略

select apply_object_policy(
        policy_name,
        schema_name,
        object_name,
        object_kind
);
参数解释
policy_name 策略名。
schema_name 对象所属的模式名。
object_name 对象名。
apply_row_control 对象类型
  • 以上的工作完成之后,就可以进行强制访问控制的基本功能测试了。

示例1: 创建策略/级别/隔间

--  清理环境
SELECT DROP_POLICY('P1',true);

--  创建策略, 并为其增加级别和隔间
SELECT CREATE_POLICY('P1', 'Col1', 'ALL_CONTROL');
CREATE_POLICY(VOID)      |
-------------------------
总数目:1

SELECT CREATE_LEVEL('P1', 1, 'L1', 'L1');
CREATE_LEVEL(VOID)      |
------------------------
总数目:1

SELECT CREATE_LEVEL('P1', 2, 'L2', 'L2');
CREATE_LEVEL(VOID)      |
------------------------
总数目:1

SELECT CREATE_LEVEL('P1', 3, 'L3', 'L3');
CREATE_LEVEL(VOID)      |
------------------------
总数目:1

SELECT CREATE_COMPARTMENT('P1', 1, 'A', 'A');
CREATE_COMPARTMENT(VOID)      |
------------------------------
总数目:1

SELECT CREATE_COMPARTMENT('P1', 2, 'B', 'B');
CREATE_COMPARTMENT(VOID)      |
------------------------------
总数目:1

SELECT CREATE_COMPARTMENT('P1', 3, 'C', 'C');
CREATE_COMPARTMENT(VOID)      |
------------------------------
总数目:1


-- 查询此时存在的策略以及它所拥有的级别和隔间
SELECT MACPOLNAME as "策略名", MACPOLCOLNAME as "策略列名", MACLEVNAME as "级别名" FROM SYS_MAC_POLICY smp, SYS_MAC_LEVEL sml where smp.MACPOLID = sml.macpolid;
策略名(name)      |策略列名(name)      |级别名(name)      |
----------------------------------------------
P1             |COL1            |L1             |
----------------------------------------------
P1             |COL1            |L2             |
----------------------------------------------
P1             |COL1            |L3             |
总数目:3

SELECT MACPOLNAME as "策略名", MACPOLCOLNAME as "策略列名", MACCOMPNAME as "隔间名" FROM SYS_MAC_POLICY smp, SYS_MAC_COMP smc where smp.MACPOLID = smc.macpolid;
策略名(name)      |策略列名(name)      |隔间名(name)      |
----------------------------------------------
P1             |COL1            |A              |
----------------------------------------------
P1             |COL1            |B              |
----------------------------------------------
P1             |COL1            |C              |
总数目:3

示例2: 将策略应用到 user/calss/schema/object

CONNECT sysdba/szoscar55;
--创建用户
create user u1 password '1234';
create user u2 password '1234';
--创建模式
create schema sch1;
--创建表
create table t1(a int);
--创建视图
create view v1 as select * from t1;


CONNECT syssecure/szoscar55;
--为用户授予安全标记
select set_user_labels('P1', 'SYSDBA', 'L3:A,B,C', 'L1:A,B,C');
SET_USER_LABELS(VOID)      |
---------------------------
总数目:1

select set_user_labels('P1', 'U1', 'L2:A,B,C', 'L2:A');
SET_USER_LABELS(VOID)      |
---------------------------
总数目:1

select set_user_labels('P1', 'U2', 'L3:A,B', 'L1:B');
SET_USER_LABELS(VOID)      |
---------------------------
总数目:1

--在表上应用策略
select apply_table_policy('P1', 'SYSDBA', 'T1', TRUE, '', TRUE);
APPLY_TABLE_POLICY(VOID)      |
------------------------------
总数目:1

--在对象上应用策略
select apply_object_policy('P1', 'SYSDBA', 'V1', 'v');
APPLY_OBJECT_POLICY(VOID)      |
-------------------------------
总数目:1

--在模式上应用策略,未指定策略项,则使用默认策略
select apply_schema_policy('P1', 'SCH1', '');
APPLY_SCHEMA_POLICY(VOID)      |
-------------------------------
总数目:1


-- 查询目前策略应用情况
select MACPOLNAME as "策略名", relname as "表名" from sys_mac_policy_class smpc, sys_mac_policy smp, sys_class sc where smpc.MACPOLID = smp.MACPOLID and smpc.MACCLASSID = sc.oid;
策略名(name)      |表名(name)      |
-----------------------------
P1             |T1            |
总数目:1

select MACPOLNAME as "策略名", relname as "对象名" from sys_mac_policy_object smpo, sys_mac_policy smp, sys_class sc where smpo.POLID = smp.MACPOLID and smpo.OBJID = sc.oid;
策略名(name)      |对象名(name)      |
------------------------------
P1             |V1             |
总数目:1

select MACPOLNAME as "策略名", NSPNAME as "模式名" from sys_mac_policy_namespace smpn, sys_mac_policy smp, sys_namespace sn where smpn.MACPOLID = smp.MACPOLID and smpn.MACNAMESPACEID = sn.oid;
策略名(name)      |模式名(name)      |
------------------------------
P1             |SCH1           |
总数目:1