UXDB的强制访问控制在BLP模型的基础上作了一定的改进,采用“向下读,区间写”的原则,实现主客体的访问控制。
读访问控制规则较为简单。UXDB首先获取客体标记,然后试图获得主体在同一策略上的最大读标记。下面两种情况下允许主体读客体数据:
客体没有标记。
客体有标记,主体在同一策略上有标记且满足客体标记用户最大读标记。
否则,禁止主体对客体数据的访问。
写访问控制的规则中,UXDB首先获取客体标记,然后试图获得主体在同一策略上的最大写标记和最小写标记。下面两种情况下允许主体写客体数据:
客体没有标记。
客体有标记,主体在同一策略上有标记,且满足主体的最小写标记客体标记用户的最大写标记。
否则,禁止主体对客体数据的访问。
UXDB安全数据库通过以下系统表来存储强访相关元数据:
ux_mac_policy,ux_label_level,ux_label_scope,用于存储策略定义和内部编码。
ux_user_label存储主体标记,主体标记可以有多个。
在ux_class的reloptions选项中mac_policy_id存储策略id,隐藏列plcol,plcol_level,plcol_scope存储行的标记。
在ux_attribute的attoptions选择中mac_policy_id,mac_label_level,mac_label_scope存储列标记。
创建策略:
mac_create_policy('policyname','level_list','scope_list')
policyname:策略名称。
level_list:等级列表,从高到低。
scope_list:范围列表,最大为32。
主体标记:
mac_set_user_label('username','policyname','max_read','max_write','min_write','default_session','default_write')
参数依次为:主体名(用户名)、策略名、最大读标记、最大写标记、最小写标记、默认会话标记、默认写标记。
标记规则:
max_read>=max_write>=default_write>=min_write max_read>=default_session
主体标记可以有多个。
客体标记——行级:
mac_apply_row_policy('schema_name','table_name','policyid')
schema_name:需要标记的表所在的模式名。
table_name:需要标记的表名。
policyid:标记使用的策略名。
一个客体只能有一个标记。
客体标记——列级:
mac_set_column_label('schema_name','table_name','column_name','label')
schema_name:需要标记的表所在的模式名。
table_name:需要标记的表名。
column_name:需要标记的列名。
label使用的标记。
一个客体只能有一个标记。
删除策略:
mac_drop_policy('policyname')
policyname:删除策略的名称。
删除表级标记:
mac_drop_row_policy('schema_name','table_name')
schema_name:带有标记的表所在模式名称。
table_name:带有标记的表的表名。
删除列级标记:
mac_drop_column_label('schema_name','table_name','column_name')
schema_name:带有标记的表所在模式名称。
table_name:带有标记的表的表名。
column_name:带有标记的列名。
查看当前主体标记:
select?useid,policyid?from?ux_user_label;
删除主体标记:
select?mac_drop_user_label('主体名','策略名');
删除策略:
select?mac_drop_policy('策略名');
查看当前策略:
select?*?from?ux_mac_policy;
查看客体行标记:
select?relname,reloptions?from?ux_class?where?reloptions?is?not?null;
删除行标记:
select?mac_drop_row_policy('模式名','表名');
客体列标记:
select?attname,attoptions?from?ux_attribute?where?attoptions?is?not?null;
删除列标记:
select?mac_drop_column_label('模式名','表名','列名');