owenmelbz/forget-db

一个简单的GDPR灵感的工具,用于匿名化机密数据库数据。

安装: 19

依赖: 0

建议者: 0

安全: 0

星级: 137

关注者: 4

分支: 7

开放问题: 5

类型:项目

1.0.2 2021-04-16 15:08 UTC

README

Build Status

这是一个简单的(有点)命令行工具,使用PHP 7.4和Laravel Zero以及Faker编写,可以帮助您在数据库中匿名化/假名化数据,以支持保护敏感信息或根据GDPR符合性保护人们的“被遗忘权”。

此工具允许您连接到mysql、postgres、sqlite或sqlserver,并用随机数据替换定义的信息,以允许您保持统计/关系/操作审计等。

它使用一个简单的yaml配置文件来定义覆盖条件,您想覆盖的字段,以及用什么来覆盖它们。

安装

我建议在您的系统上全局安装此工具

composer global require -W owenmelbz/forget-db

或者您可以使用curl安装此工具

curl -L https://github.com/OwenMelbz/forget-db/raw/master/builds/forget-db
chmod +x forget-db
mv ./forget-db /usr/local/bin/forget-db
forget-db update # optional - but will make sure your binary is up to date

配置

要生成一个新的配置,请从任何位置运行 forget-db new

这将引导您生成一个示例配置文件。

这将生成一个基本配置文件,看起来像这样

table_one:
    key: user_id
    conditions: ['where user_id != 1', 'or user_email LIKE "%@%"']
    columns: { user_name: name, user_email: email }
table_two:
    key: user_id
    columns: { user_name: name, user_email: email }
table_three:
    key: user_id
    conditions: 'table_two.user_id = 1'
    joins: 'table_two on table_two.user_id = table_three.table_two_id'
    columns: { user_name: name, user_email: email }

属性

配置文件中的每个顶级项都是一个数据库表,例如 table_one

第一个 必需 属性是 key,这非常重要,因为它定义了用于更新查询的列,并且很可能是唯一的。

第二个 必需 属性是 columns,这是一个列名数组,其值设置为Faker方法,您可以在Faker生成器这里获取完整列表 - 大多数都很容易记住,例如 name, email, company 等。您还可以使用参数化格式化程序,如 regexify

第一个 可选 属性是 conditions,如果需要限制使用,则应是一个包含SQL子句的数组,例如,如果您只需要user_id 1忘记,则可以添加 where user_id = 1。您应该能够有多个条件,这些条件将传递到Laravel的 whereRaw 方法中,因此如果您需要更复杂的查询,请查看那些文档。

第二个 可选 属性是 joins,这可以是一个字符串或包含连接的数组,这些连接将用于伴随条件,它采用以下格式的简单连接查询 joined_table on joined_table.column = other_table.column,您可以使用修饰符系统使用连接类型前缀表,例如 left:tablename on... 这将传递到Laravel的 leftJoin()rightJoin()join() 函数中。

修饰符

最近我们引入了向列定义中添加修饰符的功能,目前只有一个。要使用修饰符,只需在Faker方法前加上 modifier: 即可创建类似于 modifier:email_address 的东西

用法

配置完成后,您可以运行 forget-db forget ./path/to/config.yml。向导将要求您提供连接细节,然后开始清理。如果您在当前工作目录下名为 .env 的文件中指定了数据库连接参数,这些值将被代码自动使用。查看 .env.example 以了解可以通过这种方式配置的设置。请注意,在交互模式下,运行时使用的环境(使用 --env 开关指定)会影响默认值。在非交互模式下,所有是/否问题默认为是,无论环境设置如何。要运行非交互模式,请使用 -n 开关(适用于脚本运行)。

命令完成后,您将看到有关操作成功与否的一些输出(根据需要提供详细的错误消息)。代码在成功时返回 0 退出代码,在失败时返回 1

模拟运行

我们还没有完整的模拟运行系统,但是您可以通过在命令后指定 --dry 参数来预览选择数据集的查询,以及找到的数据表,例如 forget-db forget ./config --dry。这将仅对您的数据库运行“选择”操作,而不会写入任何更改!您将看到类似以下内容:

🧠  forget-db :: 2 rows found to process.
🧠  forget-db :: Query run... select `users`.`id`, `users`.`email`, `users`.`password` from `users`

+----+-------------------------+------------------+
| id | email                   | password         |
+----+-------------------------+------------------+
| 1  | arvel.bradtke@auer.com  | 371817583255573  |
| 2  | remington54@volkman.org | 6011543368953199 |
+----+-------------------------+------------------+

模拟运行限制

  • 它不会显示您运行 forget 后数据将看起来如何
  • 它不会显示将要运行的更新命令

警告 - 进行模拟运行时,请记住它将输出到您的终端,因此如果您正在处理敏感数据,请确保您采取了正确的预防措施!

警告/注意

  • 由于语法和Laravel要求,运行代码需要PHP 7.1+
  • 没有完整的模拟运行支持,我建议您首先在临时数据库上测试此功能,或使用 --dry 参数测试您的条件。
  • 运行此工具的系统必须连接到数据库服务器(可能需要设置相应的防火墙规则和ACL)。
  • 为了保持最佳的服务器兼容性,更新不是批量进行的,而是逐个进行的,因此请确保您了解您的服务器上是否存在任何行/表锁定。
  • 对于大型数据集,模拟运行可能会根据您本地PHP环境中的资源限制而崩溃。在交互模式下,如果需要检索超过50条记录,代码将询问您是否继续。