IBM Cloud Docs
使用 PostgreSQL 匿名程序屏蔽数据

使用 PostgreSQL 匿名程序屏蔽数据

Databases for PostgreSQL Anonymizer 是一个 扩展,旨在通过掩盖或替换 数据库中的个人身份信息和敏感业务信息来实现数据匿名化。PostgreSQL Databases for PostgreSQL

扩展支持以下屏蔽策略,每种策略都适用于不同的使用情况:

  • 静态屏蔽:根据规则删除 PII。
  • 动态屏蔽:只隐藏被屏蔽用户的 PII。
  • 匿名转储:只需将屏蔽数据导出到 SQL 文件中即可。
  • 概括化:以更宽泛、不太精确的类别或范围取代具体数值。

静态屏蔽

静态屏蔽是一种数据匿名化技术,它以人工合成的格式保存值不可逆地取代敏感信息、格式保存值。 这一过程可确保完全永久删除原始数据,从而消除 重新识别或重建的可能性。 更多信息,请参阅 静态屏蔽

启用静态屏蔽

  1. 安装匿名者扩展。

    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. 安装匿名者扩展。

    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) 或敏感属性的情况下安全地共享、迁移或分析数据。 更多信息,请参阅 匿名转储

启用匿名转储

  1. 安装匿名者扩展。

    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 由管理员用户执行,导出的数据将不带掩码。

泛化

泛化的主要思路是模糊原始数据。 更多信息,请参阅“ 泛化”。

促进普遍化

  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;