数据脱敏
在创建分支时匿名化 PII — 脱敏策略、内置函数库,以及脱敏分支如何在脱敏提交前保持封闭。
数据脱敏 在 分支 创建的那一刻就匿名化敏感列。你在创建 分支的调用上附加一个 脱敏策略,新分支中匹配的列会在该分支可被访问之前 就被不可逆地重写 — 哈希、置空、截断或替换。父分支永远不会被修改。
当你需要把生产形态的数据交给开发、CI 或外包人员,却又不想把其中的 PII 一并 交出去时,你会用到它:真实的表结构、真实的行数、伪造的邮箱。
工作原理
脱敏策略是一组项目范围的、具名的规则。每条规则按模式匹配列并指定一个内置 脱敏函数:
| 字段 | 含义 |
|---|---|
schema_pattern | 模式(schema)名称匹配模式(% 或 * = 任意,_ = 一个字符)。默认为 *。 |
table_pattern | 表名匹配模式。 |
column_pattern | 列名匹配模式。 |
masking_fn | 下列内置函数之一。 |
fn_args | 函数参数(只有 mask_constant 接受一个:value)。 |
在创建分支时,当提供了 masking_policy_id:
- 分支照常从其父分支派生(写时复制 — 瞬时完成)。
- 分支进入
masking状态。不会预配任何端点,代理也拒绝对它的连接: 不存在任何窗口 能读取到脱敏前的数据。 - 一个脱敏工作器以最小权限角色连接到该分支的计算,发现其模式,将你的规则 与之匹配,并在单个事务中执行每一次重写。
- 分支落入
ready且其端点启动 — 此时只提供脱敏后的数据。一旦出现任何 失败,分支落入failed并保持封闭;删除它并重试。
规则输入始终被当作数据处理,绝不当作 SQL:标识符会被加引号,参数值在执行时 作为参数绑定,因此一个恶意的列名或常量无法突破重写。
内置函数
| 函数 | 效果 |
|---|---|
mask_email | md5(value)@masked.invalid |
mask_name | Name_ + 一个 8 字符的哈希前缀 |
mask_null | NULL(列必须可为空) |
mask_constant | 你提供的一个固定值(fn_args.value) |
mask_ssn_partial | ***-**-1234 — 保留最后 4 位 |
mask_credit_card | ****-****-****-1234 — 保留最后 4 位 |
mask_ip | 0.0.0.0 |
mask_date_year | 保留年份,截断到 1 月 1 日 |
mask_hash | md5(value) |
mask_shuffle | 基于哈希的打乱(完整的字符乱序在计划中) |
mask_phone | 一个合成的 +1-555-XXXX 号码 |
mask_uuid | 一个全新的随机 UUID |
该目录也由 API 提供:
curl -s https://api.test.kisenon.com/v1/masking-functions \
-H "Authorization: Bearer $KISENON_API_KEY"管理策略
数据脱敏正在 逐步推出。这里描述的策略编辑器和创建分支下拉框正在逐步 启用;在脱敏对你的账户上线之前,API 会返回
501 not_implemented,控制台 会显示一条"尚不可用"的提示。在此期间你的项目不受影响。
在控制台中,打开 项目设置 → 数据脱敏 来创建一个策略:为其命名,添加规则 (模式列 + 一个函数下拉框),然后保存。同样的入口也存在于 API 上:
curl -s -X POST \
https://api.test.kisenon.com/v1/projects/$PROJECT_ID/masking-policies \
-H "Authorization: Bearer $KISENON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "dev-safe",
"rules": [
{"table_pattern": "users", "column_pattern": "email", "masking_fn": "mask_email"},
{"table_pattern": "users", "column_pattern": "phone", "masking_fn": "mask_null"},
{"table_pattern": "%", "column_pattern": "%ssn%", "masking_fn": "mask_ssn_partial"}
]
}'然后通过把策略加入一个普通的创建分支调用来创建一个脱敏分支:
curl -s -X POST \
https://api.test.kisenon.com/v1/projects/$PROJECT_ID/branches \
-H "Authorization: Bearer $KISENON_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "masked-dev", "masking_policy_id": "'$POLICY_ID'"}'重写运行期间该分支报告 state: "masking";在控制台中(实时,通过项目
事件流)或通过轮询 GET /v1/branches/{id} 观察它翻转为
ready。
须知
- 脱敏是一次性的,发生在创建时。 编辑策略永远不会触及那些已经用它创建的 分支 — 它们保持自己诞生时的数据形态。重新创建分支以应用新规则。
- 使用中的策略无法删除。 删除一个有活动分支用它创建过的策略会返回
409 policy_in_use;先删除那些分支。 - 未匹配的规则会被跳过,而非致命。 如果你的模式发生了漂移而某个模式什么 也匹配不到,分支仍会完成 — 如果你预期被脱敏的某列仍保留着真实的数据形态, 请检查规则模式。
- 类型不匹配会使分支失败。 一条匹配到其函数无法重写的列的规则(比如对一个
integer用mask_email)会中止整个脱敏 — 分支落入failed,绝不会以 脱敏到一半的状态暴露。