跳转至

强制访问控制

强制访问控制(MAC)

SeaboxMPP数据库产品支持强制访问控制,从而保护数据安全。强制访问控制是用于将系统中的信息分密级和类进行管理,以保证每个用户只能访问到那些被标明可以由他访问的信息的一种访问约束机制。在强制访问控制下,用户与文件都被标记了固定的安全属性,在每次访问发生时,系统按照一定规则检测安全属性以便确定一个用户是否有权访问该文件。

强制访问控制通过“上写下读”规则来判定用户是否有权访问数据。该规则遵循简单保密模型,即"向下读,区间写"模型,实现信息流向总是向上的保密信息传递。下读规则是指用户只能读和自己等级一样或者等级比自己低的数据。区间写是上写模型,上写规则是指用户只能写入和自己等级一样或者等级比自己高的数据。同时,无论读还是写,当客体标签的范围是主体标签范围的子集时才能访问成功。

强制访问控制包括对象控制和行级控制。本产品目前支持对TABLE,ROUTINE,TABLESPACE,DATABASE,SCHEMA,AGGREGATE,VIEW,PROCEDURE,FUNCTION,SEQUENCE,COLUMN,LARGE OBJECT,MATERIALIZED VIEW等13种对象进行控制。其中,SEQUENCE,LARGE OBJECT和MATERIALIZED VIEW这3种对象目前只有单机支持。

架构和功能说明

控制参数
  • 参数sd_enable_mac控制强制访问控制是否打开,默认为关闭状态。

  • 执行安全标签命令(security label)之前,需要打开该参数。

set sd_enable_mac = on;
安全性
  • 出于数据安全性,只有安全员sd_sso才有权对标签元数据进行各种操作,即:对策略、标签、等级、范围的各种操作都必须由安全员sd_sso来完成。

策略(POLICY)管理

  • 管理一组标签元数据,即标签的元数据创建在策略上。
  • 可以通过系统表sd_mac_policy来获取安全策略的相关信息。
创建策略
语法
CREATE MAC POLICY policy_name;
功能
创建新的安全策略。默认情况下,策略创建后都处于禁用状态。
参数说明

参数见下

policy_name
指定要创建策略的名称,该名称必须在数据库中唯一。类型: 字符串
示例
CREATE MAC POLICY P1;
启用策略
语法
ALTER MAC POLICY policy_name ENABLE;
功能
启用安全策略。策略启用后,系统将会对受策略保护的对象实施访问控制。
参数说明
policy_name
指定要启用的策略名称, 类型: 字符串
示例
ALTER MAC POLICY P1 ENABLE;
禁用策略
语法
ALTER MAC POLICY policy_name DISABLE;
功能
禁用安全策略,而不是将策略从表上移除。策略禁用后,系统将不再对受策略保护的对象实施访问控制。
参数说明
policy_name
指定要禁用的策略名称, 类型: 字符串
示例
ALTER MAC POLICY P1 DISABLE;
删除策略
语法
DROP MAC POLICY policy_name;
功能
删除数据库中的指定安全策略。
参数说明
policy_name
指定要删除的策略名称,类型: 字符串
示例
DROP MAC POLICY P1;

标签(Label)管理

  • 标签由等级和范围构成。

  • 标签是可以比较的,其比较结果代表了数据的敏感程度。

  • 可以通过系统表pg_seclabel来获取标签的相关信息。

  • 如果赋予用户某些标签,再给数据赋予标签,这样,将用户的标签和数据的标签进行比较,按照一定规则来决定用户是否可以对数据进行访问。

  • 读写标签的创建遵循以下规范:

  • 等级和范围必须用冒号隔开。

  • 一个标签中只能有一个等级,但可以有多个范围。例如,“L1:C1,C2,C3”。

  • 读标签和写标签必须用分号隔开,且读标签在前,写标签在后。

  • 读写之间要求等级一致,写范围必须是读范围的子集;例如,“L1:C1,C2,C3;L1:C1,C2”。

  • 只定义一种标签时表示读写标签一致,例如,“L1:C1”,这时读写标签均为L1:C1。

  • 标签也可以只包含等级,不包含范围。例如,“L1:”,这种情况等同于属于所有范围。

