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

然後在您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