2025年9月25日: PostgreSQL 18 发布!

PostgreSQL Anonymizer 0.5:泛化和 k-匿名

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

法国 Eymoutiers,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

然后将 'anon' 添加到 postgresql.conf 文件的 shared_preload_libraries 参数中。然后重启您的实例。

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

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

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

致谢

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

如何贡献

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

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

如果您想提供帮助,您可以在此处找到一份初级职位列表。

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