开源 Datanymizer:实时模版驱动的数据匿名化
生产系统经常需要存储包括个人可识别信息 (PII) 在内的敏感数据。 对开发人员来说,测试系统中的数据通常要尽可能接近生产系统中的数据。 尽管这一直是最佳做法,但根据数据保护法律制度(如 HIPAA、HITECH、CPRA 和 GDPR),确保只在必要时才保留个人数据,并在将数据传输到其他地方时进行适当的模糊化或匿名化处理变得越来越重要。
弥补这一差距有很多不同的方法,例如在设计时严格区分包含 PII 和不包含 PII 的数据库表 ,允许在导出时忽略 PII 表,并替换为开发系统上的合成数据。 这种方法当然可行,但系统必须遵守这种设计模式,并且合成数据与生产数据必须保持足够的同步,以免出现问题。
另一种方法是在生产系统上生成一种特殊的“净化”转储,其中 PII 已经被模糊化处理或用合成数据替代,开发人员可以随时导入这些数据,从而降低敏感数据离开生产环境的风险。
这就是 Datanymizer 所采取的方法。
伪造器、匿名器和混淆器 — 我们现在有各种免费的和开源的数据匿名工具,这些工具已经存在了很长时间,而且很好用,为什么我们还要创建一个新工具呢? 一种支持全局变量、唯一性约束、内联规则和其他出色功能的工具。
我们希望这一工具能够满足某些特定要求。 我们不希望匿名器进行“原始”转储然后转变。 相反,我们需要提供一个已经匿名化的转储,而无需访问真实数据。 决定真实系统数据如何进行匿名化的配置应该与这些数据相分离。
我们还希望有一个工具能够灵活地处理匿名化问题,最好允许使用模板来填充字段内容。
Enter Datanymizer:一个具有超强适应能力的隐私保护伙伴
Datanymizer 可以完成所有这些工作:您定义一个配置,指定要做什么(和不做什么),然后它会使用您定义的规则从数据库中直接转储数据,它甚至还集成了 Tera 模板引擎,以便合成复杂值。
输出是匿名的 SQL 转储,可以写到文件中或直接写到标准输出中,随时可以通过普通工具将其导入数据库。
开始使用
安装 pg_datanymizer
.有几种方式。 选择一个对您而言比较方便的选项。
预编译的二进制文件:
# Linux / macOS / Windows (MINGW and etc). Installs it into ./bin/ by default
$ curl -sSfL https://raw.githubusercontent.com/datanymizer/datanymizer/main/cli/pg_datanymizer/install.sh | sh -s
# Or more shorter way
$ curl -sSfL https://git.io/pg_datanymizer | sh -s
# Specify installation directory and version
$ curl -sSfL https://git.io/pg_datanymizer | sh -s -- -b usr/local/bin v0.1.0
# Alpine Linux (wget)
$ wget -q -O - https://git.io/pg_datanymizer | sh -s
Homebrew / Linuxbrew:
# Installs the latest stable release
$ brew install datanymizer/tap/pg_datanymizer
# Builds the latest version from the repository
$ brew install --HEAD datanymizer/tap/pg_datanymizer
Docker:
$ docker run --rm -v `pwd`:/app -w /app datanymizer/pg_datanymizer
README 包含了一个您可以用来入门的示例配置。
现在,您可以调用 Datanymizer 来生成一个经过净化的数据转储:
$ pg_datanymizer -f /tmp/dump.sql -c ./config.yml postgres://postgres:postgres@localhost/test_database
它会创建一个新的转储文件 /tmp/dump.sql
其中包含 PostgreSQL 数据库的本机 SQL 转储。 您可以使用以下命令,将此转储中的伪数据导入到新的 PostgreSQL 数据库中。
$ psql -Upostgres -d new_database < /tmp/dump.sql
表筛选器
您可以指定一个绝不应该包含在转储中的表的列表:
仅转储 public.markets
和 public.users
数据。
# config.yml
#...
filter:
only:
- public.markets
- public.users
忽略那些表以及来自其他表的转储数据。
# config.yml
#...
filter:
except:
- public.markets
- public.users
您也可以分别指定数据和架构筛选器。
全局变量
您可以指定任何 template
规则中可用的全局变量。
# config.yml
tables:
users:
bio:
template:
format: "User bio is {{var_a}}"
age:
template:
format: {{_0 * global_multiplicator}}
#...
globals:
var_a: Global variable 1
global_multiplicator: 6
唯一性约束
Datanymizer 包含对某类值的内置支持(“规则”),包括 pipeline
筛选器,该筛选器允许按顺序执行多个规则。 其他筛选器包括 email, ip, words, first_name, last_name, city, phone, capitalize, template, digit, random_number, password, datetime
等。
唯一性约束
唯一性受到 , 和 random_number
规则的支持。
通过跟踪在需要唯一性的地方生成的值,并重新生成列表中的值的重复值,来确保唯一性。
您可以使用 try_count
自定义尝试次数。 这是一个可选字段,默认尝试次数取决于规则。
未来发展
我们计划在不久的将来实现以下附加功能。
- 预筛选:例如,如果不必转储所有用户,而是那些符合特定条件的用户(例如,100 个用户,年龄在 27 岁以上,名为 Alexander),则支持使用任意 SQL 查询进行筛选。
- 数据生成:当您不需要匿名化现有数据,而是根据特定规则生成合成数据时。
RDBMS 支持
Datanymizer 目前支持 PostgreSQL 数据库,对 MySQL(以及 MariaDB)的支持已纳入规划。 当然,我们非常欢迎大家作出贡献!