Oracle Label Security (OLS) 是 Oracle 数据库提供的一种细粒度访问控制(FGAC)技术,通过基于标签的访问控制(LBAC)模型,实现行级数据安全。它允许管理员为数据行分配安全标签,并根据用户的权限标签动态过滤数据访问。
集成于数据库内核
一、技术架构与核心概念
1. 架构设计
:OLS 直接嵌入 Oracle 数据库内核,与 SQL 解析器、优化器和执行引擎深度集成,确保访问控制逻辑在查询处理的最早阶段生效。
标签存储
:每个受保护的表会自动添加一个名为 OLS_LABEL 的隐藏列(默认名称可配置),存储二进制格式的标签值(RAW 类型)。
策略实施点
:在 SQL 解析阶段,OLS 通过重写查询(Query Rewrite)自动添加标签过滤条件,对用户透明。
策略(Policy)
2. 核心概念
:定义标签的规则集合,包括标签组件(级别、组、区间)和访问规则。例如,策略 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;
使用SA_SYSDBA.CREATE_POLICY创建策略:
2. 创建安全策略
BEGIN
SA_SYSDBA.CREATE_POLICY(
policy_name => 'EMP_ACCESS_POLICY',
column_name => 'OLS_LABEL' -- 自动添加到表中的标签列
);
END;
级别(Level)
3. 定义标签组件
:如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;
将策略应用到EMPLOYEES表:
5. 应用策略到表
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。
三、常见问题排查
- 数据不可见
:检查用户标签权限和数据的标签是否匹配。
- 写入失败
:确认用户的max_write_label是否足够高。
- 策略未生效
:确认策略已正确应用且会话标签设置正确。
四、总结
通过Oracle Label Security,可高效实现基于标签的行级权限控制,确保数据仅对授权用户可见。实际应用中需结合业务需求设计标签结构,并通过严格测试验证策略正确性。
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 19C统计信息引发的数据库慢问题
19C统计信息引发的数据库慢问题
26-03-03 - SQL优化之数据倾斜解决方案
SQL优化之数据倾斜解决方案
26-03-03 - 一次报表查询优化
一次报表查询优化
26-03-03 - 一次数据库CPU使用100%异常处理及分析报告
一次数据库CPU使用100%异常处理及分析报告
26-03-03 - 一次expdp备份hang住问题分析
一次expdp备份hang住问题分析
26-03-03 - 利用Deepseek 割韭菜的套路有哪些?
利用Deepseek 割韭菜的套路有哪些?
26-03-03 - 一次dg搭建坏块处理
一次dg搭建坏块处理
26-03-03 - Oracle误truncate操作恢复(二)
Oracle误truncate操作恢复(二)
26-03-03 - 一次参数设置导致数据库故障分析报告
一次参数设置导致数据库故障分析报告
26-03-03 - 百度智能云携手智元机器人 开创具身智能机器人DIY新时代
百度智能云携手智元机器人 开创具身智能机器人DIY新时代
26-03-03
