Skip to content

KingBaseES 数据脱敏

数据脱敏概述

数据脱敏定义

数据脱敏是指通过技术手段对敏感数据进行变形处理,在保留数据可用性的同时,防止敏感信息泄露。KingBaseES 支持多种数据脱敏方式,满足不同场景的需求。

数据脱敏的重要性

  • 保护敏感数据:防止敏感信息在非生产环境中泄露
  • 满足合规要求:符合GDPR、等保2.0等法规要求
  • 支持开发测试:提供安全的测试数据,不影响测试效果
  • 降低数据泄露风险:减少敏感数据的暴露面

数据脱敏类型

脱敏类型应用场景特点
动态脱敏生产环境查询、实时数据分析查询时实时脱敏,不改变原始数据
静态脱敏测试环境、开发环境、数据分析创建脱敏副本,原始数据不变
部分脱敏部分敏感字段脱敏只脱敏敏感字段,保留其他字段完整
全量脱敏完全脱敏需求所有字段都进行脱敏处理

动态数据脱敏

动态脱敏概述

动态数据脱敏(Dynamic Data Masking,DDM)是指在查询数据时,实时对结果进行脱敏处理,原始数据保持不变。这种方式适用于生产环境中对敏感数据的访问控制。

动态脱敏函数

KingBaseES 提供了多种内置的动态脱敏函数:

部分掩码函数

sql
-- 部分掩码:保留前3位和后4位,中间用*替换
sys_mask_partial(original_string, prefix_length, suffix_length, mask_character)

-- 示例:掩码手机号码
SELECT sys_mask_partial('13800138000', 3, 4, '*') AS masked_phone;
-- 结果:138****8000

-- 示例:掩码身份证号
SELECT sys_mask_partial('110101199001011234', 6, 4, '*') AS masked_id_card;
-- 结果:110101********1234

全量掩码函数

sql
-- 全量掩码:将所有字符替换为指定字符
sys_mask_full(original_string, mask_character)

-- 示例:全量掩码密码
SELECT sys_mask_full('password123', '*') AS masked_password;
-- 结果:***********

哈希掩码函数

sql
-- 哈希掩码:将原始数据转换为哈希值
sys_mask_hash(original_string)

-- 示例:哈希掩码敏感数据
SELECT sys_mask_hash('sensitive_data') AS masked_data;
-- 结果:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

随机替换函数

sql
-- 随机替换:随机替换原始数据中的字符
sys_mask_random(original_string)

-- 示例:随机替换姓名
SELECT sys_mask_random('张三') AS masked_name;
-- 结果:(随机生成,例如:李四)

自定义掩码函数

sql
-- 创建自定义掩码函数
CREATE OR REPLACE FUNCTION custom_mask_email(email VARCHAR) 
RETURNS VARCHAR AS $$
BEGIN
    RETURN regexp_replace(email, '^(\w+)@', '***@');
END;
$$ LANGUAGE plpgsql;

-- 使用自定义掩码函数
SELECT custom_mask_email('user@example.com') AS masked_email;
-- 结果:***@example.com

动态脱敏策略配置

创建脱敏策略

sql
-- 创建动态脱敏策略
CREATE MASKING POLICY masking_policy_name
    COLUMNS (
        table_name.column1 WITH sys_mask_partial(3, 4, '*'),
        table_name.column2 WITH sys_mask_full('*')
    )
    FILTERS (username IN ('dev_user', 'test_user'));

-- 示例:创建用户表脱敏策略
CREATE MASKING POLICY user_masking_policy
    COLUMNS (
        user_info.phone WITH sys_mask_partial(3, 4, '*'),
        user_info.id_card WITH sys_mask_partial(6, 4, '*'),
        user_info.email WITH sys_mask_partial(2, 0, '*')
    )
    FILTERS (username NOT IN ('admin', 'security_audit'));

启用/禁用脱敏策略

sql
-- 启用脱敏策略
ENABLE MASKING POLICY user_masking_policy;

-- 禁用脱敏策略
DISABLE MASKING POLICY user_masking_policy;

-- 查看脱敏策略状态
SELECT policy_name, status FROM sys_masking_policies;

测试动态脱敏

sql
-- 使用不同用户查询,验证脱敏效果
-- 以admin用户登录(不受脱敏策略限制)
SELECT id, name, phone, id_card, email FROM user_info LIMIT 1;
-- 结果:1 | 张三 | 13800138000 | 110101199001011234 | zhangsan@example.com

-- 以dev_user用户登录(受脱敏策略限制)
SELECT id, name, phone, id_card, email FROM user_info LIMIT 1;
-- 结果:1 | 张三 | 138****8000 | 110101********1234 | zh***@example.com

静态数据脱敏

静态脱敏概述

静态数据脱敏(Static Data Masking,SDM)是指创建原始数据的脱敏副本,适用于测试环境、开发环境和数据分析场景。

静态脱敏方法

使用脱敏函数创建脱敏表

