PostgreSQL 安全管理 数据脱敏 Anonymizer 抽样脱敏(Privacy By Default)

1 背景知识

GDPR 引入 数据最小化 原则的概念,是指通常不需要对整个数据库进行匿名处理。在通常情况下,提取表中的一个子集就足够了。

例如,将10%的数据进行脱敏,并在CI工作流中进行测试。由于数据量较小脱敏处理的速度也快得多。

2 如何使用取样脱敏

假设在一个表中存储了大量的 http 日志。对于 ip_address 进行脱敏,并只提取表中的 10%

CREATE TABLE http_logs (
  id integer NOT NULL,
  date_opened DATE,
  ip_address INET,
  url TEXT
);

SECURITY LABEL FOR anon ON COLUMN http_logs.ip_address
IS 'MASKED WITH VALUE NULL';

SECURITY LABEL FOR anon ON TABLE http_logs
IS 'TABLESAMPLE BERNOULLI(10)';

现在,可以选择动态脱敏静态脱敏导出脱敏

3 取样脱敏的语法

SELECT 语法中的 TABLESAMPLE clause 语句和取样脱敏的语法完全一致。

可以在数据级别定义抽样比率,将会在所有表中生效。

SECURITY LABEL FOR anon ON DATABASE app
IS 'TABLESAMPLE SYSTEM(33)';

4 抽样脱敏如何维护参照完整性

Warning

如果有外键关联到抽样脱敏的表,上述取样方法将会失败。

因为使用抽样脱敏并保持参照完整性是非常困难的,此插件将会不支持这种提取操作。

如果确实有这种需求场景,请参考以下步骤

  1. 使用 PostgreSQL pg_sample 提取样本数据。
  2. 使用本插件进行抽样脱敏。
Note

PostgreSQL 可能还有其他抽样工具,但 PostgreSQL pg_sample 是最好用的一个。