What You See Is What You Get Element

提示与技巧:Oracle Database 12c 中的数据编辑

作者:Oracle Ace Alex Zaballa

 

简介

Oracle Data Redaction 是 Oracle Database 12c 引入的一个新特性。这个新特性是 Advanced Security 选件的一部分,可以实时保护显示给用户的数据,无需更改应用。

Oracle Database 12c 在执行查询时应用保护。存储的数据保持不变,要显示的数据则在离开数据库前动态转换。

不要将此特性与自版本 11g 起提供的 Oracle Data Masking 混淆。采用 Oracle Data Masking 时,将以屏蔽形式处理数据,更新后的数据存储在新数据块中。因此,Data Masking 更适合非生产环境。

下面是已有的其他一些有助于提高数据安全性的特性:

  • 虚拟专用数据库 (VPD) — 通过向针对数据库执行的 SQL 语句动态添加谓词,控制行级和列级访问。
  • Oracle Label Security — 允许向表记录添加用户定义的值。与 VPD 相结合,可以更精细地控制访问用户和访问内容。
  • Database Vault — 数据编辑不能防止特权用户(如 DBA)访问受保护的数据。为解决此问题,您可以利用 Database Vault。

从许可角度来说,Oracle Data Masking 仅适用于企业版数据库,且需要 Advanced Security 许可。

工作原理


我们可以创建编辑策略,指定必须满足哪些条件后才能对数据进行编辑并将其返回给用户。定义此类策略期间,DBA 可以指定必须对哪些列应用何种类型的保护。

用于创建保护规则的软件包名为 DBMS_REDACT。它包括五个用于管理规则的过程,以及一个用于更改完全编辑策略默认值的过程。

  • DBMS_REDACT.ALTER_POLICY — 允许更改现有策略。
  • DBMS_REDACT.DISABLE_POLICY — 禁用现有策略。
  • DBMS_REDACT.DROP_POLICY — 删除现有策略。
  • DBMS_REDACT.ENABLE_POLICY — 启用现有策略。
  • DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES — 更改完全编辑的默认返回值。必须重启数据库才能生效。

data-red0



您可以使用以下任何一种方法在列级保护数据:

  • 完全编辑 — 保护列的所有内容,返回值的类型取决于列的数据类型。对于数值列,返回值 0。对于字符类型的列,返回空格。此设置可在数据库级别更改。
  • 部分编辑 — 只更改部分信息。例如,信用卡号的前几个数字被星号替代。
  • 正则表达式 — 可以使用正则表达式搜索必须保护的数据模式。
  • 随机编辑 — 返回值随机;每次执行查询时,显示的数据将不同。
  • 无编辑 — 允许测试编辑策略的内部工作情况,对当前运行的查询的结果没有任何影响。这广泛用于编辑策略的测试阶段,最终将帮助这些策略符合生产环境的要求。

data-red9

 


data-red1


数据编辑可以帮助符合安全法规,如支付卡行业数据安全标准 (PCI DSS) 和 Sarbanes-Oxley。

它可以用于以下列数据类型:NUMBER、BINARY_FLOAT、BINARY_DOUBLE、CHAR、VARCHAR2、NCHAR、NVARCHAR2、DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE、BLOB、CLOB 和 NCLOB。

字典视图:


以下新数据库视图可用于获取有关现有编辑策略的信息:

  • REDACTION_POLICIES
  • REDACTION_COLUMNS
  • REDACTION_VALUES_FOR_TYPE_FULL


数据编辑和 Data Pump



DATAPUMP_EXP_FULL_DATABASE 角色包括 EXEMPT REDACTION POLICY 系统权限。这样,无需编辑即可使用 Data Pump 导出表。

如果试图导出表的用户未被授予 EXEMPT REDACTION POLICY 系统权限,将显示以下错误:

ORA-28081: Insufficient privileges - the command references a redacted object. 

要导出与 Oracle 数据编辑策略相关的元数据,可以使用 expdp 实用程序的以下参数:

CONTENT=METADATA_ONLY

INCLUDE=RADM_FPTM,RADM_POLICY


数据编辑和 Create tables as select (CTAS):


为了从受活动编辑策略保护的表执行 CTAS,用户必须拥有查看源表上实际数据的权限。

EM 12c 示例中使用的 PDB:


data-red2


访问 Oracle 数据编辑:


data-rad8


屏幕管理策略:


data-red3


为除 SUPERVISOR 用户外的所有用户创建一个策略,编辑来自 EMPLOYEES 表的 salary 列的数据:


data-red6


data-red4


验证策略是否按期望方式工作:


[oracle@dibutu ~]$ sqlplus funcionario/senha@localhost:1521/testpdb
SQL*Plus: Release 12.1.0.1.0 Production on Wed Apr 2 10:22:46 2014
Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> select EMPLOYEE_ID, FIRST_NAME, SALARY from hr.employees WHERE ROWNUM < 5;

EMPLOYEE_ID FIRST_NAME               SALARY
----------- -------------------- ----------
        100 Steven                        0
        101 Neena                         0
        102 Lex                           0
        103 Alexander                     0 


再次查询表,此次以 SUPERVISOR 用户身份连接:


[oracle@dibutu ~]$ sqlplus supervisor/senha@localhost:1521/testpdb
SQL*Plus: Release 12.1.0.1.0 Production on Wed Apr 2 10:26:04 2014
Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> select EMPLOYEE_ID, FIRST_NAME, SALARY from hr.employees WHERE ROWNUM < 5;

EMPLOYEE_ID FIRST_NAME               SALARY
----------- -------------------- ----------
        100 Steven                    24000
        101 Neena                     17000
        102 Lex                       17000
        103 Alexander                  9000 


使用 SQL * Plus 创建相同的策略:

SQL> 

BEGIN

 DBMS_REDACT.ADD_POLICY  (OBJECT_SCHEMA => 'HR',  object_name => 'EMPLOYEES',  policy_name =>
'POLITICA_TESTE',  expression => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') != ''SUPERVISOR''');
  
 DBMS_REDACT.ALTER_POLICY  (OBJECT_SCHEMA => 'HR',  object_name => 'EMPLOYEES',  policy_name => 
'POLITICA_TESTE',  action => DBMS_REDACT.ADD_COLUMN,  column_name => '"SALARY"',  
 function_type => DBMS_REDACT.FULL );


END;
 /

PL/SQL procedure successfully completed.


使用 SQLDeveloper 创建相同的策略:


 

data-rad5



data-red7

 

关于作者

Alex Zaballa 是 Oracle Ace 和 Oraworld 成员。Alex 目前是 Luanda 的高级 DBA,并为安哥拉财政部提供 DBA 服务。他有逾 14 年的 Oracle 技术经验,其职业生涯始于 Oracle 开发人员,参加了 ERP 软件从定义到部署的开发过程。2007 年,他移居安哥拉,获得一份高级 Oracle DBA 的工作机会,为 Jupiter 提供服务。作为拥有 OCM(Oracle 认证大师)凭证的全球资深高级专业人员中的一员,他擅长高可扩展性、高可用性和性能调优的设计和实施。他是一位备受尊敬的 OraWorld 成员,该小组常年与 Oracle 社区合作撰写文章、主办会议、召集网络研讨会以及开设 Oracle 数据库课程。OraWorld 成员是“Oracle 认证大师”和“Oracle ACE”。您可以通过以下链接关注该小组:https://www.facebook.com/oraworldteam https://twitter.com/oraworld_team www.oraworld-team.com。
oraworldlogo