使用 PostgreSQL Anonymizer 進行資料遮蔽

Databases for PostgreSQL Anonymizer 是 擴充套件,旨在透過遮蔽或取代 資料庫中的個人識別資訊和敏感業務資訊來匿名化資料。PostgreSQL Databases for PostgreSQL

擴充套件支援下列遮罩策略,每種策略都適用於不同的使用個案:

  • 靜態遮罩:根據規則移除 PII。
  • 動態遮蔽:僅隱藏被遮蔽使用者的 PII。
  • 匿名轉儲:只需將隱藏資料匯出到 SQL 檔案。
  • 概括化:以較寬廣、較不精確的類別或範圍取代特定值。

靜態遮罩

靜態遮罩是一種資料匿名化技術,它以合成產生的值不可逆地取代敏感資訊、格式保存值。 此程序可確保完整且永久地移除原始資料,從而消除 重新識別或重建的可能性。 如需詳細資訊,請參閱 靜態遮罩

啟用靜態遮罩

  1. 安裝 Anonymizer 擴充套件。

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. 初始化匿名器。

    select public.run_anon_init();
    
  3. 定義遮罩規則。

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION anon.<masking_function>()';
    
  4. 驗證已套用的遮罩規則。

    SELECT objoid::regclass, provider, label
    FROM pg_seclabel
    WHERE provider = 'anon' AND objoid = '<table_name>'::regclass;
    
  5. 永久套用規則。以下指令會以遮罩資料永久取代指定表格中的原始資料。

    SELECT anon.anonymize_table('<table_name>');
    
  • 靜態遮罩是一個緩慢的過程。 靜態遮罩的原則是更新包含至少一個遮罩列的所有資料表的所有行。 這表示 PostgreSQL 會重寫磁碟上的所有資料。 視資料庫大小、硬體和實例配置而定,匯出匿名資料並將其重新載入資料庫可能會更快。

  • 若要對表中新插入的行套用遮罩,請執行下列指令。

    SELECT anon.anonymize_table('<table_name>');
    

    此指令可確保任何新增到資料表中的資料都會根據設定的匿名化規則進行遮蔽。

動態遮罩

動態遮罩允許資料庫擁有者遮罩特定使用者的敏感資料、同時允許授權使用者存取及修改原始、未遮罩的值。 如需詳細資訊,請參閱 動態遮罩

啟用動態遮罩

  1. 安裝 Anonymizer 擴充套件。

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. 初始化匿名器。

    select public.run_anon_init();
    
  3. 啟動動態遮罩引擎。

    show anon.transparent_dynamic_masking;
    
    select public.enable_dynamic_masking ('<database_name>');
    

    如果 anon.transparent_dynamic_masking 顯示為關閉,請重新啟動會話。

  4. 建立遮罩存取的角色。

    CREATE ROLE <role_name> LOGIN;
    
  5. 將角色標記為隱藏使用者。

      SECURITY LABEL FOR anon ON ROLE <role_name> IS 'MASKED';
    
  6. 授予角色遮罩表上的權限。

      grant select on <schema_name>.<table_name> to <role_name> ;
    
  7. 宣告遮蔽規則。

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION anon.<masking_function>()';
    
  8. 驗證遮罩規則。

    SELECT objoid::regclass, provider, label
    FROM pg_seclabel
    WHERE provider = 'anon' AND objoid = '<table_name>'::regclass;
    
  9. 使用遮罩的角色連線到資料庫,並查詢資料表。 您應該可以看到根據定義的規則遮罩的資料。

select * from <table_name>;

附註:

  • 匿名者會根據查詢者的身分來遮蔽資料。
  • 不允許遮罩的角色插入、更新或刪除資料。
  • 您可以在多個模式中遮罩資料表。
  • 遮蔽規則可能會破壞資料完整性。 例如,您可以使用值 NULL 遮罩具有 UNIQUE 約束的列。 由您決定遮罩使用者是否需要資料完整性。
  • 不允許遮罩的角色使用 EXPLAIN。

匿名轉儲

匿名轉儲是指導出資料庫的過程,其中包含匿名或去身分化的資料,而非原始的敏感值。 這通常是為了安全地分享、遷移或分析資料,而不會暴露個人識別資訊 (PII) 或敏感屬性。暴露個人識別資訊 (PII) 或敏感屬性。 如需詳細資訊,請參閱 匿名 資料庫。

啟用匿名轉儲

  1. 安裝 Anonymizer 擴充套件。

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. 初始化匿名器。

    select public.run_anon_init();
    
  3. 為自訂遮罩功能建立專用模式。

     CREATE SCHEMA IF NOT EXISTS <schema_name>;
    
  4. 建立輸出遮罩資料的角色。

     CREATE ROLE <role_name> LOGIN PASSWORD '<enter_password>';
    
  5. 啟用角色遮罩。

    select  public.enable_masking_for_dump('<role_name>','<schema_name>');
    
  6. 定義自訂遮罩函數,如以下範例。

    CREATE OR REPLACE FUNCTION <schema_name>.remove_content(j JSONB)
    RETURNS JSONB
    AS $func$
      SELECT j - ARRAY['content']
    $func$
    LANGUAGE SQL;
    
  7. 建立遮蔽規則。

    SECURITY LABEL FOR anon
      ON COLUMN <table_name>.<column_name>
      IS 'MASKED WITH FUNCTION <schema_name>.<custom_masking_function>()';
    
  8. 將角色標示為遮罩角色。

    SECURITY LABEL FOR anon ON ROLE <schema_name> IS 'MASKED';
    
  9. 授予對遮罩模式的存取權。

    GRANT USAGE ON SCHEMA <schema_name> TO <masked_role>;
    
  10. 授予遮罩資料表的「選取」存取權。

grant select ON <schema_name>.<table_name> to <masked_role>;
  1. 使用 pg_dump 作為遮罩角色匯出遮罩資料。

如需詳細資訊,請參閱 pg dump 指令

若要匯出遮罩資料,請使用遮罩角色執行 pg_dump。 如果 pg_dump 是由 admin 使用者執行,資料會在沒有遮罩的情況下匯出。

一般化

概括化的主要想法是模糊原始資料。 如需詳細資訊,請參閱 概括化

實現概括化

  1. 安裝匿名擴充套件。

    CREATE EXTENSION IF NOT EXISTS anon;
    
  2. 初始化匿名器。

    select public.run_anon_init();
    
  3. 使用概括函數建立檢視。

    CREATE MATERIALIZED VIEW <view_name> AS
    SELECT
        anon.generalize_daterange(<date_column_1>, 'month') AS <generalized_date_1>,
        anon.generalize_daterange(<date_column_2>, 'month') AS <generalized_date_2>
    FROM <source_table>;
    
  4. 宣告間接識別碼。

    SECURITY LABEL FOR k_anonymity
      ON COLUMN <view_name>.<generalized_date_1> IS 'INDIRECT IDENTIFIER';
    
    SECURITY LABEL FOR k_anonymity
      ON COLUMN <view_name>.<generalized_date_2> IS 'INDIRECT IDENTIFIER';
    
  5. 授予 k 匿名存取權。

    select public.k_anonymity();
    
  6. 在檢視或表格上執行 k 匿名性檢查。

    SELECT anon.k_anonymity('<view_name/table_name>');
    

揭開角色的面紗

使用下列指令解除角色的遮罩。

SECURITY LABEL FOR anon ON ROLE <role_name> IS NULL;

停用遮罩規則

使用下列指令停用遮罩角色。

SECURITY LABEL FOR anon
  ON COLUMN <table_name>.<column_name>
  IS NULL;