1818IP-服务器技术教程,云服务器评测推荐,服务器系统排错处理,环境搭建,攻击防护等

当前位置:首页 - 数据库 - 正文

君子好学,自强不息!

Oracle的安全标记算不算bug

2022-11-18 | 数据库 | gtxyzz | 525°c
A+ A-

ORACLE提供了安全标记的功能,即OLS,也就是常说的强制访问控制。其模型是建立在BLP安全模型之上,并进行了扩展。

BLP模型的元素是安全级别和范围,即可以对主客体进行安全级别和范围的设定,从而达到控制数据流动的目的,即向下读、向上写的规则。即用户可以读低于用户安全级别的数据,写高于用户安全级别的数据(当然还有范围的约定,这里不介绍了)。

ORACLE扩展了BLP模型,用户可以设置多个安全级别,通过如下接口:

SA_USER_ADMIN.SET_LEVELS 
Syntax: 
PROCEDURESET_LEVELS(policy_nameINVARCHAR2, 
user_name 
INVARCHAR2, 
max_level 
INVARCHAR2, 
min_level 
INVARCHAR2DEFAULTNULL, 
def_level 
INVARCHAR2DEFAULTNULL, 
row_level 
INVARCHAR2DEFAULTNULL); 
ParameterMeaning 
policy_nameSpecifiesthepolicy 
user_nameSpecifiestheusername 
max_levelThehighestlevelforreadandwriteaccess 
min_levelThelowestlevelforwriteaccess                         def_levelSpecifiesthedefaultlevel(equaltoor 
greaterthantheminimumlevel,andequal   toorlessthanthemaximumlevel) 
row_levelSpecifiestherowlevel(equaltoorgreater  thantheminimumlevel,andequaltoor

可以看出,用户标记可以指定最大、最小、默认和行级四种安全级别。这些安全级别之间是有约束关系的

min_level<=max_levelmin_level<=def_level<=max_levelmin_level<=row_level<=def_level 

如果违法这种规则的话,执行此函数就会失败。了解了这么多之后,我们进行实践,以LBACSYS进行登录,执行如下语句

--创建策略P1,并为策略添加安全级别,数值越大代表安全级别越高。 
--L1<L2<L3<L4
EXECsa_sysdba.create_policy('P1','LABEL_COL'); 
EXECsa_components.create_level('P1',10,'L1','L1'); 
EXECsa_components.create_level('P1',20,'L2','L2'); 
EXECsa_components.create_level('P1',30,'L3','L3'); 
EXECsa_components.create_level('P1',40,'L4','L4'); 
--给用户SYSMAN设置用户标记 
EXECsa_user_admin.set_levels('P1','SYSMAN','L2','L1','L2','L2'); 

根据上面的介绍,这里设置的四种安全级别符合要求。我们通过DBA_SA_USER_LABELS视图可以查看用户的标记。

SQL>SELECTUSER_NAME,LABELSFROMDBA_SA_USER_LABELS; 
USER_NAME 
-------------------------------------------------------------------------------- 
LABELS 
-------------------------------------------------------------------------------- 
SYSMAN 
MAXREADLABEL='L2',MAXWRITELABEL='L2',MINWRITELABEL='L1',DEFAULTREADLABEL 
='L2',DEFAULTWRITELABEL='L2',DEFAULTROWLABEL='L2'

可以看到MIN WRITE LABEL = L1

同时ORACLE提供了一个系统函数,用于改变标记的值:

Syntax: 
PROCEDUREALTER_LABEL( 
policy_nameINVARCHAR2, 
label_tagININTEGER, 
new_label_valueINVARCHAR2DEFAULTNULL, 
new_data_labelINBOOLEANDEFAULTNULL); 
PROCEDUREALTER_LABEL( 
policy_nameINVARCHAR2, 
label_valueINVARCHAR2, 
new_label_valueINVARCHAR2DEFAULTNULL, 
new_data_labelINBOOLEANDEFAULTNULL); 
Table6–18ParametersforSA_LABEL_ADMIN.ALTER_LABEL 
ParameterNameParameterDescription 
policy_name  Specifiesthenameofanexistingpolicy 
label_tag Identifiestheintegertagassignedtothelabel tobealtered 
label_valueIdentifiestheexistingcharacterstringrepresentationofthelabeltobealtered 
new_label_value  Specifiesthenewcharacterstringrepresentationofthelabelvalue.IfNULL,the existingvalueisnotchanged. 

此时我们对L1的标记进行改写

EXECsa_label_admin.alter_label('P1','L1','L4',TRUE);

执行成功,我们查看用户标记表,发现如下所示:

SQL>SELECTUSER_NAME,LABELSFROMDBA_SA_USER_LABELS; 
USER_NAME 
-------------------------------------------------------------------------------- 
LABELS 
-------------------------------------------------------------------------------- 
SYSMAN 
MAXREADLABEL='L2',MAXWRITELABEL='L2',MINWRITELABEL='L4',DEFAULTREADLABEL 
='L2',DEFAULTWRITELABEL='L2',DEFAULTROWLABEL='L2'

可以看出MIN WRITE LABEL变成了L4,其他的LABEL还是L2,这时的用户标记已经是不合法的了,在这种情况下,在执行相应操作时,很多操作会被禁止,比如对打了标记的表进行更新操作,因为此时的用户标记在进行访问判断时永远是恒假值(不过此时系统不会崩溃,有点失望..),以上实验的版本为11.1.0.6.0

本文来源:1818IP

本文地址:https://www.1818ip.com/post/4538.html

免责声明:本文由用户上传,如有侵权请联系删除!

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。