GBase 8a
运维管理
文章
精选
数据脱敏(Data Masking)在GBase 8a中是如何实现的?是动态脱敏还是静态脱敏?
发表于2026-03-27 10:15:4720次浏览3个评论
GBase 8a MPP Cluster 实现的数据脱敏(Data Masking)是动态脱敏。这是一种在查询时实时进行数据转换,而不改变底层实际存储数据的安全技术。
一、核心结论:动态脱敏
- 定义:动态数据脱敏在数据被读取时(查询阶段) 实时进行转换,根据查询者的权限决定返回脱敏后的数据还是原始数据。原始数据在物理存储中保持不变。
- 文档中的明确证据:
- “动态数据脱敏并不会真正改动表中存储的实际数据,只是在查询的时候应用该特性控制查询返回的数据,显示成期望的内容。”
- “用户可以通过SQL语法的形式,给需要进行数据脱敏的字段添加脱敏属性,并通过用户权限控制,决定是否对有查询要求的用户暴露原始数据。”
二、动态脱敏的实现机制
GBase 8a 的动态脱敏实现包含三个核心要素:脱敏属性定义、脱敏函数规则和权限控制。
1. 定义脱敏列(在表创建或修改时)
通过在DDL语句中为指定列添加 MASKED WITH 子句来定义脱敏属性。
-- 创建表时指定脱敏列
CREATE TABLE customer (
id INT,
name VARCHAR(100) MASKED WITH (FUNCTION = 'default()'), -- 姓名默认脱敏
phone VARCHAR(20) MASKED WITH (FUNCTION = 'partial(\"***\", 3, 4)'), -- 手机号部分脱敏
email VARCHAR(50) MASKED WITH (FUNCTION = 'keymask(\"@\", \"****\", 0)') -- 邮箱指定位置脱敏
);
-- 为已有表增加脱敏属性
ALTER TABLE customer MODIFY COLUMN email VARCHAR(50) MASKED WITH (FUNCTION = 'keymask(\"@\", \"****\", 0)');
2. 五种内置脱敏函数
GBase 8a 提供了五种脱敏函数,适用于不同类型的数据:
| 函数 | 语法示例 | 适用类型 | 脱敏效果(示例) |
|---|---|---|---|
| 默认脱敏 | default() | 任意类型 | ‘Brad Stevens’ → ‘XXXX’‘1976-10-22’ → ‘1900-00-00 00:00:00’ |
| 随机脱敏 | random(start, end) | 数字类型 | 42 → 2 (在start-end范围内随机) |
| 自定义脱敏 | partial(prefix, padding, suffix) | 字符类型 | ‘Hello’ (prefix=1, suffix=1, padding=‘X’) → ‘HXXXo’ |
| 哈希脱敏 | sha() | 字符类型 | ‘Hello’ → 哈希值(如a9993e...) |
指定位置脱敏
| keymask(substr, padding, pos) | 字符类型 | ‘gbase@gbase.cn’ (substr=‘@’, padding=‘****’, pos=0) → ‘****@gbase.cn’ |
| 原始数据 | 脱敏后数据(普通用户)
|
|---|---|
Brad Stevens | XXXX |
1976-10-22 12:21:56.123000 | 1900-00-00 00:00:00 |
42 | 2 (随机值) |
gbase@gbase.cn | ****@gbase.cn |
3. 权限控制:决定是否脱敏
这是动态脱敏的“开关”。通过授予或收回 UNMASK 权限,来控制用户看到的是脱敏数据还是原始数据。
- 无
UNMASK权限:用户查询脱敏列时,看到的是脱敏后的数据。 - 有
UNMASK权限:用户查询脱敏列时,看到的是原始真实数据。
-- 授予用户查看某个表脱敏列真实值的权限
GRANT UNMASK ON db_name.table_name TO user_name@'host';
-- 收回权限
REVOKE UNMASK ON db_name.table_name FROM user_name@'host';重要提示:UNMASK权限的作用是允许用户查看脱敏字段的真实值,而非“只能看掩码”。
三、动态脱敏与静态脱敏的对比
| 特性 | GBase 8a 动态脱敏 | 静态脱敏(GBase 8a 未原生提供) |
|---|---|---|
| 数据存储 | 原始数据不变,按原样存储。 | 永久替换存储层的数据,原始数据被覆盖或转移到它处。 |
| 处理时机 | 查询时实时转换。 | ETL/加载时或离线批量处理。 |
| 灵活性 | 高,同一份数据对不同用户呈现不同内容。 | 低,脱敏后所有用户看到的内容相同。 |
| 性能影响 | 轻微的计算开销,主要在查询阶段。 | 无查询开销,但需要额外的ETL处理时间和存储空间。 |
| 主要用途 | 生产环境,满足实时查询下的数据安全与合规。 | 开发/测试环境的数据供给,或数据归档。 |
| GBase实现 | 原生支持,通过DDL属性和权限控制。 | 需借助外部ETL工具或自定义脚本实现。 |
四、重要规则与限制
- 函数计算规则:
控制流函数(如
CASE,NVL,COALESCE):如果参数中有脱敏列,直接返回脱敏列本身,或将脱敏规则应用到返回值。计算比较函数(如
CONCAT, 算术运算):如果参数中有脱敏列,使用默认脱敏规则对返回值进行脱敏。文档示例:
SELECT CONCAT(mask_col, '123') FROM t;会返回一个被默认脱敏规则处理过的值。
权限粒度:
UNMASK权限支持在 VC级、数据库级、表级 进行授予,实现灵活的权限管理。
五、总结
GBase 8a 采用动态脱敏方案,通过 “列属性定义 + 内置函数 + UNMASK权限” 的三重机制实现。其最大优势在于:
- 保障存储性能:无需改变高效的列式存储结构。
- 满足实时合规:在数据共享和查询场景中,能实时响应不同的数据安全策略。
- 管理灵活:安全策略(脱敏规则和权限)与数据模型分离,可独立调整。
这种设计非常适合数据仓库和数据分析场景,在确保核心数据资产安全的同时,不影响数据的分析和共享价值。如需静态脱敏,需在数据加载到GBase 8a之前,通过ETL流程完成。
热门帖子
- 12025-12-01浏览数:182110
- 22023-05-09浏览数:24378
- 42023-09-25浏览数:17592
- 52020-05-11浏览数:16623