ismail1432/database-anonymizer

数据库匿名化工具。

v0.0.4 2021-03-04 17:01 UTC

This package is auto-updated.

Last update: 2024-08-29 06:01:41 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>

位置

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