PostgreSQL 的数据匿名化与脱敏
PostgreSQL 数据匿名化工具
是一个扩展,用于对 PostgreSQL 数据库中的个人身份信息 (PII) 或商业敏感数据进行脱敏或替换。
该项目采用声明式的脱敏方法。这意味着你可以使用 PostgreSQL 的数据定义语言 (DDL) 声明脱敏规则,并在表定义中指定你的脱敏策略。
该扩展的主要目标是提供设计即匿名化的功能。我们坚信,脱敏规则应该由开发应用程序的人员编写,因为他们最了解数据模型的工作原理。因此,脱敏规则必须直接实现在数据库模式中。
一旦定义了脱敏规则,你可以使用 5 种不同的脱敏方法来应用它们:
每种方法都有其优缺点。不同的脱敏方法可能适用于不同的场景。无论如何,直接在 PostgreSQL 实例中脱敏数据而不使用外部工具,对于限制数据暴露和泄露风险至关重要。
此外,还提供了多种脱敏函数 :随机化、伪造、部分打乱、洗牌、噪声,甚至是你自己的自定义函数!
最后,该扩展还提供了一系列检测函数,用于猜测哪些列需要被匿名化。
快速开始
步骤 0. 启动项目的 Docker 镜像
ANON_IMG=registry.gitlab.com/dalibo/postgresql_anonymizer
docker run --name anon_quickstart --detach -e POSTGRES_PASSWORD=x $ANON_IMG
docker exec -it anon_quickstart psql -U postgres
步骤 1. 创建一个数据库并在其中加载扩展
CREATE DATABASE demo;
ALTER DATABASE demo SET session_preload_libraries = 'anon'
\connect demo
你现在以用户 "postgres" 的身份连接到数据库 "demo"。
步骤 2. 创建一个表
CREATE TABLE people AS
SELECT 153478 AS id,
'Sarah' AS firstname,
'Conor' AS lastname,
'0609110911' AS phone
;
SELECT * FROM people;
id | firstname | lastname | phone
--------+-----------+----------+------------
153478 | Sarah | Conor | 0609110911
步骤 3. 创建扩展并激活脱敏引擎
CREATE EXTENSION anon;
ALTER DATABASE demo SET anon.transparent_dynamic_masking TO true;
步骤 4. 声明一个脱敏用户
CREATE ROLE skynet LOGIN;
SECURITY LABEL FOR anon ON ROLE skynet IS 'MASKED';
GRANT pg_read_all_data to skynet;
步骤 5. 声明脱敏规则
SECURITY LABEL FOR anon ON COLUMN people.lastname
IS 'MASKED WITH FUNCTION anon.dummy_last_name()';
SECURITY LABEL FOR anon ON COLUMN people.phone
IS 'MASKED WITH FUNCTION anon.partial(phone,2,$$******$$,2)';
步骤 6. 使用脱敏用户连接
\connect - skynet
你现在以用户 "skynet" 的身份连接到数据库 "demo"
SELECT * FROM people;
id | firstname | lastname | phone
--------+-----------+-----------+------------
153478 | Sarah | Stranahan | 06******11