PostgreSQL Anonymizer 0.5:泛化和 k-匿名性

发布于 2019-11-06,作者:Dalibo
相关开源

法国埃穆蒂耶,2019 年 11 月 6 日

Postgresql Anonymizer 是一个扩展,它隐藏或替换 PostgreSQL 数据库中的个人身份信息 (PII) 或商业敏感数据。

该扩展支持 3 种不同的匿名化策略:动态掩码就地匿名化匿名转储。它还提供了大量的掩码函数选择:替换、随机化、伪造、部分加扰、混洗、噪声添加和泛化。

泛化

泛化的思想是用更广泛、不太精确的值替换数据。例如,与其说“Bob 28 岁”,不如说“Bob 在 20 到 30 岁之间”。这对于分析很有意义,因为数据保持真实,同时避免了重新识别的风险。

PostgreSQL 可以使用 RANGE 数据类型轻松处理泛化,这是一种非常强大的方式来存储和操作包含在下限和上限之间的一组值。

这是一个包含医疗数据的基本表格

SELECT * FROM patient;
     ssn     | firstname | zipcode |   birth    |    disease    
-------------+-----------+---------+------------+---------------
 253-51-6170 | Alice     |   47012 | 1989-12-29 | Heart Disease
 091-20-0543 | Bob       |   42678 | 1979-03-22 | Allergy
 565-94-1926 | Caroline  |   42678 | 1971-07-22 | Heart Disease
 510-56-7882 | Eleanor   |   47909 | 1989-12-15 | Acne

我们希望匿名化数据保持真实,因为它将用于统计。我们可以在此表的基础上构建一个视图,以删除无用的列并概括间接标识符(邮政编码和生日)

CREATE MATERIALIZED VIEW generalized_patient AS
SELECT
  'REDACTED'::TEXT AS firstname,
  anon.generalize_int4range(zipcode,1000) AS zipcode,
  anon.generalize_daterange(birth,'decade') AS birth,
  disease
FROM patient;

这将为我们提供一个不太精确的数据视图

SELECT * FROM generalized_patient;
 firstname |    zipcode    |          birth          |    disease    
-----------+---------------+-------------------------+---------------
 REDACTED  | [47000,48000) | [1980-01-01,1990-01-01) | Heart Disease
 REDACTED  | [42000,43000) | [1970-01-01,1980-01-01) | Allergy
 REDACTED  | [42000,43000) | [1970-01-01,1980-01-01) | Heart Disease
 REDACTED  | [47000,48000) | [1980-01-01,1990-01-01) | Acne

k-匿名性

k-匿名性是一个行业标准术语,用于描述匿名化数据集的属性。k-匿名性原则指出,在给定的数据集中,任何匿名化的个人都不能与至少 k-1 个其他个人区分开来。换句话说,k-匿名性可以被描述为“隐藏在人群中”的保证。k 的值较低表示存在使用与其他数据源的链接进行重新识别的风险。

您可以分 2 步评估表的 k-匿名性因子

1/ 首先定义[间接标识符](也称为“准标识符”)的列,如下所示

SECURITY LABEL FOR anon ON COLUMN generalized_patient.zipcode 
IS 'INDIRECT IDENTIFIER';

SECURITY LABEL FOR anon ON COLUMN generalized_patient.birth 
IS 'INDIRECT IDENTIFIER';

2/ 一旦声明了间接标识符

SELECT anon.k_anonymity('generalized_patient')

在上面的示例中,generalized_patient 物化视图的 k-匿名性因子为 2

Lorem Ipsum

对于 TEXT 和 VARCHAR 列,您现在可以使用经典的 Lorem Ipsum 生成器

  • anon.lorem_ipsum() 返回 5 段
  • anon.lorem_ipsum(2) 返回 2 段
  • anon.lorem_ipsum( paragraphs := 4 ) 返回 4 段
  • anon.lorem_ipsum( words := 20 ) 返回 20 个单词
  • anon.lorem_ipsum( characters := 7 ) 返回 7 个字符

如何安装

此扩展官方支持 PostgreSQL 9.6 及更高版本。

在 Red Hat / CentOS 系统上,您可以从官方 PostgreSQL RPM 存储库安装它

$ yum install postgresql_anonymizer12

然后在您的 postgresql.conf 文件的 shared_preload_libraries 参数中添加 'anon'。并重新启动您的实例。

对于其他系统,请查看安装文档

https://postgresql-anonymizer.readthedocs.io/en/latest/INSTALL/

警告:该项目处于开发的早期阶段,应谨慎使用。

感谢

此版本包含来自 Travis Miller、Jan Birk 和 Olleg Samoylov 的代码和想法。非常感谢他们!

如何贡献

PostgreSQL Anonymizer 是 Dalibo Labs 计划的一部分。它主要由 Damien Clochard 开发。

这是一个开放项目,欢迎贡献。我们需要您的反馈和想法!请告诉我们您对这个工具的看法,它如何满足您的需求以及缺少哪些功能。

如果您想提供帮助,可以在这里找到 Junior Jobs 的列表

https://gitlab.com/dalibo/postgresql_anonymizer/issues?label_name%5B%5D=Junior+Jobs