等级(Level)管理

  • 等级代表数据的敏感级别,它关系到数据的安全性。

  • 本产品利用数字对数据划分等级,默认数值越大,敏感等级越高。

  • 可以通过系统表sd_mac_level来获取等级的相关信息。

创建等级
语法
CREATE MAC LEVEL(policy_name NAME,level_id INT,level_name NAME);
功能
创建指定策略下的等级,并指定等级的id。用户指定的id值的大小决定了等级的敏感性级别,数值越大级别越高。

参数说明 :

policy_name
:   指定数据库中已经创建的安全策略名称,类型: 字符串

level_id
:   指定要创建等级的id,id值在策略下唯一,类型: 整形

level_name
:   指定要创建等级的名称,等级名称在策略下唯一,类型: 字符串
示例
CREATE MAC LEVEL(P1,1,L1);
删除等级
语法
DROP MAC LEVEL(policy_name NAME,level_name NAME);
功能
删除指定策略下的等级。

参数说明 :

policy_name
:   指定数据库中已经创建的安全策略名称,类型: 字符串

level_name
:   指定要删除等级的名称,类型: 字符串
示例
DROP MAC LEVEL(P1,L1);

范围(Compartment)管理

  • 范围用于将数据分类。

  • 可以通过系统表sd_mac_compartment来获取范围的相关信息。

创建范围
语法
CREATE MAC COMPARTMENT(policy_name NAME,compartment_id INT,compartment _name NAME);
功能
创建指定策略下的范围,并指定范围的id。

参数说明 :

policy_name
:   指定数据库中已经创建的安全策略名称,类型: 字符串

compartment_id
:   指定要创建范围的id,id值在策略下唯一,类型: 整形

compartment _name
:   指定要创建范围的名称,等级名称在策略下唯一,类型: 字符串
示例
CREATE MAC COMPARTMENT(P1,1,C1);
删除范围
语法
DROP MAC COMPARTMENT(policy_name NAME,compartment _name NAME);
功能
删除指定策略下的范围。

参数说明 :

policy_name
:   指定数据库中已经创建的安全策略名称,类型: 字符串

compartment _name
:   指定要删除范围的名称,类型: 字符串
示例
DROP MAC COMPARTMENT(P1,C1);

安全标签(Security Label)管理

  • 为主体和客体设立安全标签。

  • 可以通过系统表pg_seclabel,pg_shseclabel,pg_seclabels来获取安全标签的相关信息。

  • 表pg_seclabel存放客体对象的安全标签信息。

  • 表pg_shseclabel存放用户主体的安全标签信息。

  • 表pg_seclabels存放所有的安全标签信息。

创建安全标签
语法
SECURITY LABEL FOR policy_name ON OBJECT object_name IS 'label_value';
功能
为用户主体和客体对象创建安全标签。

参数说明 :

policy_name
:   指定数据库中已经创建的安全策略名称, 类型: 字符串

object_name
:   指定数据库中已经创建的对象名称, 类型: 字符串

label_value
:   指定要创建的安全标签内容, 类型: 文本,具体格式请参见上文标签的创建规范
示例
SECURITY LABEL FOR P1 ON ROLE mac_user1 IS 'L1:C1,C2;L1:C2'; SECURITY LABEL FOR P1 ON TABLE mac_t1 IS 'L1:C1';
删除安全标签
语法
SECURITY LABEL FOR policy_name ON OBJECT object_name IS NULL;
功能
删除用户主体和客体对象的安全标签。

参数说明 :

policy_name
:   指定数据库中已经创建的安全策略名称, 类型: 字符串

object_name
:   指定要删除标签的对象的名称, 类型: 字符串
示例
SECURITY LABEL FOR P1 ON ROLE mac_user1 IS NULL; SECURITY LABEL FOR P1 ON TABLE mac_t1 IS NULL;

对象控制

  • 在为用户主体和客体对象创建标签元数据后,还需要授予用户主体权限和切换会话用户标识符,然后通过“上写下读”规则来判定用户主体是否有权对客体对象进行读、写操作。
