通过Oracle Label Security (OLS) 实现细粒度访问控制

来源:这里教程网 时间:2026-03-03 21:40:34 作者:
Oracle Label Security (OLS) 是 Oracle 数据库提供的一种细粒度访问控制(FGAC)技术,通过基于标签的访问控制(LBAC)模型,实现行级数据安全。它允许管理员为数据行分配安全标签,并根据用户的权限标签动态过滤数据访问。

一、技术架构与核心概念

1. 架构设计

  • 集成于数据库内核
    :OLS 直接嵌入 Oracle 数据库内核,与 SQL 解析器、优化器和执行引擎深度集成,确保访问控制逻辑在查询处理的最早阶段生效。
  • 标签存储
    :每个受保护的表会自动添加一个名为 OLS_LABEL 的隐藏列(默认名称可配置),存储二进制格式的标签值(RAW 类型)。
  • 策略实施点
    :在 SQL 解析阶段,OLS 通过重写查询(Query Rewrite)自动添加标签过滤条件,对用户透明。

    2. 核心概念

  • 策略(Policy)
    :定义标签的规则集合,包括标签组件(级别、组、区间)和访问规则。例如,策略 HR_POLICY 可管理人力资源数据的标签。
    标签组件
  • 级别(Level)
    :数据的敏感程度,如 PUBLIC、CONFIDENTIAL、SECRET。
    组(Group)
    部门或业务单元,如 HR、FINANCE。
    区间(Compartment)
    可选,进一步细分数据的类别(如 PROJECT_A、PROJECT_B)。
    用户标签权限
  • 最大读标签(Max Read Label)
    :用户能读取的最高标签级别。
  • 最大写标签(Max Write Label)
    :用户能创建或修改的最高标签级别。
  • 默认会话标签(Default Session Label)
    :用户未显式指定标签时的默认值。
    下面我们通过Oracle Label Security (OLS) 实现细粒度访问控制(FGAC)和行级权限管理,下面做一个详细的技术步骤和测试案例:

    一、技术实现步骤

    1. 安装与启用Oracle Label Security

  • 确认安装
    :OLS需Oracle Enterprise Edition并购买相应许可。
  • 启用OLS:
    SQL> EXEC LBACSYS.CONFIGURE_OLS; SQL> EXEC LBACSYS.OLS_ENFORCEMENT.ENABLE_OLS;

    2. 创建安全策略

  • 使用SA_SYSDBA.CREATE_POLICY创建策略:
    BEGIN  SA_SYSDBA.CREATE_POLICY(    policy_name => 'EMP_ACCESS_POLICY',    column_name => 'OLS_LABEL'  -- 自动添加到表中的标签列  ); END;

    3. 定义标签组件

  • 级别(Level)
    :如PUBLIC, SENSITIVE, HIGHLY_SENSITIVE
    组(Group)如HR, FINANCE。
  • 创建组件
    BEGIN  SA_COMPONENTS.CREATE_LEVEL('EMP_ACCESS_POLICY', 100, 'PUBLIC', 'Public Data');  SA_COMPONENTS.CREATE_LEVEL('EMP_ACCESS_POLICY', 200, 'SENSITIVE', 'Sensitive Data');  SA_COMPONENTS.CREATE_LEVEL('EMP_ACCESS_POLICY', 300, 'HIGHLY_SENSITIVE', 'Highly Sensitive');    SA_COMPONENTS.CREATE_GROUP('EMP_ACCESS_POLICY', 'HR', 'Human Resources');  SA_COMPONENTS.CREATE_GROUP('EMP_ACCESS_POLICY', 'FINANCE', 'Finance Department'); END;

    4. 创建标签

  • 组合组件生成标签:
    BEGIN  SA_LABEL_ADMIN.CREATE_LABEL(    policy_name => 'EMP_ACCESS_POLICY',    label_tag => 1,    label_value => 'SENSITIVE:HR'  );  SA_LABEL_ADMIN.CREATE_LABEL(    policy_name => 'EMP_ACCESS_POLICY',    label_tag => 2,    label_value => 'PUBLIC:HR'  ); END;

    5. 应用策略到表

  • 将策略应用到EMPLOYEES表:
    BEGIN  SA_POLICY_ADMIN.APPLY_TABLE_POLICY(    policy_name => 'EMP_ACCESS_POLICY',    schema_name => 'HR',    table_name => 'EMPLOYEES',    table_options => 'READ_CONTROL,WRITE_CONTROL'  ); END;

    6. 分配用户标签权限

  • 授权用户访问特定标签:
    BEGIN  SA_USER_ADMIN.SET_USER_LABELS(    policy_name => 'EMP_ACCESS_POLICY',    user_name => 'USER_A',    max_read_label => 'SENSITIVE:HR',    max_write_label => 'SENSITIVE:HR'  );    SA_USER_ADMIN.SET_USER_LABELS(    policy_name => 'EMP_ACCESS_POLICY',    user_name => 'USER_B',    max_read_label => 'PUBLIC:HR',    max_write_label => 'PUBLIC:HR'  ); END;

    7. 插入测试数据

  • 插入数据并指定标签:
    INSERT INTO HR.EMPLOYEES (id, name, OLS_LABEL) VALUES (1, 'Alice', CHAR_TO_LABEL('EMP_ACCESS_POLICY', 'SENSITIVE:HR')); INSERT INTO HR.EMPLOYEES (id, name, OLS_LABEL) VALUES (2, 'Bob', CHAR_TO_LABEL('EMP_ACCESS_POLICY', 'PUBLIC:HR'));

    二、测试案例

    场景1:用户A访问数据

  • 用户权限
    :可读取SENSITIVE:HR及更低级别数据。
    CONNECT USER_A/password@db; SELECT * FROM HR.EMPLOYEES;
    预期结果:看到Alice(SENSITIVE:HR)和Bob(PUBLIC:HR)的记录。

    场景2:用户B访问数据

  • 用户权限
    :仅能访问PUBLIC:HR。
    CONNECT USER_B/password@db; SELECT * FROM HR.EMPLOYEES;
    预期结果:仅看到Bob的记录。

    场景3:用户B尝试插入高敏感数据

  • 尝试插入超出权限的数据:
    INSERT INTO HR.EMPLOYEES (id, name, OLS_LABEL) VALUES (3, 'Charlie', CHAR_TO_LABEL('EMP_ACCESS_POLICY', 'SENSITIVE:HR'));
    预期结果:抛出错误 ORA-12406: unauthorized write access。

    三、常见问题排查

    1. 数据不可见
    :检查用户标签权限和数据的标签是否匹配。
    1. 写入失败
    :确认用户的max_write_label是否足够高。
    1. 策略未生效
    :确认策略已正确应用且会话标签设置正确。

    四、总结

    通过Oracle Label Security,可高效实现基于标签的行级权限控制,确保数据仅对授权用户可见。实际应用中需结合业务需求设计标签结构,并通过严格测试验证策略正确性。
  • 相关推荐