webnet-fr/database-anonymizer

数据库匿名化工具。

v0.0.6 2022-10-19 08:24 UTC

This package is not auto-updated.

Last update: 2024-09-19 22:14:36 UTC


README

Build Status codecov Scrutinizer Code Quality

为什么?

通用数据保护条例 (GDPR) 在信息存储和处理领域强制执行严格规定。除非有强烈的需求,否则您不得处理用户的个人信息。如果您想将生产数据库导出以在开发中使用,您不能在导出的数据库中存储或使用个人数据。您必须在将生产数据库导入开发环境之前删除或匿名化个人信息。

如何?

启动我们的 数据库匿名化工具 提供的命令,它会用随机但有意义的随机数据替换个人信息。

php bin/database-anonymizer webnet-fr:anonymizer:anonymize <config.yaml> -U<database url>
  • 需要指定 的路径。查看下一节了解如何编写配置。
  • 提供了许多选项来定义数据库连接。
    • 使用 --url=<url>-U<url> 定义数据库连接字符串。这是一个非常方便的选项,因为它可以单独定义您的数据库连接。
    • 使用 --type=<type>-t<type> 定义要使用的驱动程序(mysqlmysqlipdo_pgsqlsqlsrv)。
    • 使用 --host=<type>-H<type> 定义数据库主机。
    • 使用 --port=<port>-P<port> 定义数据库服务器的端口。
    • 使用 --database=<name>-d<name> 定义数据库服务器的主机名。
    • 使用 --user=<username>-u<username> 定义访问数据库服务器的用户名。
    • 使用 --password=<pass>-p<pass> 定义访问数据库服务器的密码。

如何安装?

提供了两种选项。

  1. 如果您正在开发一个 PHP 项目,您可以添加一个依赖项(也许带有 --dev 选项)。
composer require webnet-fr/database-anonymizer
  1. 如果您不使用 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> 选项来指定数据库连接。

有哪些生成器可用?

开箱即用,有两种类型的生成器可用。

  1. 常量生成器
webnet_fr_database_anonymizer:
    tables:
        <table name>:
            fields:
                password:
                    generator: constant # specify "constant" generator
                    value: pass123      # all rows will be set to "pass123"
  1. 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 - 任何可用提供者中的可用格式化工具。例如,randomDigitnameemailcpr(仅限 da_DK 区域设置)。
  • locale - Faker 中的任何可用区域设置。请注意,某些格式化工具仅适用于特定区域设置。例如,cs_CZda_DKru_RU
  • unique - 确保在当前字段的作用域内生成的每个值都是唯一的。这对于生成用户名很有用。注意溢出异常。
  • optional - 以一定几率生成的值将是 null。当您设置 optional: 0.4 时,您有 40% 的机会随机生成有意义的价值,60% 的机会为 null。
  • date_format - 如果生成的值是 DateTime 对象,您必须指定一个格式。这适用于这些格式化工具:dateTimeBetweendateTimeInIntervaldateTimeThisYear 等。例如,Y-m-dY-m-d H:i:s 或适用于 php date() 函数 的任何有效格式。

截断表

您可以指定要截断的表

webnet_fr_database_anonymizer:
    tables:
        <table name>:
            truncate: true

请注意,在截断表时,外键约束被禁用。您可能会遇到外键不一致的问题。

在 Docker 容器中启动匿名化器

然后利用 Docker 的优势。

  1. 安装 Docker

  2. docker/Dockerfile 放在空文件夹中。删除不必要的扩展安装(MySQL、PostgreSQL、SQL Server)以加快 Docker 构建速度。

  3. config.yaml 中创建匿名化器配置。

  4. 构建镜像。

docker build -t webnetfr/anonymizer .
  1. 运行匿名化。
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)。如果您更喜欢将 hostportuserpassword 值分别通过选项传递,请查看命令选项。
  • <容器中配置的路径><容器中配置的绝对路径> 相同,但您可以用相对于 /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