Oracle如何强制访问控制

wen 网络安全 1

Oracle数据库强制访问控制(MAC):原理、配置与实战指南

目录导读

  1. 什么是强制访问控制(MAC)?
  2. Oracle MAC与传统DAC的区别
  3. 核心组件:Label Security与OLS
  4. 实施步骤详解
  5. 策略设计最佳实践
  6. 常见问题与问答(Q&A)
  7. 总结与性能考量

什么是强制访问控制(MAC)?

在Oracle数据库安全体系中,强制访问控制(Mandatory Access Control, MAC) 是一种基于标签(Label)的访问控制机制,它不同于传统的自主访问控制(DAC),MAC不允许用户随意修改对象权限,而是由系统根据安全标签自动判定访问是否合法。

Oracle如何强制访问控制

核心思想:数据分类 + 用户分级,两者通过“标签”匹配来决定访问结果,数据被标记为“机密”,用户必须拥有“机密”及以上等级才能读取。

Oracle实现MAC的官方组件是 Oracle Label Security(OLS),它是Oracle数据库企业版的可选安全组件,无需依赖操作系统(如SElinux),完全在数据库层实现。

搜索引擎优化提示:关键词“Oracle强制访问控制”、“Oracle Label Security”、“OLS配置”在中文搜索中具有较高权重,建议在标题、小标题和正文前100字内自然出现。


Oracle MAC与传统DAC的区别

对比维度 自主访问控制(DAC) 强制访问控制(MAC)
管理方式 对象所有者授权 系统管理员定义策略
用户弹性 可传递/修改权限 不可绕过标签规则
安全层级 易产生权限蔓延 强制符合安全等级
典型实施 标准GRANT/REVOKE Oracle Label Security

关键点:DAC依赖信任用户(用户A可以GRANT权限给用户B),而MAC基于不可变标签——即便DBA也不能直接读取高于其标签的数据,这让MAC特别适合军队、政府、金融等需要严格数据分级的场景。


核心组件:Label Security与OLS

Oracle Label Security(OLS)包含以下核心概念:

  • 标签(Label):由三部分组成:等级(Level)分类(Compartment)分组(Group)TOP SECRET / FINANCE / PROJECT_A
  • 策略(Policy):标签定义和访问规则的集合。
  • 用户标签:用户登录后自动附加的标签范围(如:用户只能看到 C(机密) 及以下数据)。
  • 数据标签:存储在行级别的标签列(或通过虚拟列)。

