ORACLE提供了安全标记的功能,即OLS,也就是常说的强制访问控制。其模型是建立在BLP安全模型之上,并进行了扩展。rOj中国设计秀
BLP模型的元素是安全级别和范围,即可以对主客体进行安全级别和范围的设定,从而达到控制数据流动的目的,即向下读、向上写的规则。即用户可以读低于用户安全级别的数据,写高于用户安全级别的数据(当然还有范围的约定,这里不介绍了)。rOj中国设计秀
ORACLE扩展了BLP模型,用户可以设置多个安全级别,通过如下接口:rOj中国设计秀
- SA_USER_ADMIN.SET_LEVELS
- Syntax:
- PROCEDURE SET_LEVELS (policy_name IN VARCHAR2,
- user_name
- IN VARCHAR2,
- max_level
- IN VARCHAR2,
- min_level
- IN VARCHAR2 DEFAULT NULL,
- def_level
- IN VARCHAR2 DEFAULT NULL,
- row_level
- IN VARCHAR2 DEFAULT NULL);
- Parameter Meaning
- policy_name Specifies the policy
- user_name Specifies the user name
- max_level The highest level for read and write access
- min_level The lowest level for write access def_level rOj中国设计秀
Specifies the default level (equal to or
- greater than the minimum level, and equal rOj中国设计秀
to or less than the maximum level)
- row_level rOj中国设计秀
Specifies the row level (equal to or greater rOj中国设计秀
than the minimum level, and equal to or
可以看出,用户标记可以指定最大、最小、默认和行级四种安全级别。这些安全级别之间是有约束关系的rOj中国设计秀
min_level<=max_levelmin_level<=def_level<=max_levelmin_level<=row_level<=def_levelrOj中国设计秀
如果违法这种规则的话,执行此函数就会失败。了解了这么多之后,我们进行实践,以LBACSYS进行登录,执行如下语句rOj中国设计秀
- --创建策略P1,并为策略添加安全级别,数值越大代表安全级别越高。
- --L1<L2<L3<L4
- EXEC sa_sysdba.create_policy('P1','LABEL_COL');
- EXEC sa_components.create_level('P1', 10, 'L1', 'L1');
- EXEC sa_components.create_level('P1', 20, 'L2', 'L2');
- EXEC sa_components.create_level('P1', 30, 'L3', 'L3');
- EXEC sa_components.create_level('P1', 40, 'L4', 'L4');
- --给用户SYSMAN设置用户标记
- EXEC sa_user_admin.set_levels('P1','SYSMAN','L2', 'L1', 'L2', 'L2');
根据上面的介绍,这里设置的四种安全级别符合要求。我们通过DBA_SA_USER_LABELS视图可以查看用户的标记。rOj中国设计秀
- SQL> SELECT USER_NAME, LABELS FROM DBA_SA_USER_LABELS;
- USER_NAME
- --------------------------------------------------------------------------------
- LABELS
- --------------------------------------------------------------------------------
- SYSMAN
- MAX READ LABEL='L2',MAX WRITE LABEL='L2',MIN WRITE LABEL=rOj中国设计秀
'L1',DEFAULT READ LABEL
- ='L2',DEFAULT WRITE LABEL='L2',DEFAULT ROW LABEL='L2'
可以看到MIN WRITE LABEL = L1rOj中国设计秀
同时ORACLE提供了一个系统函数,用于改变标记的值:rOj中国设计秀