【云驻共创】隐私保护不用愁,数据脱敏为您解忧
1. 隐私保护,刻不容缓
随着大数据时代的到来,数据作为重要的生产要素和流动载体,如何加强技术层面的数据安全和隐私保护,对数据仓库产品提出更高的要求。GaussDB(DWS) 提供指定用户范围内列级敏感数据的动态脱敏功能,实现灵活、高效、透明、友好的数据库内敏感数据可算、库外不可见的脱敏效果。
安全能力是数仓产品越来越突出的竞争力,隐私数据保护是数据安全建设持续完善的应用场景。
- 大数据时代,颠覆传统业态运作模式,激发出新的生产潜能。
- 数据是重要的生产要素,是信息载体,数据间的流动潜藏着更高阶的价值信息。
- 数据挖掘、人工智能给隐私保护带来了更大的挑战。
- 然而,信息泄露事件层出不穷,数据安全越来越收到广泛关注。
- 华为云数仓 GaussDB(DWS) 的客户涵盖金融、政企、互联网、运营商等行业。
- 隐私数据泄露,对数据主体的财产、名誉、人身安全及合法利益造成严重损失。
2. 什么是数据脱敏
2.1. 数据脱敏
数据脱敏(Data Masking),顾名思义,即屏蔽敏感数据,对敏感数据通过脱敏规则进行数据的变形。
常见的敏感数据:任何泄露后可能会给社会或个人带来严重危害的数据。
- 个人身份信息 PII:姓名、身份证号码、住址、手机号、邮箱。
- 企业不适合公开信息:营业执照号码、税务登记证、员工薪水等。
- 设备信息:IP 地址、MAC 地址。
- 支付卡行业数据安全标准 PCI-DS:银行卡。
- 受保护的健康信息 PHI。
- 知识产权 IP。
业界常见的脱敏规则:替换、重排、加密、截断、掩码。
2.2. 数据脱敏 VS 数据加密
对比 |
数据脱敏 |
数据加密 |
如何保护数据 |
兼顾数据安全和数据使用 |
通过数据编码来保护数据 |
算法 |
采用专业数据脱敏算法 |
只能使用解密密钥解码数据 |
可逆 |
不可逆 |
可逆 |
方式 |
静态脱敏、动态脱敏 |
EDS、MD5 等加密函数 |
2.3. 静态脱敏 VS 动态脱敏
对比 |
静态脱敏 |
动态脱敏 |
方法 |
数据的“搬移并仿真替换” |
边脱敏,边使用 |
脱敏方案 |
将数据抽取并脱敏后,下发下游环节,随意取用和读写 |
可以为不同权限、不同数据类型执行不同脱敏方案 |
脱敏数据 |
脱敏后数据与生产环境隔离 |
不脱离生产环境,实时脱敏 |
2.4. 数据加密评判标准
- 数据可用性:尽可能地为脱敏后的应用保留脱敏前的有意义信息。
- 数据隐私性:最大程度防止黑客破解。
- 数据可用性:参与运算的敏感数据不失真。
3. 数据脱敏解决什么问题
3.1. 数据脱敏能力可以帮助客户
- 消除暴露个人敏感数据的风险,遵守 CPRA、GDPR、HIPAA 隐私法规。
- 保持可用性和一致性,保护数据免受网络攻击。
- 减低数据高效共享的风险。
3.2. 微软 STRIDE 威胁建模
基于业务数据流图分析 STRIDE 六种威胁存在的可能性及系统的弱点,发散思考潜在风险,制定防范或减轻威胁的对策。
- S-Spoofing(伪冒):伪造成某对象或某人。
- T-Tampering(篡改):对数据、代码等的未授权修改。
- R-Repudiation(抵赖):否认一项交易。一个用户在执行一个无法追踪的非法操作时,会导致抵赖。
- I-Information Disclosure(信息泄露):将信息泄露给未授权访问的个体。
- D-Denial of service(拒绝服务):服务不可用,合法用户的服务请求被拒绝或降低级别。
- E-Elevation of privilege(提升权限):获得高于已分配或业务需要的权限。
3.3. 数据仓库安全技术
- 数据安全展示:数据脱敏、行级访问控制。
- 数据安全传输:HTTP、SSL、TLS。
- 数据安全认证:连接认证、LDAP、OneAccess。
- 数据安全运维:防篡改数据库、审计、权限、密态数据库。
- 数据安全管理:全密态数据库。
- 数据安全存储:数据存储加密、透明加密。
4. GaussDB(DWS) 动态数据脱敏
4.1. 三方代理脱敏工具VS 数仓 DWS 脱敏引擎
- 三方代理工具是用户与数仓集群大的中转站,是底座之外的外挂脱敏工具,无法直接参与生产环境,复杂场景较难处理。
- DWS 则是基于数仓底座与存储引擎、SQL引擎直接交互的脱敏引擎,在查询执行过程中实时脱敏、脱敏结果直接返回给客户。
- 代理脱敏工具是静态脱敏,DWS 脱敏引擎是动态脱敏。
4.2. DWS 动态脱敏引擎的优势
- 良好的底座协同:脱敏引擎贯穿于数仓底座的诸多环节,基于预置脱敏策略,参与 SQL 引擎的分析、重写、优化与执行。脱敏过程用户无感知。
- 策略可配置:客户可结合自身业务场景识别敏感数据并对业务表的指定列灵活配置脱敏策略。
- 策略可扩展:产品内置脱敏函数,可以涵盖大部分常见脱敏效果,支持用户自定义脱敏函数。
- 数据可用性:数据库内置原始敏感数据参与运算,仅在出库时刻(返回结果时)才会做脱敏处理。
- 数据访问控制:脱敏策略生效条件的用户均对原始敏感数据不可见。
- 全场景数据不泄露:底座交互,可减少敏感数据传输链路潜在的泄露风险,更加安全可靠,且充分识别各种恶意套取潜在场景并有效防护。
5. 深入理解脱敏策略
5.1. 脱敏策略
脱敏策略:刻画什么条件(生效条件)下哪些表对象的那些列(脱敏列)呈现什么样的脱敏效果(脱敏函数)。
- 原则上,业务表各字段敏感/非敏感是明确的,故脱敏策略与表对象是一一对应的,一张表有一个脱敏策略。
- 脱敏策略的三要素:
- 表对象
- 生效条件
- 脱敏列,脱敏函数二元组
- 不同列字段根据数据特征,可以绑定不同的脱敏函数。
- 当且仅当生效条件为真时,查询语句才会出发敏感数据的脱敏效果。
- 脱敏过程是内置在SQL引擎内部的,对生产环境用户是透明可不见的。
5.2. 脱敏流程
DWS数据脱敏功能的使用流程:
5.2.1. 确定受访问用户/角色
动态数据脱敏,是在查询语句执行过程中,根据生效条件是否满足,实现实时的脱敏处理。生效条件,通常是针对当前用户角色的判断。敏感数据的可见范围,即是针对不同用户预设的。系统管理员,具有最高权限,任何时刻对任何表的任何字段都可见。
5.2.2. 识别和梳理敏感字段
敏感信息依赖于实际业务场景和安全维度,以自然人为例,用户个体的敏感字段包括:姓名、身份证号、手机号、邮箱地址等等;在银行系统,作为客户,可能还涉及银行卡号、过期时间、支付密码等等;在公司系统,作为员工,可能还涉及薪资、教育背景等;在医疗系统,作为患者,可能还涉及就诊信息等等。
5.2.3. 确定各字段脱敏效果以及脱敏函数
产品内置一系列常见的脱敏函数接口,可以针对不同数据类型和数据特征,指定参数,从而达到不一样的脱敏效果。脱敏函数可采用如下三种内置接口,同时支持自定义脱敏函数。三种内置脱敏函数能够涵盖大部分场景的脱敏效果,不推荐使用自定义脱敏函数。
5.2.4. 执行策略
执行CREATE REDACTION POLICY 预置脱敏策略
6. 如何预置脱敏策略
脱敏策略是DWS新引入的数据库对象,用于刻画表对象预置的脱敏策略信息。
提供一套DDL语法,支持脱敏策略的创建、删除和修改。
6.1. 创建脱敏策略
CREATE REDACTION POLICY policy_name ON table_name [ WHEN (when_expression) ] [ ADD COLUMN column_name WITH redaction_function_name ( [ argument [, ...] ] )] [, ... ];
- policy_name:脱敏策略名称。
- table_name:应用脱敏策略的表名。
- WHEN ( when_expression ):WHEN子句指定一个生效表达式。仅当此表达式为真时,脱敏策略才可能生效。
- column_name:脱敏策略应用的表对象的列名。
- function_name:对脱敏列应用的脱敏函数。
- arguments:脱敏函数的参数列表。
6.2. 修改脱敏策略
- 修改脱敏策略生效表达式
ALTER REDACTION POLICY policy_name ON table_name WHEN (new_when_expression);
- 使脱敏策略生效或失效
ALTER REDACTION POLICY policy_name ON table_name ENABLE | DISABLE;
- 重命名脱敏策略
ALTER REDACTION POLICY policy_name ON table_name ENABLE | DISABLE;
- 修改脱敏列,包括新增、修改、删除脱敏列
ALTER REDACTION POLICY policy_name ON table_name action;
6.3. 删除脱敏策略
DROP REDACTION POLICY [ IF EXISTS ] policy_name ON table_name;
- IF EXISTS:如果待删除的脱敏策略不存在,则发出一个NOTICE,而不是抛出一个错误。
- policy_name:脱敏策略名字。
- table_name:待删除的脱敏策略应用的表对象。
7. 脱敏函数与效果
数据脱敏函数提供一系列不同脱敏形式的函数接口,可以覆盖常见的脱敏场景。通常结合数据脱敏语法,与脱敏列绑定使用,不推荐直接作用在查询语句上。
更多详细信息可参考:数据脱敏函数_数据仓库服务 GaussDB(DWS)_8.1.3推荐版_函数和操作符_华为云 (huaweicloud.com)
7.1. 可算不可见的数据脱敏
基本原则: 数据库内,原始敏感数据参与加工计算,仅出库时刻,敏感数据脱敏处理。
前置条件:开关 enable_readactcol_computable=on !
原敏感数据直接参与加工计算:
- 投影列表达式 nullif
- 投影列 LIKE 表达式
- 投影列函数 to_days
- 聚集函数
- 过滤条件
- 分组条件(GROUP BY)
- 子查询位置投影列表达式
- 两表使用敏感字段作关联条件
- CTE 表达式投影列
出库时刻出发的场景:
- 表查询
- 视图查询
- DML RETURNING 字句
- COPY 导出
- GDS 外表导入
- 游标 . FETCH
- 存储过程定义使用脱敏表,查询存储过程
7.2. 敏感数据的传递与脱敏策略的继承
脱敏策略继承的场景
- INSERT/UPDATE/MERGE INTO/CREATE TABLE AS 语句。
- 只要子查询是对业务表某个目标敏感字段的投影操作(敏感血缘分析),即可触发一次脱敏继承。
- 策略继承只是表维度的活动,继承活动不关注子查询部分当前会话或角色条件下脱敏策略是否生效。
脱敏策略的继承机制
- 敏感血缘分析:任何用户执行 DML 语句,遍历子查询部分源表及目标投影列,一旦源表存在脱敏策略且目标投影列是脱敏字段,则认为使用源表插入/更新目标表数据时,有暴露源表敏感数据的风险。
- 脱敏策略继承:
- 从遍历标记的源表敏感信息中,生成作用于目标表的脱敏策略信息及脱敏字段信息。
- 系统内置生成策略创建语句并执行写入系统表 pg_redaction_policy/pg_redaction_column。
- 系统表元数据 inherit 标记字段为 true。
- 特别地:
- 如果 INSERT 执行会话/用户满足出发条件,当带有 RETURNING 字句打印插入结果时,返回结果会被脱敏。
- 日志信息“Parent redaction policies/columns”记录策略继承的来源。
7.3. 脱敏策略继承冲突
脱敏策略冲突的场景:
- SELECT 语句查询目标列非原始敏感字段,而是敏感字段的复杂表达式,表达式先算后脱敏,脱敏行为怎么界定?
- SETOP 集合运算两个子分支的对应同一目标列采用不同的脱敏效果,外层语句目标列脱敏结果如何界定?
- 多次 INSERT/UPDATE 操作的敏感血缘分析中,同一目标列的源表投影列采用的不一样的脱敏效果,且源表策略的生效条件也可能不同,策略该如何继承?
冲突的解决方案,旨在保证数据库内可算库外不可见,至少确保敏感数据不不泄露:
- 假设条件:用户任何敏感数据不泄露 > 敏感数据脱敏的效果不具有原始特征
- 如遇脱敏效果冲突时,均提升为通用脱敏效果 mask_full
- mask_full 是可以覆盖任何数据类的全脱敏函数,只关注表达式返回值类型,至少可保证敏感数据不泄露,脱敏效果无法表征原始数据特征,可读性差
- 特别地,针对 length、count 等函数表达式计算结果不会暴露任何原始数据特征及信息,故提供 ALTER FUNCTION ...[NOT] MASKED 语法,支持用户手动配置不脱敏函数白名单。
7.4. 防护恶意套取行为
什么是恶意套取行为:
- 已知某些敏感信息,通过多次试探性匹配,反向佐证可见的用户信息,从而窃取用户的隐私数据。
- 试探性匹配,通常借助等值判断形式表达式的过滤条件或投影操作达到套取的目的。
- 两个条件:已知常量值、等值/类等值判断表达式。
悲观主义者认为,任何常量等值判断可能都存在恶意套取的风险,要禁掉!
禁止使用常量恶意套取的场景:
- 脱敏字段的常量等值判断表达式、符合表达式、等价表达式。
- 假设 name 字段是脱敏字段且当前会话满足策略触发条件,则如下语句特征存在恶意套取风险,禁止执行
- name=’张三’
- name=’张三’ OR name=’李四’
- name in (’张三’ ,’李四’)
- CASE name WHEN ’张三’ THEN true ...
- CASE WHEN name in (’张三’ ,’李四’) THEN ...
- 高级包 put_line
- 语句执行报错:ERROR: Redaction column "name"cannot be referenced in equivalence conditions with const value.
7.5. 数据脱敏性能开销
影响数据脱敏场景SELECT语句查询执行开销的主要因素:
- 表的数据规模。
- 查询目标列涉及的脱敏列数。
- 脱敏字段采用的脱敏函数的复杂性。
以 tpch 表 customer 为例,简单查询脱敏场景的执行性能测试结果:
动态脱敏性能评测结论:
- 表数据的规模越大,目标列含有脱敏字段越多,带有脱敏的查询耗时与原始语句差异越大。
- 相同目标列数,且均采用相同脱敏函数情况下,带有脱敏的查询耗时比原始语句劣化10%,此劣化在可接受范围内。
- 不同脱敏函数实现效果和复杂度不同,脱敏函数越简单,对脱敏查询的影响越小,甚至比原始语句执行耗时更短。比如,mask_fulli 函数改写任何结果为一个固定值,比原字段内容短且简单,表数据量大的情况下,带有脱敏的简单查询提速不少。
- 实验室性能专项测试:tpcds 1000x 场景查询性能符合劣化10% 以内的预期,甚至部分Query脱敏后查询执行时间反倒有3%-7%提升。
- 某客户生产环境测试:整体性能劣化在3%以内,且动态实时脱敏节省900TB+脱敏数据存储开销,集群规模缩减50%可实现原业务运转。
8. 实战:如何预置和应用脱敏策略
以员工表为例,表emp包含员工的姓名、手机号、邮箱、银行卡号、薪资等隐私数据。
8.1. 角色如下
- 人力资源经理(HR):David
- PL:Jack
- 普通员工:Bob
8.2. 基础数据
8.3. 应用用例
用例一:创建脱敏策略rp_emp,仅HR可查看所有信息,其他人均对银行卡号和薪资不可见,两字段均采用最常见的部分脱敏形式。
普通员工查看员工信息表,字段cardid和salary数据已脱敏
用例二:要求PL参与团队招聘事宜,也对员工所有信息可见
查看员工信息表,所有数据均可见
9. 总结
华为云数仓GaussDB(DWS)产品动态脱敏能力,提供了如下能力
- 一套简单、易用的数据脱敏策略语法。
- 一系列可覆盖常见隐私数据脱敏效果,灵活、可配置、易扩展的脱敏函数。
- 一个完备、便捷、可靠的脱敏策略应用方案,保证数据的隐私性和可用性。
本文参与华为云社区【内容共创】活动第25期。
任务4:隐私保护不用愁,数据脱敏为您解忧
- 点赞
- 收藏
- 关注作者
评论(0)