OLS安装前置条件

  • Oracle数据库企业版(Standard Edition不支持)
  • 启用 Oracle Database Vault(非必须但推荐)
  • 执行 catols.sql 脚本安装(位于 $ORACLE_HOME/rdbms/admin/

实施步骤详解

步骤1:启用并配置OLS

-- 以SYS用户运行
@?/rdbms/admin/catols.sql

步骤2:创建安全策略

BEGIN
  SA_SYSDBA.CREATE_POLICY (
    policy_name => 'BIZ_DATA_POLICY',
    column_name => 'LABEL_COL'  -- 标签列名(支持行级或虚拟列)
  );
END;
/

步骤3:定义标签组件

-- 创建等级(Level)
BEGIN
  SA_COMPONENTS.CREATE_LEVEL('BIZ_DATA_POLICY', 10, 'PUBLIC', 'Public');
  SA_COMPONENTS.CREATE_LEVEL('BIZ_DATA_POLICY', 20, 'INTERNAL', 'Internal');
  SA_COMPONENTS.CREATE_LEVEL('BIZ_DATA_POLICY', 30, 'CONFIDENTIAL', 'Confidential');
  SA_COMPONENTS.CREATE_LEVEL('BIZ_DATA_POLICY', 40, 'TOP_SECRET', 'Top Secret');
END;
/
-- 创建分类(Compartment)
BEGIN
  SA_COMPONENTS.CREATE_COMPARTMENT('BIZ_DATA_POLICY', 100, 'FIN', 'Finance');
  SA_COMPONENTS.CREATE_COMPARTMENT('BIZ_DATA_POLICY', 200, 'HR', 'Human Resources');
END;
/

步骤4:创建标签与用户授权

-- 创建标签数值
BEGIN
  SA_LABEL_ADMIN.CREATE_LABEL('BIZ_DATA_POLICY', 'TS_FIN', 'TOP_SECRET:FIN');
  SA_LABEL_ADMIN.CREATE_LABEL('BIZ_DATA_POLICY', 'C_HR', 'CONFIDENTIAL:HR');
END;
/
-- 为用户分配标签范围
BEGIN
  SA_USER_ADMIN.SET_USER_LABELS (
    policy_name => 'BIZ_DATA_POLICY',
    user_name   => 'JOHN',
    max_read_label => 'TS_FIN',    -- 最高可读标签
    max_write_label => 'C_HR',     -- 最高可写标签(防数据降级)
    min_write_label => 'PUBLIC'    -- 最低可写标签
  );
END;
/

步骤5:将策略应用到表

-- 给表打标签(行级)
BEGIN
  SA_POLICY_ADMIN.APPLY_TABLE_POLICY (
    policy_name => 'BIZ_DATA_POLICY',
    schema_name => 'HR',
    table_name  => 'EMPLOYEES',
    table_options => 'LABEL_DEFAULT, READ_CONTROL, WRITE_CONTROL'
  );
END;
/

EMPLOYEES 表插入数据时,必须自动或手动指定标签;查询时,用户只能看到标签不高于其 max_read_label 的行。


策略设计最佳实践

  • 最小权限原则:标签等级不宜过多,3-5级(公开、内部、机密、绝密)通常足够。
  • 避免降级写入:通过 max_write_labelmin_write_label 限制用户写入数据的安全等级,防止机密数据被写入低等级标签。
  • 审计与日志:开启OLS审计(AUDIT POLICY)追踪标签越权尝试。
  • 性能优化:标签列建议使用数字类型(如INT)而非字符串,并建立索引。

常见问题与问答(Q&A)

Q1:MAC与行级安全(RLS/VPD)有何异同?

A:VPD(虚拟私有数据库)基于函数动态生成访问谓词,属于数据库层面的“策略化DAC”;而OLS是“标签化MAC”,标签直接嵌入数据行且不可由用户绕过,OLS通常配置更简单,而VPD更灵活但需手动编写策略函数。

Q2:用户能绕过OLS访问更高标签的数据吗?

A:不能,OLS在数据库内核层面强制实施,即使DBA用户(如SYS)也无法直接读取高于其标签的数据——除非DBA显式拥有类似于“绕过安全策略”的权限(需谨慎授予)。

Q3:OLS是否影响性能?

A:在插入/更新时,OLS会检查行级标签的合法性,会产生微弱性能开销,设计合理的标签索引和过滤条件可将影响降至5%以内,建议在高写入场景中为标签列单独建立索引。

Q4:能否在数据迁移过程中保留标签?

A:可以,使用Oracle Data Pump时需指定 TRANSFORM=SEGMENT_ATTRIBUTES:N 并转移标签列;直接使用INSERT ... SELECT会保留标签值,但需确保目标会话标签范围不被违反。


总结与性能考量

Oracle强制访问控制通过OLS将安全标签直接嵌入数据行和用户会话,提供了不可绕过的数据隔离机制,它比传统DAC更严格,适合需要遵守等保三级、PCI DSS、GDPR(数据分级部分)等合规场景。

配置快速总结

  1. 安装OLS(catols.sql
  2. 创建策略→等级→分类→标签
  3. 将策略应用于表
  4. 为用户授权标签范围

性能提醒:在OLTP高并发场景下,建议将标签列类型设为 NUMBER 并配合位图索引;在OLAP场景中,考虑将标签用于分区键,可提升按安全等级查询的效率。


延伸阅读建议:结合Oracle Database Vault实现“多因子访问控制”;或使用Oracle Audit Vault监控标签违规事件,对于云上(如OCI)环境,Oracle自治数据库内核已集成标签安全特性。

抱歉,评论功能暂时关闭!