prowebce/database-anonymizer

数据库匿名化工具。

v0.0.7 2022-06-15 14:02 UTC

This package is auto-updated.

Last update: 2024-09-16 18:36:24 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_local_config>
  • <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