kisenon

数据脱敏

在创建分支时匿名化 PII — 脱敏策略、内置函数库,以及脱敏分支如何在脱敏提交前保持封闭。

数据脱敏分支 创建的那一刻就匿名化敏感列。你在创建 分支的调用上附加一个 脱敏策略,新分支中匹配的列会在该分支可被访问之前 就被不可逆地重写 — 哈希、置空、截断或替换。父分支永远不会被修改。

当你需要把生产形态的数据交给开发、CI 或外包人员,却又不想把其中的 PII 一并 交出去时,你会用到它:真实的表结构、真实的行数、伪造的邮箱。

工作原理

脱敏策略是一组项目范围的、具名的规则。每条规则按模式匹配列并指定一个内置 脱敏函数:

字段含义
schema_pattern模式(schema)名称匹配模式(%* = 任意,_ = 一个字符)。默认为 *
table_pattern表名匹配模式。
column_pattern列名匹配模式。
masking_fn下列内置函数之一。
fn_args函数参数(只有 mask_constant 接受一个:value)。

在创建分支时,当提供了 masking_policy_id

  1. 分支照常从其父分支派生(写时复制 — 瞬时完成)。
  2. 分支进入 masking 状态。不会预配任何端点,代理也拒绝对它的连接: 不存在任何窗口 能读取到脱敏前的数据。
  3. 一个脱敏工作器以最小权限角色连接到该分支的计算,发现其模式,将你的规则 与之匹配,并在单个事务中执行每一次重写。
  4. 分支落入 ready 且其端点启动 — 此时只提供脱敏后的数据。一旦出现任何 失败,分支落入 failed 并保持封闭;删除它并重试。

规则输入始终被当作数据处理,绝不当作 SQL:标识符会被加引号,参数值在执行时 作为参数绑定,因此一个恶意的列名或常量无法突破重写。

内置函数

函数效果
mask_emailmd5(value)@masked.invalid
mask_nameName_ + 一个 8 字符的哈希前缀
mask_nullNULL(列必须可为空)
mask_constant你提供的一个固定值(fn_args.value
mask_ssn_partial***-**-1234 — 保留最后 4 位
mask_credit_card****-****-****-1234 — 保留最后 4 位
mask_ip0.0.0.0
mask_date_year保留年份,截断到 1 月 1 日
mask_hashmd5(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;先删除那些分支。
  • 未匹配的规则会被跳过,而非致命。 如果你的模式发生了漂移而某个模式什么 也匹配不到,分支仍会完成 — 如果你预期被脱敏的某列仍保留着真实的数据形态, 请检查规则模式。
  • 类型不匹配会使分支失败。 一条匹配到其函数无法重写的列的规则(比如对一个 integermask_email)会中止整个脱敏 — 分支落入 failed,绝不会以 脱敏到一半的状态暴露。