Confluent ログの編集

Java 仮想マシン(JVM)で実行される最新のソフトウェアは、さまざまなベンダーやオープンソースプロジェクトが提供する数百のコンポーネントライブラリから構築されることが多くなっています。通常は、各コンポーネントライブラリがログメッセージを作成して、エラー、警告、情報メッセージ、クラスやメソッドを通じたデバッグ情報をキャプチャします。まれなケースですが、コンポーネント作成者が気づかないうちにログステートメントに誤って機密情報が含まれる場合があり、そのままパッケージ化されて、エンドユーザーがアプリケーションログで機密情報を公開してしまうことがあります。当然ながらこれはセキュリティ上の懸念につながる可能性があり、ソフトウェアプロバイダーに報告する必要があります。少なくとも、プロバイダーに連絡し、可能な場合は修正を要求する必要があります。

コンポーネントライブラリでそのような修正か可能かどうかにかかわらず、log4j 用の Confluent Log Redactor プラグインを使用して正規表現パターン(編集ルール)を構成し、ログが他のアペンダーに送信されて出力される前に、ログ内の機密情報の特定のパターンを識別して編集することができます。コンポーネント(Kafka や Connect など)用の Log Redactor は、log4j プロパティファイルをアップデートすることで構成できます。

たとえば、HTTP Authorization ヘッダーがログに表示されていたため、コンポーネントプロバイダーに修正リクエストチケットを送信するとします。このとき同時に、Confluent Log Redactor を構成して、Authorization: Basic [0-9a-zA-Z\+\=\/]+ と一致する簡単なルールを作成して、Authorization: Basic ***** と置き換えることができます。

Confluent Log Redactor プラグインのインストール

Confluent Log Redactor プラグインは、Connect ではデフォルトで有効になっています(新規インストールの場合)。

Log Redactor プラグインの構成

Log Redactor プラグインを構成するには、次の手順を実行する必要があります。

  1. 構成ファイルの変更をバックアップします。
  2. JAR ファイルが Connect クラスパスに存在することを確認します。
  3. log4j.properties ファイルをアップデートします。
  4. Log Redactor クラスを参照します。

構成手順については以下のサブセクションで説明します。

編集ルールのセットアップ

編集ルールは、JSON フォーマットで指定します。ファイルは以下のような内容になります。

{
  "version": "1",
  "rules": [
    {
      "description": "This is the first rule",
      "trigger": "triggerstring 1",
      "search": "regex 1",
      "replace": "replace 1"
    },
    {
      "description": "This is the second rule",
      "trigger": "triggerstring 2",
      "caseSensitive": false,
      "search": "regex 2",
      "replace": "replace 2"
    }
  ]
}

ログメッセージがルールに一致した場合は、search フィールドを使用してメッセージが検索され、一致した文字列がすべて replace と置き換えられます。

フィールド 説明 必須かどうか
trigger シンプルな文字列の比較。パフォーマンスのヒントの提供に使用することができます。シンプルな文字列の比較は正規表現よりも高速である場合があります。このフィールドが存在しない場合、メッセージでは常に search を適用します。将来のバージョンでは、このヒントは無視される可能性があります。 いいえ
caseSensitive trigger および search のマッチングで大文字と小文字が区別されるかどうかを指定するブール値。デフォルトは true (大文字と小文字を区別したマッチング)です。 いいえ
search 正規表現。適切なエスケープを使用する必要があります。 はい
replace 単純な文字列。実際には、XXXXXXX などがよく使用されます。指定しない場合、ルールでは検出のみ行われ、編集はされません。 いいえ
description 自己記述のために用意されています。 いいえ

現在の実装では、ルールの順序が重要になります。ルールは、指定された順序で厳密に評価されます。したがって理論上、後のルールが前のルールの出力を処理する可能性があります(aaa->bbbbbb->ccc)。Confluent ではこの動作が将来のバージョンでも維持されることを保証しておらず、この動作に依存したルールの使用はお勧めしません。

rules.json ファイルの例

rules.json ファイルの例を以下に示します。

{
  "version": 1,
  "rules": [
    {
      "description": "No more vowels",
      "search": "[aeiou]",
      "replace": "x"
    },
    {
      "description": "Passwords",
      "trigger": "password",
      "search": "password=.*",
      "replace": "password=xxxxx"
    }
  ]
}

この例には 2 つのルールが含まれています。1 つ目のルールは、すべてのログメッセージから小文字の母音をなくして、それぞれを x と置き換えます。2 つ目のルールは、password を含む行を探して、password=... があれば password=xxxxx と置き換えます。

ポリシールールの変更の監視と実行時のアップデート

Log Redactor では、ファイルシステム上のファイルで動的に変更された編集ルールが見つかった場合は、その変更済みのルールと照合してログのコンテンツを編集できます。

Log Redactor をセットアップするには、log4j.properties ファイルで以下の構成を使用します。

log4j.appender.redactor=io.confluent.log4j.redactor.RedactorAppender
log4j.appender.redactor.appenderRefs=stdout
log4j.appender.redactor.policy=io.confluent.log4j.redactor.RedactorPolicy
log4j.appender.redactor.policy.rules=/path/to/rules/file
log4j.appender.redactor.policy.refreshInterval=60000

log4j.logger.myLogger=stdout, redactor
log4j.appender.redactor.policy.refreshInterval を使用する場合:
ファイルシステムで変更をチェックする間隔をミリ秒で指定します。変更が検出されると、Redactor は自動的にその変更を採用します。指定されていない場合、ポリシールールの読み取りは、スタートアップ時の 1 回だけです。

Metadata Service (MDS) 用の Log Redactor の構成

Confluent Log Redactor は、Confluent Platform に含まれており、log4j プロパティファイルをアップデートすることで Metadata Service (MDS) 用に構成できます。

アップデートされた log4j.properties ファイルの例を次に示します。

log4j.rootLogger=INFO, stdout, file, redactor

...

# Configures the Log Redactor rewrite appender which redacts log messages using the specified redaction regex
# rules. The `policy.rules` property specifies the location of the redaction rules file to be used.
# The appender redacts logs before forwarding them to other appenders specified in the `appenderRefs` property.
log4j.appender.redactor=io.confluent.log4j.redactor.RedactorAppender
log4j.appender.redactor.appenderRefs=stdout, file
log4j.appender.redactor.policy=io.confluent.log4j.redactor.RedactorPolicy
log4j.appender.redactor.policy.rules=${log4j.config.dir}/metadata-log-redactor-rules.json