ismail1432 / database-anonymizer
数据库匿名化工具。
Requires
- php: ^7.1.3
- doctrine/dbal: ^2.6
- fzaninotto/faker: ^1.8
- symfony/console: ^2.0.5|^3.0|^4.0|^5.0
- symfony/dependency-injection: ^4.2|^5.0
Requires (Dev)
- matthiasnoback/symfony-dependency-injection-test: ^3.1
- phpunit/phpunit: ^7.4
- symfony/config: ^4.2|^5.0
- symfony/yaml: ^4.2|^5.0
Suggests
- symfony/config: To configure anonymizer.
- symfony/yaml: To configure anonymizer using yaml files.
README
为什么?
通用数据保护条例 (GDPR) 在信息存储和处理领域强制实施了严格的规则。除非有强烈的必要性,否则您不得处理用户的个人数据。如果您想要将生产数据库导出到开发过程中使用,您不能再在导出的数据库中存储或使用个人数据。在将生产数据库导入到开发环境中之前,您必须删除或匿名化个人信息。
如何操作?
启动我们提供的 数据库匿名化工具 命令,它将用随机但有意义的随机数据替换个人信息。
php bin/database-anonymizer webnet-fr:anonymizer:anonymize <config.yaml> -U<database url>
- 需要指定 <config.yaml> 的路径。查看下一节以了解如何编写配置。
- 提供了许多选项来定义数据库连接。
--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
的路径来指示。也就是说,如果您在<容器中配置的绝对路径>
中使用了/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