在数据库安全领域,数据脱敏是保护敏感信息的重要手段。无论是开发测试环境的生产数据使用,还是外包人员的访问权限控制,又或是合规审计中对个人隐私信息的保护,动态数据脱敏都能在不改变底层存储的前提下,实现敏感信息的实时遮蔽。
oracle database 23c对数据脱敏功能进行了重要增强,引入了正则表达式脱敏、json字段脱敏等新特性,使脱敏能力从固定格式扩展到任意复杂数据模式。同时,新增的dbms_sensitive_data包提供了不依赖企业版许可证的脱敏方案,进一步降低了使用门槛。本文将基于实际环境,系统演示在oracle 23c中配置和使用数据脱敏的完整流程。
一、数据脱敏的核心概念
1.1 什么是动态数据脱敏
oracle数据脱敏是advanced security选件的核心能力之一,用于在查询时动态隐藏敏感数据,如身份证号、银行卡号、手机号等,而无需修改底层存储。
动态脱敏的核心原理是:数据在返回给客户端前实时遮蔽,原始数据在数据库中保持完整。脱敏基于策略驱动,通过dbms_redact包定义脱敏规则,仅对无豁免权限的用户生效,dba或特权用户可看到明文。这种设计的优势在于零应用改造、不影响索引和统计信息,能够满足gdpr、ccpa及等保等合规要求。
1.2 脱敏类型详解
oracle data redaction支持五种脱敏类型:
全脱敏将列的所有内容替换为固定默认值。数字类型替换为0,字符类型替换为单个空格,日期类型替换为01-jan-01。默认值可通过dbms_redact.update_full_redaction_values过程自定义。
部分脱敏仅暴露部分字符,其余部分用掩码字符替换。例如将手机号13812345678显示为138****5678。23c及更高版本中,部分脱敏已支持正则表达式,可处理变长或复杂格式的数据。
随机脱敏每次查询返回随机生成的值,同一列在不同查询中显示不同内容。适用于需要展示随机数据但不暴露真实值的场景。
正则表达式脱敏是23c新增的能力,基于搜索替换模型实现脱敏,支持邮箱、身份证、信用卡号等任意正则匹配模式。
无脱敏用于测试策略语义而不影响实际输出。
1.3 23c的关键增强
oracle database 23c对数据脱敏功能进行了重要升级:
部分脱敏支持正则表达式是23c最重要的增强之一。旧版本只能按固定位置脱敏,无法处理变长或复杂格式数据。23c通过dbms_redact.regexp类型,支持基于正则表达式的灵活脱敏,可处理中国手机号、身份证、邮箱等多种格式。
json数据脱敏是另一项重要增强,23c首次支持对json文档中的字段进行脱敏,无需将json解析为关系表。通过json_path参数指定json路径,可对嵌套在json文档中的敏感字段进行脱敏。
表达式在视图中的脱敏支持,使包含脱敏列的表达式的视图查询不再报错。在19c中,create view v as select sum(salary) from employees后查询该视图会抛出ora-28094错误;23c中查询正常执行,且结果保持脱敏状态。
group by和order by对脱敏列的支持同样得到增强。23c中,select列表和group by子句可以引用脱敏列上的表达式,distinct和order by也能正确处理脱敏列,且不会泄露原始数据。
此外,一个对象只允许存在一个脱敏策略的限制在实践中值得注意。如果需要为同一张表的多个列分别配置不同的脱敏规则,可以在同一个策略中通过alter_policy添加多个列。
二、环境准备
2.1 环境要求
在oracle 23c中配置数据脱敏,需要满足以下条件:oracle database 23ai版本23.6或更高版本;拥有syskm系统管理权限或administer key management系统权限来管理tde配置;advanced security option许可证(dbms_redact属于该选件,是收费组件)。
oracle 23c新增的dbms_sensitive_data包不依赖advanced security option许可证,在特定场景下可作为替代方案。
2.2 准备测试用户和数据
以sysdba身份登录数据库,在pdb中创建测试用户和测试表:
-- 切换pdb
alter session set container=pdbprod1;
-- 创建测试用户
create user odr identified by odr;
grant dba to odr;
alter user odr default tablespace users quota unlimited on users;
-- 连接测试用户创建表
conn odr/odr@127.0.0.1:1521/pdbprod1
create table customers (
id number primary key,
name varchar2(40),
phone number(13,0),
id_card varchar2(18)
);
insert into customers values(1, '张明', 13812345678, '110101199001011234');
insert into customers values(2, '李芳', 13987654321, '310101198505152345');
insert into customers values(3, '王强', 13711223344, '440301199912313456');
commit;三、使用dbms_redact配置脱敏
3.1 全脱敏策略
以sysdba身份连接并创建全脱敏策略,对姓名字段实施完全脱敏:
conn / as sysdba
alter session set container=pdbprod1;
begin
dbms_redact.add_policy(
object_schema => 'odr',
object_name => 'customers',
column_name => 'name',
policy_name => 'redact_name_full',
function_type => dbms_redact.full,
expression => '1=1'
);
end;
/脱敏策略创建后立即生效。查询验证:
-- sys用户不受策略影响,看到明文 select id, name, phone from odr.customers; -- odr用户受策略影响,看到脱敏后数据 conn odr/odr@127.0.0.1:1521/pdbprod1 select id, name, phone from customers;
sys用户以及拥有dba权限的用户不受脱敏策略影响,仍能看到原始数据。这确保了运维人员在故障排查时能访问真实数据,但同时也意味着需要严格控制dba权限的授予。
3.2 部分脱敏策略
使用部分脱敏对手机号进行处理,仅显示前3位和后4位,中间用星号替换:
conn / as sysdba
alter session set container=pdbprod1;
begin
dbms_redact.add_policy(
object_schema => 'odr',
object_name => 'customers',
column_name => 'phone',
policy_name => 'redact_phone_partial',
function_type => dbms_redact.partial,
expression => '1=1',
function_parameters => '*,4,8'
);
end;
/参数说明:第一个参数*为掩码字符,第二个参数4表示起始位置(从第4位开始掩码),第三个参数8表示结束位置(掩码到第8位)。效果为138****5678。
3.3 正则表达式脱敏(23c新增)
23c新增的正则表达式脱敏能力,可以处理变长或复杂格式的数据。以下示例对中国身份证号进行脱敏,保留前6位和后4位,中间用8个星号替换:
conn / as sysdba
alter session set container=pdbprod1;
begin
dbms_redact.add_policy(
object_schema => 'odr',
object_name => 'customers',
column_name => 'id_card',
policy_name => 'redact_idcard_regexp',
function_type => dbms_redact.regexp,
expression => '1=1',
regexp_pattern => '(\d{6})(\d{8})(\d{4})',
regexp_replace_string => '\1********\3',
regexp_position => 1,
regexp_occurrence => 0
);
end;
/正则表达式脱敏的参数含义:regexp_pattern为匹配身份证号码的正则表达式;regexp_replace_string为替换模板,\1、\3分别引用第一个和第三个捕获组;regexp_position为搜索起始位置,默认1;regexp_occurrence为匹配次数,0表示替换所有匹配项。
3.4 删除策略与重建
oracle数据脱敏的限制之一是一个对象只允许存在一个脱敏策略。当需要修改策略时,需要先删除原有策略再创建新策略:
begin
dbms_redact.drop_policy(
object_schema => 'odr',
object_name => 'customers',
policy_name => 'redact_name_full'
);
end;
/drop_policy无论策略是启用还是禁用状态均可执行。删除表或视图时,关联的脱敏策略会自动删除,但最佳实践是先删除策略再删除表。
3.5 dml操作的安全性验证
脱敏后的展示数据不会影响dml操作。普通用户使用脱敏后的展示数据执行update操作,无法修改原始数据:
-- 普通用户尝试用脱敏后的手机号更新 update customers set phone = phone where id = 1; -- 无影响,原数据保持不变 -- 用脱敏后查询结果更新另一条记录 update customers set phone = (select phone from customers where id = 2) where id = 1; -- 权限不足,操作被拒绝
拥有dba权限的用户因不受脱敏策略影响,不会使用脱敏后的展示数据来更新已有数据。这一设计确保了脱敏机制不会因展示层的遮蔽而导致数据错误。
四、dbms_sensitive_data替代方案
4.1 为什么需要dbms_sensitive_data
dbms_redact是oracle advanced security option的一部分,需要额外付费许可证。对于未购买该选件的环境,23c新增的dbms_sensitive_data包提供了另一种脱敏路径。
dbms_sensitive_data支持列级策略绑定、上下文隔离和自治事务,不依赖企业版许可证。但需要注意:该包要求目标列必须有not null约束,否则策略注册时会静默失败,不返回任何报错。
4.2 创建脱敏函数
首先创建自定义脱敏函数:
create or replace function mask_phone (in_str in varchar2)
return varchar2
is
begin
if length(in_str) = 11 and regexp_like(in_str, '^1[3-9][0-9]{9}$') then
return substr(in_str, 1, 3) || '****' || substr(in_str, 8, 4);
else
return in_str;
end if;
end;
/4.3 注册列级脱敏策略
使用dbms_sensitive_data.add_column_policy注册脱敏策略:
begin
dbms_sensitive_data.add_column_policy(
object_schema => 'hr',
object_name => 'employees',
column_name => 'phone_number',
policy_name => 'mask_phone_policy',
function_schema => 'hr',
function_name => 'mask_phone',
context_condition => 'sys_context(''userenv'', ''client_identifier'') != ''dev_team'''
);
end;
/context_condition参数控制策略的生效范围:当client_identifier不等于dev_team时,脱敏策略生效;开发团队可以不受脱敏限制访问明文数据。
五、测试验证与对比
5.1 验证脱敏效果
使用不同用户查询验证脱敏策略的效果:
-- 普通用户查询,看到脱敏结果 conn odr/odr@127.0.0.1:1521/pdbprod1 select id, name, phone, id_card from customers; -- sys用户查询,看到原始数据 conn / as sysdba alter session set container=pdbprod1; select id, name, phone, id_card from odr.customers;
sys用户以及拥有dba权限的用户不受脱敏策略影响,始终看到明文数据。这一设计在方便运维的同时也提出了权限管理的要求:必须严格控制exempt redaction policy权限的授予,并记录所有权限变更操作至统一审计日志。
5.2 版本差异对比
| 功能特性 | oracle 19c | oracle 23c |
|---|---|---|
| 部分脱敏 | 仅固定位置 | 支持正则表达式 |
| json字段脱敏 | 不支持 | 支持json_path |
| 视图中表达式脱敏 | ora-28094错误 | 正常执行并脱敏 |
| group by表达式 | ora-00979错误 | 正常执行并脱敏 |
| dbms_sensitive_data | 不支持 | 支持(无需aso许可证) |
结语
oracle 23c的数据脱敏功能在灵活性和适用场景上实现了显著跃升。正则表达式脱敏让复杂格式数据的遮蔽变得可行,json字段脱敏将保护范围扩展到现代应用常用的半结构化数据,表达式在视图和group by中的支持解除了此前限制复杂查询的桎梏。
在实际配置中,需注意一个对象只允许存在一个脱敏策略的限制,以及dba用户不受策略影响的特性对权限管理提出的更高要求。对于未购买advanced security option的环境,dbms_sensitive_data提供了一条可行的替代路径。基于这些能力,oracle 23c的数据脱敏已从简单的查询遮蔽工具,演进为涵盖多数据类型、多应用场景的完整数据保护方案。
以上就是oracle 23c配置和使用数据脱敏的完整流程的详细内容,更多关于oracle 23c配置和使用数据脱敏的资料请关注代码网其它相关文章!
发表评论