- 脱敏策略 (ClickHouse Cloud, 25.12+):在查询时为特定用户/角色应用原生动态脱敏
- 字符串替换函数:使用内置函数进行基础脱敏
- 脱敏视图:创建包含转换逻辑的视图
- 物化列:在原始数据旁存储脱敏后的版本
- 查询脱敏规则:对日志中的敏感数据进行脱敏 (ClickHouse OSS)
使用脱敏策略 (ClickHouse Cloud)
从 25.12 版本起,ClickHouse Cloud 支持脱敏策略。
CREATE MASKING POLICY 语句提供了一种原生方式,可在查询时为特定用户或角色动态隐藏列值。与其他方法不同,脱敏策略无需创建单独的视图,也无需存储脱敏后的数据——用户查询表时会透明地完成转换。
基本数据脱敏策略
orders 表:
masked_data_viewer 角色的数据脱敏策略:
masked_data_viewer 角色的用户查询 orders 表时,他们会自动看到脱敏后的数据:
Query
Response (for masked_data_viewer role)
masked_data_viewer 角色的用户会看到原始的未掩码数据。
条件掩码
WHERE 子句,仅对特定行进行掩码处理。例如,只对高价值订单进行掩码处理:
具有优先级的多个策略
PRIORITY 子句来控制应用哪种转换。优先级值越高,越会在最后应用:
total_amount > 100 的订单,refined_masking 策略 (优先级 10) 会覆盖应用于 name 列的 basic_masking 策略 (优先级 0) ,而 email 仍使用基础掩码。
基于哈希的脱敏
管理脱敏策略
使用字符串替换函数
replace 函数家族提供了一种便捷的脱敏方式:
| Function | Description |
|---|---|
replaceOne | 将 haystack 字符串中首次出现的模式替换为指定的替换字符串。 |
replaceAll | 将 haystack 字符串中所有出现的模式替换为指定的替换字符串。 |
replaceRegexpOne | 将 haystack 中首次出现的、匹配正则表达式 pattern (re2 语法) 的子串替换为指定的替换字符串。 |
replaceRegexpAll | 将 haystack 中所有匹配正则表达式 pattern (re2 语法) 的子串替换为指定的替换字符串。 |
replaceOne 函数将名称 “John Smith” 替换为占位符 [CUSTOMER_NAME]:
Query
Response
replaceRegexpOne 替换任意客户名称:
Query
Response
replaceRegexpAll 函数对社会安全号码进行掩码处理,只保留最后 4 位数字。
Query
\3 将第三个捕获组代入结果字符串中,生成:
Response
创建经过掩码处理的 VIEW
VIEW 与前面提到的字符串函数结合使用,在向用户展示包含敏感数据的列之前,先对其进行转换。
这样一来,原始数据保持不变,而查询该视图的用户只能看到脱敏数据。
为了演示这一点,假设我们有一张存储客户订单记录的表。
我们希望让一组员工能够查看这些信息,但不希望他们看到客户的完整信息。
运行下面的查询,创建一个示例表 orders,并向其中插入一些虚构的客户订单记录:
masked_orders 的视图:
SELECT 子句中,我们使用 replaceRegexpOne 对 name、email、phone 和 shipping_address 字段进行转换;这些字段包含我们希望部分掩盖的敏感信息。
从该视图中查询数据:
Query
Response
SELECT 权限:
SELECT 权限。
因此,稳妥起见,你应显式撤销对基表的访问权限:
masked_orders_viewer 角色的用户只能看到
视图中的脱敏数据,而无法看到表中的原始未脱敏数据。
使用 MATERIALIZED 列和列级访问限制
VIEW,而是使用 MATERIALIZED 创建脱敏列:
SELECT * 查询中自动包含物化列。
Query
Response
orders 表中脱敏列执行 select 的权限。
重新创建我们之前创建的角色:
orders 表授予 SELECT 权限:
orders 表中存储脱敏后的数据,
可以将包含敏感信息的未脱敏列标记为 EPHEMERAL,
这样可确保这类列不会存储在表中。
Query
Response
使用查询脱敏规则处理日志数据
system.query_log、system.text_log 和 system.processes) 之前生效。
这有助于防止敏感数据仅泄露到日志中。
请注意,它不会屏蔽查询结果中的数据。
例如,要屏蔽社会安全号码,你可以将以下规则添加到你的服务器配置中: