当前位置: 代码网 > it编程>数据库>Oracle > Oracle 23c配置和使用数据脱敏的完整流程

Oracle 23c配置和使用数据脱敏的完整流程

2026年09月01日 Oracle 我要评论
在数据库安全领域,数据脱敏是保护敏感信息的重要手段。无论是开发测试环境的生产数据使用,还是外包人员的访问权限控制,又或是合规审计中对个人隐私信息的保护,动态数据脱敏都能在不改变底层存储的前提下,实现敏

在数据库安全领域,数据脱敏是保护敏感信息的重要手段。无论是开发测试环境的生产数据使用,还是外包人员的访问权限控制,又或是合规审计中对个人隐私信息的保护,动态数据脱敏都能在不改变底层存储的前提下,实现敏感信息的实时遮蔽。

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 19coracle 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配置和使用数据脱敏的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com