anon

数据匿名化处理工具

概览

扩展包名版本分类许可证语言
pg_anon3.0.13SECPostgreSQLRust
ID扩展名BinLibLoadCreateTrustReloc模式
7070anonanon
相关扩展faker pgsodium pgcrypto pgaudit set_user pg_tde

manually upgraded PGRX from 0.16.1 to 0.17.0 by Vonng

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY3.0.131817161514pg_anon-
RPMPIGSTY3.0.131817161514pg_anon_$v-
DEBPIGSTY3.0.131817161514postgresql-$v-pg-anon-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
u22.x86_64
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
u22.aarch64
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
u24.x86_64
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
u24.aarch64
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13
PIGSTY 3.0.13

构建

您可以使用 pig build 命令构建 pg_anon 扩展的 RPM / DEB 包:

pig build pkg pg_anon         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_anon 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_anon;          # 当前活跃 PG 版本安装
pig ext install -y pg_anon -v 18  # PG 18
pig ext install -y pg_anon -v 17  # PG 17
pig ext install -y pg_anon -v 16  # PG 16
pig ext install -y pg_anon -v 15  # PG 15
pig ext install -y pg_anon -v 14  # PG 14
dnf install -y pg_anon_18       # PG 18
dnf install -y pg_anon_17       # PG 17
dnf install -y pg_anon_16       # PG 16
dnf install -y pg_anon_15       # PG 15
dnf install -y pg_anon_14       # PG 14
apt install -y postgresql-18-pg-anon   # PG 18
apt install -y postgresql-17-pg-anon   # PG 17
apt install -y postgresql-16-pg-anon   # PG 16
apt install -y postgresql-15-pg-anon   # PG 15
apt install -y postgresql-14-pg-anon   # PG 14

预加载配置

shared_preload_libraries = 'anon';

创建扩展

CREATE EXTENSION anon;

用法

来源:overview, static masking, dynamic masking, anonymous dumps, masking functions

anon 通过 SECURITY LABEL FOR anon 以声明式方式定义脱敏规则。官方文档主要围绕三条用户侧流程展开:永久脱敏、masked role,以及匿名导出。

初始化与声明规则

CREATE EXTENSION IF NOT EXISTS anon CASCADE;
SELECT anon.init();

SECURITY LABEL FOR anon ON COLUMN customer.full_name
IS 'MASKED WITH FUNCTION anon.dummy_name()';

SECURITY LABEL FOR anon ON COLUMN customer.employer
IS 'MASKED WITH FUNCTION anon.dummy_company_name()';

SECURITY LABEL FOR anon ON COLUMN customer.phone
IS 'MASKED WITH FUNCTION anon.partial(phone, 2, $$******$$, 2)';

静态脱敏

静态脱敏会直接原地改写已存储的数据:

SELECT anon.anonymize_database();
-- See also: anon.anonymize_table(), anon.anonymize_column()

静态脱敏文档还覆盖了 shuffling、噪声注入,以及面向更大数据集的并行脱敏。

动态脱敏

动态脱敏只会对被标记为 masked 的角色隐藏值:

ALTER DATABASE demo SET session_preload_libraries = 'anon';
ALTER DATABASE demo SET anon.transparent_dynamic_masking TO true;

CREATE ROLE skynet LOGIN;
SECURITY LABEL FOR anon ON ROLE skynet IS 'MASKED';
GRANT pg_read_all_data TO skynet;

SECURITY LABEL FOR anon ON COLUMN people.lastname
IS 'MASKED WITH FUNCTION anon.dummy_last_name()';

skynet 查询该表时,返回的是脱敏值而不是原始值。

匿名导出与假名化

当前文档推荐通过 masked role 配合 pg_dump 进行透明匿名导出。旧的辅助脚本 pg_dump_anon.shpg_dump_anon 已被明确标记为 deprecated。

对于导出中的稳定键重映射,文档特别列出了:

  • anon.pseudo_shift(bigint)
  • anon.pseudo_xor(bigint)
  • anon.set_shift()

常用函数与注意事项

函数目录中常见的 masking helper 包括:

  • anon.dummy_first_name()
  • anon.dummy_last_name()
  • anon.dummy_company_name()
  • anon.random_zip()
  • anon.random_date_between(date, date)
  • anon.partial(value, prefix, mask, suffix)

官方文档中的注意事项:

  • dynamic masking 在 masked-role 会话使用前需要完成 preload 和相关配置
  • static masking 会销毁原始值
  • pseudonymization 不等于 anonymization

最后修改 2026-04-19: update extension stub docs (aa5941a)