数据库管理-第258期 23ai:Oracle Data Redaction(20241104)
作者:胖头鱼的鱼缸(尹海文) Oracle ACE Pro: Database(Oracle与MySQL) PostgreSQL ACE Partner 10年数据库行业经验,现主要从事数据库服务工作 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVP、年度墨力之星,ITPUB认证专家、专家百人团成员,数盟会长老会成员,OCM讲师,PolarDB开源社区技术顾问,HaloDB外聘技术顾问,OceanBase观察团成员,青学会MOP技术社区(青年数据库学习互助会)技术顾问 圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著 名社恐(社交恐怖分子) 公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。 除授权转载并标明出处外,均为“非法”抄袭
上周在整理Oracle DB 23.6新特性的时候,看到了一个不那么熟悉的特性,即本篇介绍的Oracle Data Redaction。本篇针对Oracle DB 23ai版本。
1 简介
Oracle Data Redaction,可以译作Oracle数据编校,能够隐藏查询返回的数据,而不会直接影响数据。这是通过在呈现结果之前对数据库查询的结果进行编校(有选择地删除或隐藏敏感或机密信息)来实现的。可以将数据编校策略应用于表、视图或物化视图。然后,将表上的策略应用于表中的特定列。 可以使用以下方法之一来编校列数据:
数据编校对最终用户是透明的,因为它保留了原始数据类型和(可选)格式。它对数据库是透明的,因为数据在缓冲区、缓存和存储中保持不变,只在SQL查询结果返回给调用者之前的最后一刻发生变化。使用编校策略访问表或视图的所有查询都会一致地执行编校。可以通过检查通过SYS_CONTEXT函数传递到数据库中的用户信息来指定哪些用户应该只看到经过编校的数据;您可以根据当前数据库的属性编校数据;您可以在给定的编校策略中实现多个逻辑条件。此外,数据编校的实现方式最大限度地降低了性能开销。这些特性使Oracle数据编校特别适合共享通用生产数据库的一系列应用程序、分析工具、报告工具和监控工具使用。 Oracle数据库在用户访问数据时(即在查询执行时)在运行时应用编校。该解决方案在生产系统中运行良好。在数据编校间,所有数据处理都正常执行,后端引用完整性约束也得到了保留。 数据编校可以根据需要限制对持卡人数据或个人身份信息的访问,从而帮助您遵守行业、政府和组织的要求。
2 应用场景与有点
与Data Masking不同,数据屏蔽通过用虚构但真实的数据永 久替换敏感数据来屏蔽敏感数据,数据编校在从数据库接收数据时对其进行编校,使数据库中的数据保持不变。数据编校使能够使用多种不同的编校样式轻松伪装数据。 Oracle数据编校特别适用于呼叫中心应用程序、即席报告和分析工作负载,在这些工作负载中,数据仅以只读格式提供给最终用户。但是,在将Oracle数据编校与执行数据库更新的应用程序一起使用时要小心,因为编校后的数据可以写回此数据库。 当您使用Oracle数据编校来保护数据时,它提供了几个好处:
3 多租户环境
Oracle数据编校策略在PDB级别创建和应用,并且仅适用于该PDB中的对象。无法在CDB根目录中创建编校策略。 您无法为多租户容器数据库(CDB)创建数据重做策略;您只能在PDB级别创建数据重设策略。这是因为为其创建数据编校策略的对象通常位于PDB中。
4 特性与能力
使用DBMS_REDACT包创建并启用数据编校策略,指定编校策略的SCHEMA、对象(Object)和列(Column)。
下面是一个在HR.EMPLOYEES表中SALARY列的数据编校策略的示例:
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'hr', object_name => 'employees', column_name => 'salary', policy_name => 'hr_emp_redact_comp_pol', function_type => DBMS_REDACT.FULL, expression => '1=1');END;
在该示例中,使用DBMS_REDACT包中的ADD_POLICY过程来定义一个名为hr_emp_redact_comp_pol的Oracle数据编校策略。函数类型DBMS_REDACT.FULL指定对薪资列中的检索值时执行所有的数据编校,这意味着默认情况下,数字数据类型在输出文本中替换为零(0)。表达式参数设置策略,以便在计算结果为TRUE (1=1)时执行编校。
4.1 全数据编校
全数据编校对表或视图的指定列的全部内容进行编校。 默认情况下,输出显示如下:
在执行DBMS_REDACT.ADD_POLICY过程时通过设置function_type来指定全编校:
function_type => DBMS_REDACT.FULL
全编校是默认设置,只要数据编校策略指定了列但省略了function_type参数设置,就会使用全编校。 可以使用DBMS_REDACT.UPDATE_FULL_REDACION_VALUES过程,将完整的编校输出更改为不同的值。您可以通过查询REDACTION_VALUES_FOR_TYPE_FULL数据字典视图来查找当前值。
4.2 部分编校
在部分数据编校中,可以编校显示输出的部分内容。 可以设置实际数据中开始编校的位置、从该位置开始编校的字符数以及要使用的编校字符。(实际数据是受保护的表或视图中的数据。实际数据的一个示例可能是数字123456789,此数字的编校数据版本可能是999996789。)这种类型的编校对于希望查看数据的人明显看到它以某种方式被编校的情况非常有用。通常,您会对信用卡号码或身份证号码使用这种类型的编校。 请注意,部分数据编校要求您的数据宽度保持固定。如果要对包含可变长度字符串值的列进行编校,则必须使用正则表达式编校。 要指定部分编校,必须设置DBMS_REDACT.ADD_POLICY或DBMS_REDACT.ALTER_POLICY过程function_type参数到DBMS_REDACT.PARTIAL,并使用function_parameters参数定义部分编校行为。 部分数据编校的显示输出如下:
4.3 正则表达式编校
正则表达式根据模式搜索编校列数据值中的特定数据。您可以使用正则表达式来编校不同长度的字符串列。 例如,您可以编校电子邮件地址的用户名,以便只显示域(例如,替换电子邮件地址中的hprestonhpreston@example.com使用[redacted],使其显示为[redacte]@example.com)。要执行编校,请设置DBMS_REDACT.ADD_POLICY或DBMS_REDACT.ALTER_POLICY过程function_type参数到DBMS_REDACT.REGEXP或DBMS_REDACT.REGEXP_WIDTH,然后使用以下参数构建正则表达式:
regexp_pattern => '(.+)@(.+\.[A-Za-z]{2,4})'
此设置查找以下形式的模式:
one_or_more_characters@one_or_more_characters.2-4_characters_in_range_A-Z_or_a-z
regexp_replace_string => '[redacted]@\2'
regexp_position => DBMS_REDACT.RE_BEGINNING
如果未指定,则此值为默认值。
regexp_occurrence => DBMS_REDACT.RE_ALL
如果未指定,则此值为默认值。
regexp_match_parameter => 'i'
除了默认参数外,您还可以使用一组预定义的格式,使您能够对电话号码、电子邮件地址和信用卡号码使用常用的正则表达式。
4.4 随机编校
在随机数据编校中,通过将其替换为随机值来编校整个值。 每次应用程序用户运行查询时,查询结果集中显示的编辑值都会随机更改。 这种类型的编校在您不希望数据被明显编校的情况下很有用。它尤其适用于数字和日期时间数据类型,在这些数据类型中很难区分随机数据和真实数据。 随机值的显示输出会根据编校列的数据类型而变化,如下所示:
function_type => DBMS_REDACT.RANDOM
4.5 空值编校
您可以创建Oracle数据编校策略,通过在查询结果中仅显示空值来编校列数据。 此功能使您能够使用DBMS_REDACT.NULLIFY函数用于隐藏表或视图列中的所有敏感数据,并将其替换为空值。您可以使用DBMS_REDACT的function_type参数设置此函数DBMS_REDACT.ADD_POLICY或DBMS_REDACT.ALTER_POLICY程序。
function_type => DBMS_REDACT.NULLIFY
4.6 无编校
可以创建不执行编校的数据编校策略。这使您能够在测试期间在应用程序中包含编校策略,然后在将应用程序移至生产环境时将这些策略应用于数据。 这对于您有一个经过编校的基表,但希望特定应用程序用户拥有一个始终显示实际数据的视图的情况非常有用。默认情况下,在已编校表上创建的视图将使用与基表相同的策略进行编校。但是,您可以为视图定义单独的编校策略。您可以创建已编校表的新视图,然后为此视图定义数据编校策略。当应用程序查询视图时,将应用在视图上定义的策略。该策略仍然存在于基表上,但只要DBMS_REDACT.NONE function_type设置用于在视图上创建策略,当应用程序使用视图进行查询时,就不会执行任何编校。
4.7 不同数据类型上不同类型校验的对比
这里可以通过以下网址中的列表进行查看:
https://docs.oracle.com/en/database/oracle/oracle-database/23/dbred/comparison-full_-partial_-and-random-redaction-based-data-types.html
总结
本期简单介绍了下Oracle数据编校,后面将在Oracle 23ai Free版本中进行实际测试。 老规矩,知道写了些啥。
