• Oracle的bug还是故意为之?


     

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

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

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

     

    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 Specifies the default level (equal to or  
    greater than the minimum level, and equal  
       to or less than the maximum level)

    row_level Specifies the row
    level (equal to or greater  
      than the minimum level, and equal to or  
          less than the default level)

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

    min_level<=max_level
    min_level<=def_level<=max_level
    min_level<=row_level<=def_level

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

    --创建策略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视图可以查看用户的标记。

    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='L1',DEFAULT READ LABEL
    ='L2',DEFAULT WRITE LABEL='L2',DEFAULT ROW LABEL='L2'

      可以看到MIN WRITE LABEL = L1

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

    Syntax:
    PROCEDURE ALTER_LABEL (
    policy_name
    IN VARCHAR2,
    label_tag
    IN INTEGER,
    new_label_value
    IN VARCHAR2 DEFAULT NULL,
    new_data_label
    IN BOOLEAN DEFAULT NULL);
    PROCEDURE ALTER_LABEL (
    policy_name
    IN VARCHAR2,
    label_value
    IN VARCHAR2,
    new_label_value
    IN VARCHAR2 DEFAULT NULL,
    new_data_label
    IN BOOLEAN DEFAULT NULL);
    Table 618 Parameters for SA_LABEL_ADMIN.ALTER_LABEL
    Parameter Name Parameter Description
    policy_name   Specifies the name
    of an existing policy

    label_tag  Identifies the
    integer tag assigned to the label
      to be altered

    label_value Identifies the existing
    character string  
    representation of the label to be altered


    new_label_value   Specifies the new
    character string  
    representation of the label value. If NULL, the
     existing value is not changed.

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

    EXEC sa_label_admin.alter_label('P1', 'L1', 'L4', TRUE);

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

    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='L4',DEFAULT READ LABEL
    ='L2',DEFAULT WRITE LABEL='L2',DEFAULT ROW LABEL='L2'

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

     




  • 相关阅读:
    如何构造分片报文
    Python趣味入门7:循环与条件的爱恨情仇
    如何使用Javascript开发sliding-nav带滑动条效果的导航插件?
    java获取微信用户信息(含源码,直接改下appid就可以使用了)
    数据库设计工具-PowerDesigner中table视图显示name与code
    typora增加到鼠标右键
    基于springboot整合spring-retry
    idea中提交项目到github及invalid authentication data 404 not found not found问题
    git秘钥问题解析及gitlab配置(Please make sure you have the correct access rights and the repository exists)
    idea中打包跳过test
  • 原文地址:https://www.cnblogs.com/nocode/p/2036873.html
Copyright © 2020-2023  润新知