授予主体权限Grant

需要给用户主体授予对客体相应的读写权限,否则用户主体无权访问客体对象。

示例

GRANT ALL ON TABLE mac_t1 TO mac_user1;
切换会话用户标识符

在授予主体权限以后,即可将会话用户标识符切换到该主体,然后进行对客体对象的读写操作。

示例

SET SESSION AUTHORIZATION mac_user1;

行级控制

  • 即对表的每一行进行访问控制,因此,可以将行级控制看作是对象控制的一种。

  • 同时,区别于对象控制,行级控制具有其特殊性,在创建标签元数据阶段还需要应用行级标签和启用行级安全。

应用行级标签
语法
CALL sd_mac_apply_table_policy(policy_name NAME,schema_name NAME,table_name NAME,col_name NAME,label_value TEXT);
功能
在要实施行级控制的表中新建一标签列,对表中的每一行数据设置标签,默认的标签内容为'label_value'。

参数说明 :

policy_name
:   指定数据库中已经创建的安全策略名称, 类型: 字符串

schema_name
:   指定数据库中已经创建的模式名称, 类型: 字符串

table_name
:   指定要实施行级控制的表的名称, 类型: 字符串

col_name
:   指定表中要新增的标签列的名称, 类型: 字符串

label_value
:   指定标签列的内容, 类型: 文本,具体格式请参见上文标签的创建规范
示例
CALL sd_mac_apply_table_policy('P1', 'public', 'row_t1', 'c1', 'L2:C2');
删除行级标签
语法
CALL sd_mac_remove_table_policy(policy_name NAME,schema_name NAME,table_name NAME);
功能
删除表中新建的标签列。

参数说明 :

policy_name
:   指定数据库中已经创建的安全策略名称, 类型: 字符串

schema_name
:   指定数据库中已经创建的模式名称, 类型: 字符串

table_name
:   指定要删除标签列的表的名称, 类型: 字符串
示例
CALL sd_mac_remove_table_policy('P1','public','row_t1');
启用行级安全
语法
ALTER TABLE table_name ENABLE ROW LEVEL SECURITY;
功能
为要实施行级控制的表启用行级安全。

参数说明 :

table_name
:   指定要启用行级安全的表的名称, 类型: 字符串
示例
ALTER TABLE row_t1 ENABLE ROW LEVEL SECURITY;

操作说明

用户操作流程

用户操作流程示意图如下:

用户操作流程示意图

“上写下读,范围包含”
  • “上写下读”,简而言之,就是用户只能写等级和自己一样或者比自己高的数据,只能读等级和自己一样或者比自己低的数据。

  • “范围包含”,就是读写都必须保证用户标签的范围是对象标签范围的子集。

  • 二者缺一不可,以下通过示例说明。

SECURITY LABEL FOR p1 ON ROLE mac_user1 IS 'L1:C1,C2;L1:C2';
SECURITY LABEL FOR p1 ON TABLE mac_t1 IS 'l1:c1';
SECURITY LABEL FOR p1 ON TABLE mac_t2 IS 'l2:c2';
SECURITY LABEL FOR p1 ON TABLE mac_t3 IS 'l1:c1,c2';
  1. 首先,将概念具象化,把等级看作是职员的级别,范围看作是职员所在的部门。

  2. 为主体mac_user1设置安全标签为'L1:C1,C2;L1:C2'。

  3. mac_user1的读标签为L1:C1,C2,写标签为L1:C2。

  4. 根据“上写下读”,就是说,用户mac_user1可以读C1、C2部门L1级和L1级以下的数据,可以写C2部门L1级和L1级以上的数据。

  5. 为客体表mac_t1设置安全标签为'l1:c1'。

  6. 表mac_t1属于c1部门,l1级别。

  7. 表mac_t2属于c2部门,l2级别。

  8. 表mac_t3同属于c1和c2两个部门,l1级别。

  9. 此处设定l2级别比l1高。

  10. 因此,mac_user1对表mac_t1可读不可写,对表mac_t2可写不可读,对表mac_t3可读可写。

注:标签内容不区分大小写,此处作区分仅为增强可读性。