dragonniers/database-anonymizer

数据库匿名化工具。

0.0.1 2023-01-31 14:38 UTC

This package is not auto-updated.

Last update: 2024-09-25 21:17:19 UTC


README

Build Status codecov Scrutinizer Code Quality

为什么?

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

如何?

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

php bin/database-anonymizer webnet-fr:anonymizer:anonymize <config.yaml> -U<database url>
  • 需要指定到 <config.yaml> 的路径。查看下一节了解如何编写配置。
  • 提供了许多选项来定义数据库连接。
    • --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>

位置

  • <绝对路径到本地配置>
  • <absolute_path_to_config_in_container> 是匿名化程序可访问的配置在容器中的路径。我建议您始终使用 /var/www/anonymizer/config.yaml
  • <database url> 是您数据库的 URL(例如 mysql://user:password@host:port/name)。如果愿意,请检查命令选项,以使用单独的选项传递 hostportuserpassword 值。
  • <path_to_config_in_container><absolute_path_to_config_in_container> 相同,但您可以使用相对于 /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