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。
三、常见问题排查
- 数据不可见
:检查用户标签权限和数据的标签是否匹配。
- 写入失败
:确认用户的max_write_label是否足够高。
- 策略未生效
:确认策略已正确应用且会话标签设置正确。
四、总结
通过Oracle Label Security,可高效实现基于标签的行级权限控制,确保数据仅对授权用户可见。实际应用中需结合业务需求设计标签结构,并通过严格测试验证策略正确性。