从您的Elasticsearch索引和可搜索快照中删除字段数据
项目描述
Elasticsearch PII工具
你在Elasticsearch索引中找到了不属于那里的PII(个人可识别信息)吗?这是你的工具!
es-pii-tool
可以帮助你从甚至可搜索快照挂载的索引中删除信息。它还可以处理深层嵌套的字段!
客户端配置
该工具通过es_client
Python模块进行连接。
你可以使用命令行选项或YAML配置文件来配置客户端连接。如果需要使用配置文件,则配置文件结构需要在顶层包含elasticsearch
,如下所示
---
elasticsearch:
client:
hosts: https://10.11.12.13:9200
cloud_id:
request_timeout: 60
verify_certs:
ca_certs:
client_cert:
client_key:
other_settings:
username:
password:
api_key:
id:
api_key:
token:
logging:
loglevel: INFO
logfile: /path/to/file.log
logformat: default
blacklist: []
REDACTIONS_FILE
配置
---
redactions:
- job_name_20240930_redact_hot:
pattern: hot-*
query: {'match': {'message': 'message1'}}
fields: ['message']
message: REDACTED
expected_docs: 1
restore_settings: {'index.routing.allocation.include._tier_preference': 'data_warm,data_hot,data_content'}
- job_name_20240930_redact_cold:
pattern: restored-cold-*
query: {'match': {'nested.key': 'nested19'}}
fields: ['nested.key']
message: REDACTED
expected_docs: 1
restore_settings: {'index.routing.allocation.include._tier_preference': 'data_warm,data_hot,data_content'}
forcemerge:
max_num_segments: 1
- job_name_20240930_redact_frozen:
pattern: partial-frozen-*
query: {'range': {'number': {'gte': 8, 'lte': 11}}}
fields: ['deep.l1.l2.l3']
message: REDACTED
expected_docs: 4
forcemerge:
only_expunge_deletes: True
作业名称
作业名称必须是唯一的。在跟踪索引中跟踪删除作业的进度,默认名称为redactions-tracker
。如果作业进度因任何原因中断,则es-pii-tool
将尝试从上次中断的地方继续。
pattern
“pattern”设置定义了将搜索哪些索引中的文档进行编辑。这可以是Elasticsearch支持的任何内容,包括通配符globbing和逗号分隔的值。
查询
用于隔离要编辑的文档的Elasticsearch查询。这应该以Elasticsearch Query DSL格式。
字段
要编辑的字段。如果字段不在文档的根级别,可以使用点表示法引用深层嵌套的对象。
这是一个数组值,因此可以指定多行。
注意:所有要编辑的文档都必须具有在fields
数组中定义的所有字段,否则将产生错误条件。
消息
此值将替换在fields
指定的每个字段中的内容。默认值为REDACTED
。可以是任何字符串值。目前不支持部分或子字符串替换。
预期文档数
这必须与执行query
产生的确切命中数相匹配。
注意:此值不能超过10,000。这是Elasticsearch强加的最大结果数量的默认限制。如果您的查询产生超过10,000个命中,并且所有这些都需要被编辑,建议您找到一些其他限制条件或过滤器来将总命中数降低到10,000以下。
恢复设置
从cold
或frozen
层级的索引中编辑数据之前,必须首先从快照存储库完全恢复它们。如果您想将这些要恢复的索引应用任何特定设置,请在此处设置。
restore_settings
的主要用例是强制索引恢复到data_warm
层或某些其他目标数据节点,但也可以用于应用任何其他所需的设置。
强制合并
这仅用于编辑cold
或frozen
层级的可搜索快照索引。最佳实践是在将索引快照并挂载到cold
或frozen
层之前,将索引强制合并到每个分片1个段。此工具默认在编辑数据后执行此强制合并。但您可以设置强制合并为only_expunge_deletes
。
在Elasticsearch中,一旦索引了一个文档,该文档就是不可变的。为了编辑一个文档,Elasticsearch实际上删除了原始文档,并在其位置重新索引修改后的文档。
最大段数
此设置的默认值为1
,表示每个分片1个段。这在磁盘I/O方面是一个相对“昂贵”的操作,如果您只从索引或分片中删除少量文档,那么执行完整强制合并可能没有太多意义。为了避免这种情况,请使用only_expunge_deletes
设置。
仅清除删除
这是一个布尔设置,可以是true
或false
(或True
或False
)。
如果true
,强制合并将仅删除标记为删除的位,即作为编辑过程的一部分删除的原始文档。
运行es_pii_tool
命令行执行
通过在命令行中执行pii-tool
来运行此脚本。对于pii-tool
有多个配置级别。顶级是为客户端连接到Elasticsearch配置。
后续命令包括show-all-options
和file-based
(意味着从YAML配置文件派生的编辑配置)。
客户端配置
pii-tool --help
Usage: pii-tool [OPTIONS] COMMAND [ARGS]...
Elastic PII Tool
Options:
--config PATH Path to configuration file.
--hosts TEXT Elasticsearch URL to connect to.
--cloud_id TEXT Elastic Cloud instance id
--api_token TEXT The base64 encoded API Key token
--id TEXT API Key "id" value
--api_key TEXT API Key "api_key" value
--username TEXT Elasticsearch username
--password TEXT Elasticsearch password
--request_timeout FLOAT Request timeout in seconds
--verify_certs / --no-verify_certs
Verify SSL/TLS certificate(s)
--ca_certs TEXT Path to CA certificate file or directory
--client_cert TEXT Path to client certificate file
--client_key TEXT Path to client key file
--loglevel [DEBUG|INFO|WARNING|ERROR|CRITICAL]
Log level
--logfile TEXT Log file
--logformat [default|json|ecs] Log output format
-v, --version Show the version and exit.
-h, --help Show this message and exit.
Commands:
file-based Redact from YAML config file
show-all-options Show all client configuration options
显示所有选项
由于仅客户端连接的配置选项列表相当长,默认的--help
输出被截断了一些。您可以通过运行pii-tool show-all-options
来显示所有配置选项,以及显示它们的环境变量名称。
Usage: pii-tool show-all-options [OPTIONS]
ALL OPTIONS SHOWN
The full list of options available for configuring a connection at the command-line.
Options:
--config PATH Path to configuration file. [env var: ESCLIENT_CONFIG]
--hosts TEXT Elasticsearch URL to connect to. [env var: ESCLIENT_HOSTS]
--cloud_id TEXT Elastic Cloud instance id [env var: ESCLIENT_CLOUD_ID]
--api_token TEXT The base64 encoded API Key token [env var: ESCLIENT_API_TOKEN]
--id TEXT API Key "id" value [env var: ESCLIENT_ID]
--api_key TEXT API Key "api_key" value [env var: ESCLIENT_API_KEY]
--username TEXT Elasticsearch username [env var: ESCLIENT_USERNAME]
--password TEXT Elasticsearch password [env var: ESCLIENT_PASSWORD]
--bearer_auth TEXT Bearer authentication token [env var: ESCLIENT_BEARER_AUTH]
--opaque_id TEXT X-Opaque-Id HTTP header value [env var: ESCLIENT_OPAQUE_ID]
--request_timeout FLOAT Request timeout in seconds [env var: ESCLIENT_REQUEST_TIMEOUT]
--http_compress / --no-http_compress
Enable HTTP compression [env var: ESCLIENT_HTTP_COMPRESS]
--verify_certs / --no-verify_certs
Verify SSL/TLS certificate(s) [env var: ESCLIENT_VERIFY_CERTS]
--ca_certs TEXT Path to CA certificate file or directory [env var: ESCLIENT_CA_CERTS]
--client_cert TEXT Path to client certificate file [env var: ESCLIENT_CLIENT_CERT]
--client_key TEXT Path to client key file [env var: ESCLIENT_CLIENT_KEY]
--ssl_assert_hostname TEXT Hostname or IP address to verify on the node's certificate. [env var:
ESCLIENT_SSL_ASSERT_HOSTNAME]
--ssl_assert_fingerprint TEXT SHA-256 fingerprint of the node's certificate. If this value is given then root-of-trust
verification isn't done and only the node's certificate fingerprint is verified. [env var:
ESCLIENT_SSL_ASSERT_FINGERPRINT]
--ssl_version TEXT Minimum acceptable TLS/SSL version [env var: ESCLIENT_SSL_VERSION]
--master-only / --no-master-only
Only run if the single host provided is the elected master [env var: ESCLIENT_MASTER_ONLY]
--skip_version_test / --no-skip_version_test
Elasticsearch version compatibility check [env var: ESCLIENT_SKIP_VERSION_TEST]
--loglevel [DEBUG|INFO|WARNING|ERROR|CRITICAL]
Log level [env var: ESCLIENT_LOGLEVEL]
--logfile TEXT Log file [env var: ESCLIENT_LOGFILE]
--logformat [default|json|ecs] Log output format [env var: ESCLIENT_LOGFORMAT]
--blacklist TEXT Named entities will not be logged [env var: ESCLIENT_BLACKLIST]
-h, --help Show this message and exit.
您会注意到,在这次查看中,每个选项都有一个env var: ESCLIENT_
。
环境变量
如果已设置为环境变量,则不需要设置相关的命令行标志。
例如,如果我在/path/to/config.yaml
有一个客户端配置YAML文件,并且设置了ESCLIENT_CONFIG
环境变量,例如。
export ESCLIENT_CONFIG=/path/to/config.yaml
然后我可以执行pii-tool
而无需在命令行中使用--config /path/to/config.yaml
标志。
这对于基于Docker的执行非常有用!
在es_client
文档中了解更多信息。
基于文件
file-based
子命令是在设置客户端连接参数后使用的。
$ pii-tool file-based --help
Usage: run_script.py file-based [OPTIONS] REDACTIONS_FILE
Redact from YAML config file
Options:
--dry-run Do not perform any changes. [env var: PII_TOOL_DRY_RUN]
--tracking-index TEXT Name for the tracking index. [env var: PII_TOOL_TRACKING_INDEX; default: redactions-tracker]
-h, --help Show this message and exit.
您会注意到这里也有环境变量!
Docker执行
Docker镜像需要将容器中的/.config
映射到卷(目前是这样)。
配置文件应该放在这里,包括客户端YAML文件和用于file-based
命令的编辑文件。
假设您在$(pwd)
有一个名为REDACTIONS_FILE.yaml
的文件
docker run \
--rm \ # Remove the container after execution
-it \ # Not strictly necessary, but helpful as it is an interactive terminal
-v $(pwd)/:/.config \ # Map the present-working directory to /.config
untergeek/es-pii-tool:${TAG} \
--hosts https://127.0.0.1:9200 \
--username USERNAME \
--password HIDDEN \
file-based /.config/REDACTIONS_FILE.yaml
所有命令行标志都可以使用。但还有更好的方法...
环境变量
如前所述,环境变量可以使Docker和Kubernetes中的事情变得非常简单。
docker run \
--rm \ # Remove the container after execution
-it \ # Not strictly necessary, but helpful as it is an interactive terminal
-v $(pwd)/:/.config \ # Map the present-working directory to /.config
-e ESCLIENT_HOSTS=${ESCLIENT_HOSTS} \
-e ESCLIENT_USERNAME=${ESCLIENT_USERNAME} \
-e ESCLIENT_PASSWORD=${ESCLIENT_PASSWORD} \
untergeek/es-pii-tool:0.9.0 file-based /.config/REDACTIONS_FILE.yaml
测试
docker_test
目录
希望您永远不需要修改这里的内容。为了运行本地测试,您真的应该在本地运行Docker,或者至少能够访问它。
如果不能,您应该计划导出以下环境变量
TEST_ES_SERVER
应设置为您Elasticsearch集群的完整URLTEST_USER
Elasticsearch测试用户名TEST_PASS
TEST_USER
的Elasticsearch密码CA_CRT
可选,如果您的集群由已知的签名者签名TEST_ES_REPO
TEST_ES_SERVER
上的存储库名称
每个都应该放在项目根目录的.env
中,前面有export
,例如。
export TEST_ES_SERVER=https://127.0.0.1:9200
...
为什么在.env
中?因为pytest
会在这里查找它。
您的测试集群还需要至少一个Trial X-Pack许可证,因为可搜索快照需要这个许可证。
现在,如果这听起来有点令人望而却步,它确实是。docker_test
脚本为您自动化了这一切。
手动设置
docker_test/create.sh VERSION [SCENARIO]
VERSION
需要是docker.elastic.co/elasticsearch/elasticsearch
上认可的形象标记。
SCENARIO
在技术上不是必需的,但对于本项目来说不是必需的。
为了测试从frozen
层检索编辑,您至少需要有一个data_frozen
节点。能够做到这一点的场景是frozen_node
,例如。
$ docker_test/create.sh 8.15.1 frozen_node
Using scenario: frozen_node
Using Elasticsearch version 8.15.1
Creating 2 node(s)...
Starting node 1...
Container ID: ecf1e6d45bbc8d0617f75f47101372fd723a1424b27f7c250d1c7553f096960c
Getting Elasticsearch credentials from container es-pii-tool-test-0...
- 18s elapsed (typically 15s - 25s)...
Trial license started...
Snapshot repository initialized...
Node 1 started.
Node 2 started.
All nodes ready to test!
Environment variables are in .env
该脚本将创建第一个节点,并收集在创建过程中创建的凭据。然后它将启动X-Pack试用许可证并初始化快照存储库。然后在同一子网中,它将启动另一个节点,具有node_role: ["data_frozen"]
。实际上,它创建的就是测试pii_tool
所需的一切。
注意:两个节点启动和运行可能需要20到30秒。脚本在等待并尝试捕获凭据时运行一个漂亮的旋转器,以便您可以查看它是否在工作。之后应该会很快完成。
手动拆卸
$ docker_test/destroy.sh
Stopping all containers...
Removing all containers...
Deleting remaining files and directories
Cleanup complete.
这会清理所有容器、env var文件和用作共享文件系统快照存储库的“repo”目录。不需要额外的标志。
测试
由于docker_test
对测试es-pii-tool
如此重要,因此努力使Docker容器的设置和拆卸自动化。
$ pytest --docker_create true --docker_destroy true
如果省略了--docker_create true
和/或--docker_destroy true
,测试将假定您已经有了功能齐全的测试环境,并且环境变量已经在.env
中配置。
输出如下所示
$ pytest --docker_create true --docker_destroy true
Running: "/Users/buh/WORK/es-pii-tool/docker_test/create.sh 8.15.1 frozen_node"
Using scenario: frozen_node
Using Elasticsearch version 8.15.1
Creating 2 node(s)...
Starting node 1...
Container ID: f4e006bc94cdc8fa0977d9ab5bae509250f6d5fd2e0b8de6a3bbc994c2ee684a
Getting Elasticsearch credentials from container es-pii-tool-test-0...
- 18s elapsed (typically 15s - 25s)...
Trial license started...
Snapshot repository initialized...
Node 1 started.
Node 2 started.
All nodes ready to test!
Environment variables are in .env[-shell]
===================================================== test session starts =====================================================
platform darwin -- Python 3.12.2, pytest-8.1.1, pluggy-1.5.0
rootdir: /Users/buh/WORK/es-pii-tool
configfile: pytest.ini
plugins: cov-5.0.0, anyio-4.3.0, returns-0.22.0
collected 70 items
tests/integration/test_cold.py ......................... [ 35%]
tests/integration/test_frozen.py ......................... [ 71%]
tests/integration/test_hot.py .................... [100%]
-- docker_test environment destroyed.
=============================================== 70 passed in 148.31s (0:02:28) ================================================
测试期间的错误
虽然不常见,但偶尔一个测试会挂起。虽然这可能是由于多种原因,但常见的原因是Docker无法正确访问资源,并且进程超时。
如果发生这种情况,很可能它看起来像其他测试失败了。这是因为主要的测试场景在3个索引的一系列中运行了4次通过。根据情况,其中2个索引可能是冻结的、冷的、数据流的一部分等。
如果测试超时,不要慌张。您需要手动使用docker_test/destroy.sh
销毁Docker环境,因为测试环境默认不销毁测试环境,这样您就可以在必要时检查它。
完成此操作后,重新运行测试。如果它反复失败,那么可能还有其他问题。这也是为什么能够检查在Docker中未自动销毁的Elasticsearch环境是一个好事。
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
es_pii_tool-0.9.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0e1b15e21fce2f012289bbf531760ea4d32c154bdb445a82b08a1759981e9b06 |
|
MD5 | 455a1d4c70685945fdcc7d7cc9937025 |
|
BLAKE2b-256 | e0545014f2eaf933c0433f8f3326da747ea1bc7ede6c42fb47cc432f8b67f7bb |
es_pii_tool-0.9.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2afd7d961b25d1b0037712f440cf6e52abe95c94dfdd26cd457999da8296dc09 |
|
MD5 | 8a4b350d14d85e63ee298c4c8f404b01 |
|
BLAKE2b-256 | 226ff9d4598b3704334fdf7c374f6ca5e1f79176af5fbb1b56a0c8c1c3ceebe3 |