Oracle
Label Security

使用 Oracle Label Security 和虚拟专用数据库保护敏感数据免受未经授权的访问

Oracle Label Security (OLS) 与数据库中的许多其他安全特性配合使用,可以满足细粒度数据访问需求。虚拟专用数据库 (VPD) 与 OLS 配合使用,可以保护列中的敏感数据。

 

Oracle Label Security 由两部分组成:用户许可标签和数据分类标签(行标签)。策略本身通过对比用户许可标签与数据分类标签来确定行级访问权限。然而在本示例中,OLS 策略不会应用于表,因此不会向受保护的表附加用于保存行标签的额外的列。但是,为了最初创建策略,我们不能忽略这个额外列的名称。由于该策略永远不会附加到表上,我们可以将默认的策略实施选项设置为“NO_CONTROL”,从而尽可能地减少真正生效的策略所产生的开销。

使用以下脚本也可以完成相同的操作:

Begin
     SA_SYSDBA.CREATE_POLICY
     policy_name => 'PROTECT_PII'
     column_name => 'OLS_COLUMN',
     default_options => 'NO_CONTROL');
END;
/

 

标签由三部分组成:必需的级别、可选的隔离区和组。在本示例中,级别将为“Confidential”和“Sensitive”,隔离区为“PII”;不使用组:

使用以下脚本也可以完成相同的操作:

BEGIN
     SA_COMPONENTS.CREATE_LEVEL (
     policy_name => 'PROTECT_PII',
     level_num => 1000,
     short_name => 'C',
     long_name => 'CONFIDENTIAL');
END;
/

BEGIN
     SA_COMPONENTS.CREATE_COMPARTMENT (
     policy_name => 'PROTECT_PII',
     comp_num => 100,
     short_name => 'PII',
     long_name => 'PERS_INFO');
END;
/

BEGIN
     SA_COMPONENTS.CREATE_LEVEL (
     policy_name => 'PROTECT_PII',
     level_num => 2000,
     short_name => 'S',
     long_name => 'SENSITIVE');
END;
/

 

只有用户“SKing”将获得等于或高于“S:PII”标签的用户标签,因此他将能够查看表中所有包含 PII 信息的列;而其他所有用户(例如“LDoran”)的标签都低于“S:PII”标签,因此“salary”列对于他们为空。在这个 Oracle 示例中,将一个 OLS 策略应用于非数据库用户。

使用以下脚本也可以完成相同的操作:

BEGIN
     SA_USER_ADMIN.SET_USER_LABELS (
     policy_name => 'PROTECT_PII',
     user_name => 'SKING',
     max_read_label => 'S:PII',
     max_write_label => 'S:PII',
     min_write_label => 'C',
     def_label => 'S:PII',
     row_label => 'S:PII');
END;
/

BEGIN
     SA_USER_ADMIN.SET_USER_LABELS (
     policy_name => 'PROTECT_PII',
     user_name => 'LDORAN',
     max_read_label => 'C',
     max_write_label => 'C',
     min_write_label => 'C',
     def_label => 'C',
     row_label => 'C');
END;
/

 

VPD 策略将执行以下操作:

从用户的当前标签获取数字标签标记
从“S:PII”标签获取数字标签标记
用户标签 ≥“S:PII”→ 允许访问敏感列中的所有行
用户标签 <“S:PII”→ 允许访问所有行,但包含敏感信息的 PII 列将显示为空白
在本示例中,VPD 策略将应用于 hr.EMPLOYEES 表:

BEGIN
     DBMS_RLS.ADD_POLICY(
     object_schema => 'HR',
     object_name => 'EMPLOYEES',
     policy_name => 'vpd_protect_pii',
     function_schema => 'LBACSYS',
     policy_function => 'f_protect_pii',
     statement_types => 'select',
     sec_relevant_cols => 'SALARY',
     sec_relevant_cols_opt => dbms_rls.ALL_ROWS,
     policy_type => dbms_rls.CONTEXT_SENSITIVE);
END;
/

这里下载完整的演示脚本。