sql
-- 创建脱敏表
CREATE TABLE user_info_test AS
SELECT 
    id,
    name,
    sys_mask_partial(phone, 3, 4, '*') AS phone,
    sys_mask_partial(id_card, 6, 4, '*') AS id_card,
    sys_mask_partial(email, 2, 0, '*') AS email,
    sys_mask_full(password, '*') AS password,
    create_time,
    update_time
FROM user_info;

使用正则表达式脱敏

sql
-- 使用正则表达式进行静态脱敏
CREATE TABLE financial_data_test AS
SELECT 
    id,
    account_id,
    regexp_replace(card_number, '^(\d{4})\d{8}(\d{4})$', '\1********\2') AS card_number,
    regexp_replace(transaction_amount, '(\d+\.\d{2})', '***.**') AS transaction_amount,
    transaction_time,
    transaction_type
FROM financial_data;

使用存储过程批量脱敏

sql
-- 创建脱敏存储过程
CREATE OR REPLACE PROCEDURE batch_masking()
LANGUAGE plpgsql
AS $$
BEGIN
    -- 创建用户表脱敏副本
    CREATE TABLE user_info_dev AS
    SELECT 
        id,
        name,
        sys_mask_partial(phone, 3, 4, '*') AS phone,
        sys_mask_partial(id_card, 6, 4, '*') AS id_card,
        sys_mask_partial(email, 2, 0, '*') AS email
    FROM user_info;
    
    -- 创建订单表脱敏副本
    CREATE TABLE order_info_dev AS
    SELECT 
        order_id,
        sys_mask_random(user_id) AS user_id,
        order_amount,
        order_time,
        order_status
    FROM order_info;
    
    -- 创建产品表脱敏副本
    CREATE TABLE product_info_dev AS
    SELECT 
        product_id,
        product_name,
        product_category,
        sys_mask_random(price) AS price
    FROM product_info;
    
    RAISE NOTICE '批量脱敏完成';
END;
$$;

-- 执行批量脱敏
CALL batch_masking();

静态脱敏最佳实践

  1. 确定脱敏范围:根据业务需求确定需要脱敏的表和字段
  2. 选择合适的脱敏算法:不同字段使用不同的脱敏算法
  3. 保持数据关系:确保脱敏后的数据关系保持一致
  4. 验证脱敏效果:验证脱敏后的数据可用性和安全性
  5. 定期更新脱敏数据:根据生产数据变化定期更新脱敏数据

脱敏策略设计

脱敏策略设计原则

  1. 最小化原则:只脱敏必要的敏感字段
  2. 业务可用性原则:脱敏后的数据仍能满足业务需求
  3. 一致性原则:相同类型的数据使用相同的脱敏规则
  4. 不可逆转原则:脱敏后的数据无法还原为原始数据
  5. 可审计原则:脱敏操作可审计,可追溯

常见字段脱敏策略

字段类型脱敏策略示例
姓名保留姓氏,名字用*替换张*
手机号码保留前3位和后4位,中间用*替换138****8000
身份证号保留前6位和后4位,中间用*替换110101********1234
邮箱保留前2位和域名,中间用*替换zh***@example.com
银行卡号保留前4位和后4位,中间用*替换6222********8888
密码全量掩码********
地址保留省市,详细地址用*替换北京市朝阳区***
金额保留整数部分,小数部分用*替换1234.***

数据脱敏的应用场景

测试环境

在测试环境中使用脱敏数据,避免敏感信息泄露:

sql
-- 创建测试环境脱敏数据
CREATE TABLE test_user AS
SELECT 
    id,
    sys_mask_random(name) AS name,
    sys_mask_partial(phone, 3, 4, '*') AS phone,
    sys_mask_partial(id_card, 6, 4, '*') AS id_card,
    sys_mask_partial(email, 2, 0, '*') AS email
FROM user_info;

开发环境

为开发人员提供安全的开发数据:

sql
-- 创建开发环境脱敏数据
CREATE TABLE dev_user AS
SELECT 
    id,
    name,
    sys_mask_partial(phone, 3, 4, '*') AS phone,
    sys_mask_partial(id_card, 6, 4, '*') AS id_card,
    sys_mask_full(password, '*') AS password
FROM user_info;

数据分析

在数据分析场景中使用脱敏数据,保护敏感信息:

sql
-- 创建数据分析脱敏视图
CREATE VIEW analysis_user AS
SELECT 
    id,
    name,
    sys_mask_partial(phone, 3, 0, '*') AS phone_prefix,
    substring(id_card, 7, 4) AS birth_year,
    substring(id_card, 11, 2) AS birth_month,
    substring(id_card, 13, 2) AS birth_day
FROM user_info;

第三方数据共享

与第三方共享数据时,进行脱敏处理:

sql
-- 创建第三方共享脱敏表
CREATE TABLE third_party_user AS
SELECT 
    id,
    sys_mask_random(name) AS name,
    sys_mask_partial(phone, 3, 4, '*') AS phone,
    sys_mask_partial(email, 2, 0, '*') AS email,
    gender,
    age
