Redact processor
Redactプロセッサは、Grokルールエンジンを使用して、指定されたGrokパターンに一致する入力ドキュメント内のテキストを隠します。このプロセッサは、メールアドレスやIPアドレスなどの既知のパターンを検出するように設定することで、個人識別情報(PII)を隠すために使用できます。Grokパターンに一致するテキストは、メールアドレスが一致した場合は<EMAIL>
のような設定可能な文字列に置き換えられるか、好ましい場合はすべての一致を<REDACTED>
というテキストに単純に置き換えます。
Elasticsearchには、Redactプロセッサが便利に参照できるいくつかの有用な事前定義されたパターンがパッケージされています。それらのいずれかがニーズに合わない場合は、カスタムパターン定義を使用して新しいパターンを作成します。Redactプロセッサは、一致のすべての発生を置き換えます。複数の一致がある場合、すべてがパターン名で置き換えられます。
Redactプロセッサは、Elastic Common Schema (ECS)パターンと互換性があります。レガシーGrokパターンはサポートされていません。
Using the Redact processor in a pipeline
名前 | 必須 | デフォルト | 説明 |
---|---|---|---|
field |
はい | - | 隠すフィールド |
patterns |
はい | - | 一致して隠す名前付きキャプチャのためのgrok式のリスト |
pattern_definitions |
いいえ | - | プロセッサによって使用されるカスタムパターンを定義するパターン名とパターンのタプルのマップ。既存の名前に一致するパターンは、既存の定義を上書きします |
prefix |
いいえ | \< | このトークンで隠されたセクションを開始 |
suffix |
いいえ | > | このトークンで隠されたセクションを終了 |
ignore_missing |
いいえ | true |
true およびfield が存在しないかnull の場合、プロセッサはドキュメントを変更せずに静かに終了します |
description |
いいえ | - | プロセッサの説明。プロセッサの目的や設定を説明するのに便利です。 |
if |
いいえ | - | プロセッサを条件付きで実行します。プロセッサを条件付きで実行するを参照してください。 |
ignore_failure |
いいえ | false |
プロセッサの失敗を無視します。パイプラインの失敗を処理するを参照してください。 |
on_failure |
いいえ | - | プロセッサの失敗を処理します。パイプラインの失敗を処理するを参照してください。 |
tag |
いいえ | - | プロセッサの識別子。デバッグやメトリクスに便利です。 |
skip_if_unlicensed |
いいえ | false |
true および現在のライセンスがRedactプロセッサの実行をサポートしていない場合、プロセッサはドキュメントを変更せずに静かに終了します。 |
この例では、事前定義されたIP
Grokパターンを使用して、message
テキストフィールドからIPアドレスを一致させて隠します。パイプラインは、シミュレートAPIを使用してテストされます。
Python
resp = client.ingest.simulate(
pipeline={
"description": "Hide my IP",
"processors": [
{
"redact": {
"field": "message",
"patterns": [
"%{IP:client}"
]
}
}
]
},
docs=[
{
"_source": {
"message": "55.3.244.1 GET /index.html 15824 0.043"
}
}
],
)
print(resp)
Ruby
response = client.ingest.simulate(
body: {
pipeline: {
description: 'Hide my IP',
processors: [
{
redact: {
field: 'message',
patterns: [
'%{IP:client}'
]
}
}
]
},
docs: [
{
_source: {
message: '55.3.244.1 GET /index.html 15824 0.043'
}
}
]
}
)
puts response
Js
const response = await client.ingest.simulate({
pipeline: {
description: "Hide my IP",
processors: [
{
redact: {
field: "message",
patterns: ["%{IP:client}"],
},
},
],
},
docs: [
{
_source: {
message: "55.3.244.1 GET /index.html 15824 0.043",
},
},
],
});
console.log(response);
Console
POST _ingest/pipeline/_simulate
{
"pipeline": {
"description" : "Hide my IP",
"processors": [
{
"redact": {
"field": "message",
"patterns": ["%{IP:client}"]
}
}
]
},
"docs":[
{
"_source": {
"message": "55.3.244.1 GET /index.html 15824 0.043"
}
}
]
}
レスポンス内のドキュメントにはmessage
フィールドがまだ含まれていますが、今度はIPアドレス55.3.244.1
が<client>
というテキストに置き換えられています。
Console-Result
{
"docs": [
{
"doc": {
"_index": "_index",
"_id": "_id",
"_version": "-3",
"_source": {
"message": "<client> GET /index.html 15824 0.043"
},
"_ingest": {
"timestamp": "2023-02-01T16:08:39.419056008Z"
}
}
}
]
}
IPアドレスは、Grokパターン%{IP:client}
で指定されているため、client
という単語に置き換えられます。パターン名を囲む<
および>
トークンは、prefix
およびsuffix
オプションを使用して設定可能です。
次の例では、両方の複数のパターンがREDACTED
という単語に置き換えられ、接頭辞および接尾辞トークンが*
に設定されています。
Python
resp = client.ingest.simulate(
pipeline={
"description": "Hide my IP",
"processors": [
{
"redact": {
"field": "message",
"patterns": [
"%{IP:REDACTED}",
"%{EMAILADDRESS:REDACTED}"
],
"prefix": "*",
"suffix": "*"
}
}
]
},
docs=[
{
"_source": {
"message": "55.3.244.1 GET /index.html 15824 0.043 [email protected]"
}
}
],
)
print(resp)
Ruby
response = client.ingest.simulate(
body: {
pipeline: {
description: 'Hide my IP',
processors: [
{
redact: {
field: 'message',
patterns: [
'%{IP:REDACTED}',
'%{EMAILADDRESS:REDACTED}'
],
prefix: '*',
suffix: '*'
}
}
]
},
docs: [
{
_source: {
message: '55.3.244.1 GET /index.html 15824 0.043 [email protected]'
}
}
]
}
)
puts response
Js
const response = await client.ingest.simulate({
pipeline: {
description: "Hide my IP",
processors: [
{
redact: {
field: "message",
patterns: ["%{IP:REDACTED}", "%{EMAILADDRESS:REDACTED}"],
prefix: "*",
suffix: "*",
},
},
],
},
docs: [
{
_source: {
message: "55.3.244.1 GET /index.html 15824 0.043 [email protected]",
},
},
],
});
console.log(response);
Console
POST _ingest/pipeline/_simulate
{
"pipeline": {
"description": "Hide my IP",
"processors": [
{
"redact": {
"field": "message",
"patterns": [
"%{IP:REDACTED}",
"%{EMAILADDRESS:REDACTED}"
],
"prefix": "*",
"suffix": "*"
}
}
]
},
"docs": [
{
"_source": {
"message": "55.3.244.1 GET /index.html 15824 0.043 [email protected]"
}
}
]
}
レスポンス内では、IP 55.3.244.1
およびメールアドレス[email protected]
が*REDACTED*
に置き換えられています。
Console-Result
{
"docs": [
{
"doc": {
"_index": "_index",
"_id": "_id",
"_version": "-3",
"_source": {
"message": "*REDACTED* GET /index.html 15824 0.043 *REDACTED*"
},
"_ingest": {
"timestamp": "2023-02-01T16:53:14.560005377Z"
}
}
}
]
}
Custom patterns
既存のGrok パターンのいずれかが要件に合わない場合、pattern_definitions
オプションを使用してカスタムパターンを追加できます。新しいパターン定義は、パターン名とパターン自体で構成されます。パターンは正規表現であるか、既存のGrokパターンを参照することができます。
この例では、GitHubユーザー名に一致するカスタムパターンGITHUB_NAME
を定義します。パターン定義は、リテラル@
で接頭辞された既存のUSERNAME
Grok パターンを使用します。
Grokデバッガーは、カスタムパターンを構築するための非常に便利なツールです。
Python
resp = client.ingest.simulate(
pipeline={
"processors": [
{
"redact": {
"field": "message",
"patterns": [
"%{GITHUB_NAME:GITHUB_NAME}"
],
"pattern_definitions": {
"GITHUB_NAME": "@%{USERNAME}"
}
}
}
]
},
docs=[
{
"_source": {
"message": "@elastic-data-management the PR is ready for review"
}
}
],
)
print(resp)
Ruby
response = client.ingest.simulate(
body: {
pipeline: {
processors: [
{
redact: {
field: 'message',
patterns: [
'%{GITHUB_NAME:GITHUB_NAME}'
],
pattern_definitions: {
"GITHUB_NAME": '@%<USERNAME>s'
}
}
}
]
},
docs: [
{
_source: {
message: '@elastic-data-management the PR is ready for review'
}
}
]
}
)
puts response
Js
const response = await client.ingest.simulate({
pipeline: {
processors: [
{
redact: {
field: "message",
patterns: ["%{GITHUB_NAME:GITHUB_NAME}"],
pattern_definitions: {
GITHUB_NAME: "@%{USERNAME}",
},
},
},
],
},
docs: [
{
_source: {
message: "@elastic-data-management the PR is ready for review",
},
},
],
});
console.log(response);
Console
POST _ingest/pipeline/_simulate
{
"pipeline": {
"processors": [
{
"redact": {
"field": "message",
"patterns": [
"%{GITHUB_NAME:GITHUB_NAME}"
],
"pattern_definitions": {
"GITHUB_NAME": "@%{USERNAME}"
}
}
}
]
},
"docs": [
{
"_source": {
"message": "@elastic-data-management the PR is ready for review"
}
}
]
}
Console-Result
{
"docs": [
{
"doc": {
"_index": "_index",
"_id": "_id",
"_version": "-3",
"_source": {
"message": "<GITHUB_NAME> the PR is ready for review"
},
"_ingest": {
"timestamp": "2023-02-01T16:53:14.560005377Z"
}
}
}
]
}
Grok watchdog
ウォッチドッグは、実行に時間がかかりすぎる式を中断します。中断されると、Redactプロセッサはエラーで失敗します。Grokウォッチドッグのタイムアウトを制御するのと同じ設定がRedactプロセッサにも適用されます。
Licensing
redact
プロセッサは、適切なライセンスを必要とする商業機能です。詳細については、https://www.elastic.co/subscriptionsを参照してください。
skip_if_unlicensed
オプションは、クラスターのライセンスがそのようなプロセッサを実行するのに十分でない場合の動作を制御するために、Redactプロセッサに設定できます。skip_if_unlicensed
はfalse
にデフォルト設定されており、クラスターのライセンスが不十分な場合、Redactプロセッサは例外をスローします。ただし、skip_if_unlicensed
オプションをtrue
に設定すると、Redactプロセッサは例外をスローせず(何もしない)、ライセンスが不十分な場合でも動作します。