webnet-fr / database-anonymizer
数据库匿名化工具。
Requires
- php: ^7.1.3 || ^8.0
- doctrine/dbal: ^2.6 || ^3.0
- fakerphp/faker: ^1.15
- symfony/console: ^2.0.5|^3.0|^4.0|^5.0|^6.0
- symfony/dependency-injection: ^4.2|^5.0|^6.0
Requires (Dev)
- matthiasnoback/symfony-dependency-injection-test: ^3.1
- phpunit/phpunit: ^7.4
- symfony/config: ^4.2|^5.0|^6.0
- symfony/yaml: ^4.2|^5.0|^6.0
Suggests
- symfony/config: To configure anonymizer.
- symfony/yaml: To configure anonymizer using yaml files.
This package is not auto-updated.
Last update: 2024-09-19 22:14:36 UTC
README
为什么?
通用数据保护条例 (GDPR) 在信息存储和处理领域强制执行严格规定。除非有强烈的需求,否则您不得处理用户的个人信息。如果您想将生产数据库导出以在开发中使用,您不能在导出的数据库中存储或使用个人数据。您必须在将生产数据库导入开发环境之前删除或匿名化个人信息。
如何?
启动我们的 数据库匿名化工具 提供的命令,它会用随机但有意义的随机数据替换个人信息。
php bin/database-anonymizer webnet-fr:anonymizer:anonymize <config.yaml> -U<database url>
- 需要指定
的路径。查看下一节了解如何编写配置。 - 提供了许多选项来定义数据库连接。
- 使用
--url=<url>
或-U<url>
定义数据库连接字符串。这是一个非常方便的选项,因为它可以单独定义您的数据库连接。 - 使用
--type=<type>
或-t<type>
定义要使用的驱动程序(mysql
、mysqli
、pdo_pgsql
、sqlsrv
)。 - 使用
--host=<type>
或-H<type>
定义数据库主机。 - 使用
--port=<port>
或-P<port>
定义数据库服务器的端口。 - 使用
--database=<name>
或-d<name>
定义数据库服务器的主机名。 - 使用
--user=<username>
或-u<username>
定义访问数据库服务器的用户名。 - 使用
--password=<pass>
或-p<pass>
定义访问数据库服务器的密码。
- 使用
如何安装?
提供了两种选项。
- 如果您正在开发一个 PHP 项目,您可以添加一个依赖项(也许带有
--dev
选项)。
composer require webnet-fr/database-anonymizer
- 如果您不使用 PHP 或出于任何其他原因,请使用 Docker。
如何配置要匿名化的字段?
好处是您可以指定要匿名化的字段以及它们如何被匿名化。
webnet_fr_database_anonymizer: # required part of configuration
tables:
users: # table name
primary_key: [id] # indicate primary key
fields:
email: # field's name to anonymize
generator: faker # chose a generator
formatter: email # chose one of dozens of the faker's formatters
unique: ~ # assure that the random value will be unique
name: # another field to anonymize
generator: faker # generator
formatter: name # formatter
arguments: ['female'] # specify the arguemnts to pass to the formatter
primary_key
条目是可选的,可以自动推断。您可以指定一个复合主键或任何具有唯一非空值的列。
让匿名化工具猜测配置
虽然配置您的所有数据库表可能很繁琐,但我们提供了一种猜测工具。猜测命令可以自动构建配置。
php bin/database-anonymizer webnet-fr:anonymizer:guess-config -f<file.yaml> -U<database url>
猜测工具会检查您的数据库中所有表的所有列,寻找可能包含敏感个人信息(如姓名、出生日期、社会保险号码等)的列。
您可以将以下参数和选项传递给猜测命令
- 使用
--file=<file.yaml>
或-F=<file.yaml>
将配置写入文件。否则,配置将输出到您的控制台。 - 您可以使用
-U<url>
、-t<type>
、-H<type>
、-P<port>
、-d<name>
、-u<username>
、-p<pass>
选项来指定数据库连接。
有哪些生成器可用?
开箱即用,有两种类型的生成器可用。
webnet_fr_database_anonymizer: tables: <table name>: fields: password: generator: constant # specify "constant" generator value: pass123 # all rows will be set to "pass123"
- Faker 的生成器。此工具使用
fzaninotto/faker
库。匿名化器允许您使用 Faker 提供的所有格式化工具。我们邀请您查看它们。以下是一些示例:
webnet_fr_database_anonymizer: tables: <table name>: fields: # Set "birthdate" field to a random date in a range from -100 to -18 years. birthdate: generator: faker formatter: dateTimeBetween arguments: ['-100 years', '-18 year'] date_format: Y-m-d optional: 0.4 # Set "numero_ss" field to a random number of the french sécurité sociale. # Pay attention that "nir" formatter is available only with french locale. numero_ss: generator: faker formatter: nir locale: fr_FR # Set "tax_code" field to a random tax code for russian company. # Pay attention that "kpp" formatter is available only with russian locale. tax_code: generator: faker formatter: kpp locale: ru_RU unique: ~
对于每个 Faker 生成器,您可以指定以下选项:
formatter
- 任何可用提供者中的可用格式化工具。例如,randomDigit
、name
、email
、cpr
(仅限da_DK
区域设置)。locale
- Faker 中的任何可用区域设置。请注意,某些格式化工具仅适用于特定区域设置。例如,cs_CZ
、da_DK
、ru_RU
。unique
- 确保在当前字段的作用域内生成的每个值都是唯一的。这对于生成用户名很有用。注意溢出异常。optional
- 以一定几率生成的值将是 null。当您设置optional: 0.4
时,您有 40% 的机会随机生成有意义的价值,60% 的机会为 null。date_format
- 如果生成的值是DateTime
对象,您必须指定一个格式。这适用于这些格式化工具:dateTimeBetween
、dateTimeInInterval
、dateTimeThisYear
等。例如,Y-m-d
、Y-m-d H:i:s
或适用于 php date() 函数 的任何有效格式。
截断表
您可以指定要截断的表
webnet_fr_database_anonymizer: tables: <table name>: truncate: true
请注意,在截断表时,外键约束被禁用。您可能会遇到外键不一致的问题。
在 Docker 容器中启动匿名化器
然后利用 Docker 的优势。
-
安装 Docker。
-
将 docker/Dockerfile 放在空文件夹中。删除不必要的扩展安装(MySQL、PostgreSQL、SQL Server)以加快 Docker 构建速度。
-
在
config.yaml
中创建匿名化器配置。 -
构建镜像。
docker build -t webnetfr/anonymizer .
- 运行匿名化。
docker run --volume <absolute_path_to_local_config>:<absolute_path_to_config_in_container> \
webnetfr/anonymizer \
php vendor/bin/database-anonymizer --no-interaction --url <database url> <path_to_config_in_container>
位置
<本地配置的绝对路径>
<容器中配置的绝对路径>
是匿名化器可访问的配置路径。我建议您始终使用/var/www/anonymizer/config.yaml
<数据库 URL>
是您的数据库的 URL(例如mysql://user:password@host:port/name
)。如果您更喜欢将host
、port
、user
、password
值分别通过选项传递,请查看命令选项。<容器中配置的路径>
与<容器中配置的绝对路径>
相同,但您可以用相对于/var/www/anonymizer
的路径表示。换句话说,如果您在<absolute_path_to_config_in_container>
中使用了/var/www/anonymizer/config.yaml
,那么您只需简单地将config.yaml
放置在旁边即可。
假设您将 docker/Dockerfile 下载到空文件夹中,并在其旁边创建了 conf.yml
。您的命令可能是:
docker run --volume $(pwd)/conf.yaml:/var/www/anonymizer/config.yaml \
webnetfr/anonymizer \
php vendor/bin/database-anonymizer -n -Umysql://root:pass@localhost/db config.yaml
提示:查看 Docker 提供的丰富选项。例如,您可能添加 --net=host
选项以与容器共享您的机器的网络。
提示:您可以使用此命令运行并连接到容器
docker run --volume $(pwd)/conf.yaml:/var/www/anonymizer/config.yaml -it \
webnetfr/anonymizer bash