1 简介 1.1 目的 本文主要包括以下关键内容:
介绍访问控制的基本概念 调研其他厂商实现强制控制的方式 设计Vastbase强制访问控制特性,介绍如何使用强制访问特性 1.2 适用范围 Vastbase V5版本。
1.3 术语定义、首字母缩写词和缩略语 MAC:Mandatory Access Control,强制访问控制,主体访问客体时,基于主体、客体属性,强制控制访问权限。 DAC:Discretionary Access Control,自主访问控制,数据拥有者可自行设置访问权限。 1.4 参考资料 oracle 强制访问控制(标签访问控制 RLS):https://docs.oracle.com/en/database/oracle/oracle-database/26/olsag/part1.html#GUID-C20C62AE-2A30-45F9-AEEA-52A0D3286FBA oceanbase 强制访问控制(兼容oracle):https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475944 kingbase 强制访问控制:https://bbs.kingbase.com.cn/kingbase-doc/v8.6.7.24/safety/safety-guide/label-and-mac.html dm 强制访问控制:https://eco.dameng.com/document/dm/zh-cn/pm/mandatory-access-control.html GB/T-20009-数据库管理系统安全评估准则:https://drive.weixin.qq.com/s?k=AHUAfwdSAA82aDcvvD postgresql 行级访问控制 RLS:https://www.postgresql.org/docs/current/ddl-rowsecurity.html 2 强制访问控制 2.1 功能简述 一、基本概念 访问控制的定义:对主体访问客体的行为,系统按照安全策略进行限制与管理的安全机制。
按安全策略分类,可将访问控制分为很多类,其中,常见的策略有:
自主访问控制DAC:客体的拥有者,可自行向其他主体赋予访问权限。 强制访问控制MAC:系统为主体、客体分配安全标签,通过主体、客体的安全标签控制访问权限,很多情况下,即使客体的拥有者也无法向其他主体赋予访问权限。 角色访问控制RBAC:不在本文讨论范围。 在数据库领域,主体通常指数据库用户,客体通常指数据库对象,例如DATABASE、SCHEMA、TABLE、COLUMN、ROW、FUNCTION等。
自主访问控制比较成熟,几乎所有关系数据库,都提供自主访问控制特性,例如,TABLE(客体)的属主(主体),可通过GRANT .. TO ..等语法,为其他用户(主体)赋予权限。
强制访问控制理论比较成熟,但是,除oracle支持强制访问控制,以及oceanbase等几款产品兼容oracle强制访问控制之外,大部分关系数据库不支持强制访问控制。
实现强制访问控制时,通常将主体、客体的安全标签,简化为安全等级,当主体访问客体时,比较主体、客体等级高低,以判断访问权限。在机密性场景,遵循不上读、不下写原则。在完整性场景,遵循不下读、不上写原则。
本需求将从0设计强制访问控制特性,在保障功能、性能、易用性、可用性、可维护性、可扩展性等的前提下,让特性达到商用标准。
二、竞品分析 oracle支持强制访问控制,客体是ROW,即行级强制访问控制。oceanbase、kingbase、dm的访问控制,与oracle一致。sql server、postgresql等其他产品不支持强制访问控制。
oracle强制访问控制使用示例如下:
-- 1 定义策略 SA_SYSDBA.CREATE_POLICY(policy_name => 'p1', column_name => 'lab_col1') -- 2 定义级别 SA_COMPONENTS.CREATE_LEVEL(policy_name => 'p1', level_num => 1, short_name => 'x1', long_name => 'x1'); SA_COMPONENTS.CREATE_LEVEL('p1', 20, 'x2', 'x2'); SA_COMPONENTS.CREATE_LEVEL('p1', 30, 'x3', 'x3'); -- 3 定义组件 SA_COMPONENTS.CREATE_LEVEL(policy_name =>'p1', comp_num => 100, short_name => 'sec', long_name => 'security'); SA_COMPONENTS.CREATE_LEVEL('p1', 200, 'stg', 'storage'); -- 4 创建标签 SA_SYSDBA.CREATE_LABEL(policy_name => 'p1', label_tag => 'sec_normal', label_value => 'x1:security', data_label => TRUE); SA_SYSDBA.CREATE_LABEL('p1', 'sec_leader', 'x3:security', false); -- 5 为主体设置属性 SA_USER_ADMIN.SET_LEVELS(policy_name => 'p1', user_name => 'user1', max_level => 'x2', min_level => 'x1', default_level => 'x1', row_level => 'x1'); SA_USER_ADMIN.SET_COMPARTMENTS(policy_name => 'p1', user_name => 'user1', read_comps => 'sec', write_comps => 'sec', default_comps => 'sec', row_comps => 'sec'); -- 6 为客体设置属性 CREATE TABLE t1(c1 INT); SA_USER_ADMIN.APPLY_TABLE_POLICY(policy_name=> 'p1', shema_name => 's1', table_name => 't1', table_options => 'READ_CONTROL, WRITE_CONTROL, CHECK_CONTROL', label_function => 'f_create_t1_label(level, comp)'); -- 7 插入数据(主动定义标签) INSERT INTO t1 (c1, lab_col1) VALUES (1, CHAR_TO_LABEL('p1', 'x1:sec')); 三、实现思路 在数据库领域,除oracle外,没有其他可借鉴的方案。oracle的设计,太复杂,易用性太低。
本需求将参考oracle的思想,简化oracle设计。
...