elastic/anonymize-it
GitHub: elastic/anonymize-it
一个用于数据匿名化的一般实用工具,解决在分析共享数据时如何安全替换敏感字段的问题。
Stars: 128 | Forks: 22
# anonymize-it
一个用于数据匿名化的一般实用工具
`anonymize-it` 可以作为一个脚本运行,接受一个配置文件,该文件指定了数据源类型、匿名化映射、目标位置以及匿名化管道。也可以将独立的管道组件导入到任何希望匿名化数据的 Python 程序中。
目前,`anonymize-it` 支持两种匿名化方法:
1. 基于 Faker 的方法:依赖 [`Faker`](http://faker.readthedocs.io) 提供的工具对字段进行掩码处理。这种方法适用于一次性匿名化场景,其中不需要关联来自不同来源(索引/集群)的数据。
例如:
```
>>> from faker import Faker
>>> f = Faker()
>>> f.file_path()
'/break/Congress.json'
```
2. 基于哈希的方法:使用唯一的用户/客户 ID 作为盐值来匿名化字段。这种方法适用于需要定期执行数据匿名化,或者跨不同来源的数据关联至关重要的场景。
例如:一个用户希望匿名化存储在两个独立索引中的网络事件和流程事件,但即使在匿名化后仍希望关联特定主机的所有活动。
# 免责声明
`anonymize-it` 旨在作为一个工具,将真实数据值替换为有意义的虚构数据,同时保留数据的语义。它不适用于 GDPR 政策的匿名化要求,而是用于辅助假名化工作。使用 Faker 实现时,在高基数数据集中也可能存在一些冲突。
# 使用说明
## 安装
请在已安装正确依赖项的虚拟环境中运行。这些依赖项列在 `requirements.txt` 中。
### 全局安装 `virtualenv`:
```
[sudo] pip install virtualenv
```
创建虚拟环境并安装 `anonymize-it` 的依赖项:
```
virtualenv -p python3 venv
source venv/bin/activate
pip install -r requirements.txt
```
然后运行:
```
python anonymize.py configs/config.json
```
## 快速启动
下面重现了 `anonymize.py`,以逐步演示一个简单的匿名化管道。
首先加载并解析配置文件。
```
config_file = sys.argv[1]
config = read_config(config_file) # opens json file and stores as python dict
config = utils.parse_config(config) # utility function for parsing configuration and setting variables
```
然后,按照配置中定义的方式创建读取器。`reader_mapping` 用作调度器,将人类可读的读取器类型(例如 elasticsearch)映射到读取器类(例如 `ESReader()`)。
```
reader = reader_mapping[config.source['type']]
reader = reader(config.source['params'], config.masked_fields, config.suppressed_fields)
```
接下来,以相同方式创建写入器。
```
writer = writer_mapping[config.dest['type']]
writer = writer(config.dest['params'])
```
最后,通过传递读取器和写入器实例来创建匿名化器,并运行 `anonymize()`。
### 创建自己的匿名化管道
一个匿名化器需要一个 `reader` 和一个 `writer`。目前仅提供弹性搜索读取器 `readers.ESReader()` 和文件系统写入器 `writers.FSWriter()`。
#### `readers`
创建读取器实例需要以下内容:
* 一个 `source` 对象,包含有关数据源的参数。请注意,每个读取器类需要不同的参数集。请查阅文档字符串以获取具体参数。
* `masked_fields`,这是一个字典,包含应被掩码的字段名称以及用于掩码的 Faker 工具。例如:`{"user.name": "user_name", "user.email": "email"}`
如果使用基于哈希的实现,`masked_fields` simply 是一个字段名称列表。例如:`["user.name", "user.email"]`
* `suppressed_fields`,这是一个不应包含在匿名化中的字段列表。
`masked_fields` 在读取器中是必需的,因为读取器负责枚举每个要匿名化的字段的唯一值,以便在基于 Faker 的匿名化中用作查找掩码值。
`suppressed_fields` 在读取器中也是必需的,因为我们将在搜索查询中明确排除这些字段。
读取器必须实现以下方法:
* `get_data()`,负责从数据源返回数据并传递给匿名化器。
* (如果使用基于 Faker 的匿名化),`create_mappings()`,负责生成一个字典,供匿名化对象使用。该字典结构如下:
{
"field.1": {
"val1.1": None,
"val1.2": None,
...,
"val1.n": None
},
"field.2": {
"val2.1": None,
"val2.2": None,
...,
"val2.m": None
}
}
其中 `field.1` 和 `field.2` 是要匿名化的字段,`val1.1`、`val1.2` 等是每个字段的唯一值。
#### `writers`
创建写入器实例需要以下内容:
* 一个 `dest` 对象,包含有关目标的参数。请注意,每个写入器类需要不同的参数集。请查阅文档字符串以获取具体参数。
写入器必须实现以下方法:
* `write_data()`,负责将匿名化后的数据发送到目标位置。
## 作为脚本运行
#### `anonymizers`
```
python anonymize.py configs/config.json
```
`config.json` 定义了需要完成的工作,请参考 `configs/config.json` 文件中的模板:
* `source` 定义了要匿名化的原始数据位置以及应调用的读取器类型。
* `source.type`:读取器类型,可选值为:
* "elasticsearch"
* "csv"(待实现)
* "json"(待实现)
* `source.params`:允许访问数据的参数,具体取决于读取器类型。
* "elasticsearch":
* `host`
* `index`
* `use_ssl`
* `auth`(可选 "native")
* `dest` 定义了数据应写回的位置
* `dest.type`:写入器类型,可选值为:
* "filesystem"
* "csv"(待实现)
* "elasticsearch"(待实现)
* `dest.params`:允许写入数据的参数,具体取决于写入器类型
* "json":
* `directory`:输出 JSON 文件的目录
* `anonymization`:匿名化类型,即 `faker` 或 `hash`
* `include`:要掩码的字段以及在基于 Faker 的匿名化中使用的掩码方法。这是一个形如 `{"field.name":"faker.provider.mask"}` 的字典。请参考 Faker 文档中的提供者[此处](http://faker.readthedocs.io/en/master/providers.html)。
对于基于哈希的匿名化,这可以是一个要掩码的字段列表,例如 `["field.name"]`。
* `exclude`:要排除的特定字段
* `sensitive`:除掩码字段外,包含敏感信息的字段,这些字段不会被完全替换为伪造/哈希替代值,但会搜索其中的敏感信息
* `include_rest`:`{true|false}`,如果为 true,则写入除排除字段外的所有字段;如果为 false,则仅写入 `masks` 中指定的字段。
### 关于基于 Faker 的匿名化的重要说明
1. 为 `Anonymizer` 类设置 `provider_map` 类属性,该属性是一个字典,包含形如 `{"field.name":self.faker.provider.mask}` 的条目。请参考 `anonymizers.py` 中的测试配置以了解 `provider_map` 的示例。
2. 如果要匿名化的字段具有高基数,请为 `Anonymizer` 类设置 `high_cardinality_fields` 类属性,该属性是一个字典,包含形如 `{"field.name": [self.faker.provider.mask(10) for _ in range(10)]}` 的条目。
### 关于基于哈希的匿名化的重要说明
1. 用户必须拥有 Elastic 环境中的 `monitor` 权限才能运行匿名化。
2. 如果你是云用户并希望执行基于哈希的匿名化,你需要创建一个 API 密钥并在提示时提供它。要创建 API 密钥,请参考[此处](https://www.elastic.co/guide/en/cloud/current/ec-api-authentication.html)的说明。
除了上述设置外,为了更精细地控制匿名化,还可以为 `Anonymizer` 设置以下类属性:
1. `user_regexes`,一个形如 `{"regex.name": "regex"}` 的字典。这些正则表达式用于从 `sensitive` 字段中脱敏 PII(敏感信息已由系统处理)。
2. `keywords`,一个列表,例如 `["keyword1", "keyword2"]`。如果任何 `sensitive` 字段中包含这些关键字中的任何一个,则丢弃相关文档。
# 添加掩码
对于基于 Faker 的匿名化,匿名化类仅知道在 `provider_map` 类属性中列举的工具。如果你希望添加对新 Faker 工具的支持,请在该字典中添加条目。
# 添加读取器
读取器可以添加到 `readers.py` 中,只需扩展基础读取器类并实现所有抽象方法。然后在 `reader_mapping` 中添加新条目。
# 添加写入器
读取器可以添加到 `writers.py` 中,只需扩展基础写入器类并实现所有抽象方法。然后在 `reader_mapping` 中添加新条目。
# 通用说明
https://stackoverflow.com/questions/1486578/how-can-you-bundle-all-your-python-code-into-a-single-zip-file
# 运行测试
要运行单元测试,
1. 创建一个虚拟环境并安装 `requirements.txt` 中的依赖项
2. 在仓库根目录执行 `py.test`
标签:ETL, Faker, GDPR伪匿名化, JavaCC, 哈希匿名化, 数据匿名化, 数据掩码, 数据治理, 数据混淆, 数据脱敏, 数据迁移, 日志脱敏, 用户ID匿名化, 索引数据匿名化, 网络安全, 脚本工具, 逆向工具, 配置文件驱动, 隐私保护