FROM user_info;

版本差异

特性V8 R6V8 R7
动态脱敏函数基础支持丰富的内置脱敏函数
动态脱敏策略不支持支持创建和管理脱敏策略
静态脱敏手动实现内置静态脱敏工具
脱敏函数数量5个10+个
正则表达式支持基础支持增强支持
自定义脱敏函数支持更好的支持
脱敏策略过滤不支持支持基于用户、角色的过滤
脱敏性能一般优化,性能更好

最佳实践

动态脱敏最佳实践

  1. 合理设计脱敏策略:根据用户角色和权限设计不同的脱敏策略
  2. 避免过度脱敏:只对必要的字段进行脱敏,保证数据可用性
  3. 定期审查脱敏策略:根据业务变化定期审查和更新脱敏策略
  4. 监控脱敏性能:监控脱敏操作对数据库性能的影响
  5. 结合访问控制:将脱敏策略与访问控制结合使用,提供多层保护

静态脱敏最佳实践

  1. 自动化脱敏流程:建立自动化的静态脱敏流程,提高效率
  2. 保持数据一致性:确保脱敏后的数据关系保持一致
  3. 验证脱敏效果:验证脱敏后的数据是否满足业务需求和安全要求
  4. 保护脱敏副本:对脱敏副本也要进行适当的访问控制
  5. 定期更新脱敏数据:根据生产数据变化定期更新脱敏数据

脱敏策略管理

  1. 文档化脱敏策略:详细记录脱敏策略的设计和实现
  2. 定期审计脱敏策略:定期审计脱敏策略的有效性和合规性
  3. 培训相关人员:培训开发人员、测试人员和DBA了解脱敏策略和使用方法
  4. 建立脱敏审批流程:建立脱敏操作的审批流程,确保脱敏操作的安全性

常见问题(FAQ)

Q: 动态脱敏会影响数据库性能吗?

A: 动态脱敏会带来一定的性能开销,主要取决于脱敏字段的数量和脱敏函数的复杂度。建议只对必要的字段进行脱敏,并选择合适的脱敏函数。KingBaseES V8 R7 对脱敏性能进行了优化,性能开销比 V8 R6 更低。

Q: 动态脱敏和静态脱敏有什么区别?

A: 动态脱敏是在查询时实时脱敏,不改变原始数据,适用于生产环境;静态脱敏是创建脱敏副本,原始数据不变,适用于测试、开发和数据分析环境。

Q: 如何选择合适的脱敏算法?

A: 选择脱敏算法时,需要考虑以下因素:

  • 脱敏字段的类型和敏感度
  • 应用场景(生产环境还是测试环境)
  • 数据可用性要求
  • 合规要求

Q: 脱敏后的数据可以还原吗?

A: 设计良好的脱敏算法应该是不可逆的,脱敏后的数据无法还原为原始数据。KingBaseES 提供的内置脱敏函数都经过安全设计,确保脱敏后的数据无法还原。

Q: 如何验证脱敏效果?

A: 可以通过以下方式验证脱敏效果:

  • 手动检查脱敏后的数据
  • 使用自动化工具进行脱敏效果验证
  • 进行渗透测试,验证脱敏数据的安全性
  • 邀请第三方进行安全评估

Q: 如何管理脱敏策略?

A: KingBaseES V8 R7 提供了脱敏策略管理功能,可以通过SQL语句创建、启用、禁用和删除脱敏策略。建议建立脱敏策略的文档化管理,定期审查和更新脱敏策略。

Q: 动态脱敏可以应用于哪些数据库对象?

A: 动态脱敏可以应用于表、视图和物化视图等数据库对象。在创建脱敏策略时,可以指定需要脱敏的表和字段。

Q: 如何处理脱敏后的数据关系?

A: 在进行静态脱敏时,需要确保脱敏后的数据关系保持一致。例如,用户表和订单表中的用户ID应该保持对应关系。可以使用自定义的脱敏函数或存储过程来处理这种情况。

Q: 脱敏函数可以自定义吗?

A: 是的,KingBaseES 支持创建自定义脱敏函数。可以根据业务需求,使用PL/pgSQL或其他语言创建自定义的脱敏函数。

Q: 如何确保脱敏操作的安全性?

A: 可以通过以下措施确保脱敏操作的安全性:

  • 限制脱敏操作的权限
  • 对脱敏操作进行审计
  • 建立脱敏操作的审批流程
  • 定期审查脱敏操作的日志

总结

数据脱敏是保护敏感数据的重要手段,KingBaseES 提供了丰富的数据脱敏功能,包括动态数据脱敏和静态数据脱敏。DBA 应根据业务需求和合规要求,选择合适的脱敏方式,设计合理的脱敏策略,并定期审查和更新脱敏策略。通过合理使用数据脱敏功能,可以有效保护敏感数据,降低数据泄露风险,满足法规和标准的合规要求。