CLI による監査ログの構成

Confluent Platform 6.0 以降では、Confluent CLI コマンドを使用して監査ログ構成を動的に更新できます。Confluent CLI は、MDS API 監査ログ構成エンドポイント との(スクリプトまたはコマンドラインを使用した)やり取りに推奨されるツールです。CLI を介して行われた変更は、MDS(メタデータサービス)からすべての登録済みクラスターにプッシュされるため、監査ログ構成の一元管理が可能になります。

一元的な MDS ベースの監査ロギングのワークフローを示す図

一元化された監査ログのワークフロー

前提条件

個々の Kafka クラスター監査ログ構成の移行

Confluent Platform 6.0 まで、監査ログをセットアップして使用するには、server.properties ファイル内の JSON 値プロパティ confluent.security.event.router.config を使用できるように 個々のクラスターを構成 していました。前述のように、Confluent Platform 6.0 以降では、監査ログ機能を拡張して、複数の登録済み Kafka クラスターにまたがる 一元的(MDS)構成 を使用できます。

既存の監査ログ構成を保持して、各 Kafka クラスターに既に指定されている監査ログルーティング構成を活用する場合は、既存の構成ファイルを移行して 1 つの共通ファイルに結合し、新しく一元化された構成で使用する必要があります。

注釈

クラスターレジストリにクラスターを登録せずに Confluent CLI または MDS API を使用した場合、Confluent CLI を使用して API 経由で監査ログ構成に加えた変更は、MDS が実行されている Kafka クラスターの監査ログ構成にのみ反映され、他の Kafka クラスターには反映されません。

監査ログ移行ツールのしくみ

監査ログ移行ツールは、以下のタスクを実行します。

  • 出力ブートストラップサーバーを指定された値に設定する(値が指定された場合)。デフォルトでは、出力ブートストラップサーバーは空です。

  • 入力監査ログのデスティネーショントピックを結合する。複数の Kafka クラスター構成に出現するトピックについては、構成で指定されている最長の 保持時間 が使用されます。

  • デフォルトの監査ログトピックを confluent-audit-log-events に設定する。移行ツールは必要に応じて、このトピックをデスティネーショントピックのセットに追加します(その場合は、7776000000 ミリ秒の保持期間が指定されます)。

  • すべての 除外プリンシパル を結合する。

  • 登録済み Kafka クラスターのクラスター ID を使用して、各 Confluent Resource Name(CRN) パターンの /kafka=*/ の部分を置き換える。たとえば、crn:///kafka=*/topic=accounting-* のような CRN を持つ cluster1 の構成のルートが crn:///kafka=cluster1/topic=accounting-* に変換されます。

    CRN で /kafka=*/ 以外が使用されているルートの場合、移行ツールによる Kafka クラスター ID の置き換えは行われません。たとえば、ルートで kafka=pkc-123 が指定され、クラスター ID が pkc-abc である場合、変換は行われずツールから警告が返されます。

    Mismatched Kafka Cluster Warning: Routes from one Kafka cluster ID on a
    completely different cluster ID are unexpected, but not necessarily wrong.
    For example, this message might be returned if you attempt to reuse the
    same routing configuration on multiple clusters.
    
  • 着信監査ログのルーター構成でデフォルトトピックが confluent-audit-log-events 以外の場合は、スクリプトによって以下の CRN パターンのルートが追加されます(まだ存在しない場合)。

    トピックのルート イベントカテゴリのタイプ
    crn://<authority>/kafka=<cluster-id> AUTHORIZE、MANAGEMENT
    crn://<authority>/kafka=<cluster-id>/topic=* AUTHORIZE、MANAGEMENT
    crn://<authority>/kafka=<cluster-id>/control-center-broker-metrics=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/control-center-alerts=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/delegation-token=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/control-center-broker-metrics=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/control-center-alerts=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/cluster-registry=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/security-metadata=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/all=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/connect=<connect-id> AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/connect=<connect-id>/connector=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/connect=<connect-id>/secret=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/connect=<connect-id>/all=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/schema-registry=<sr-id> AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/schema-registry=<sr-id>/subject=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/schema-registry=<sr-id>/all=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/ksql=<id> AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/ksql=<id>/ksql-cluster=* AUTHORIZE
    crn://<authority>/kafka=<cluster-id>/ksql=<id>/all=* AUTHORIZE

    注釈

    新しく移行した監査ログ構成に上記のルートを追加することが望ましくない場合は、移行する前に、default_topicsconfluent-audit-log-events のみが使用されるように入力の server.properties ファイルを編集します。

監査ログのデフォルト構成

既存の 5.4 または 5.5 の監査ログ構成でデフォルト設定のみが使用されており、それを変更していない場合(confluent.security.event.router.config がないか、空である場合)、監査ログ構成を移行する必要はありません。デフォルトの一元的な監査ログ構成では、引き続きクラスター上のトピック(confluent-audit-log-events)への書き込みが行われます。

Confluent Platform 6.0 にアップグレードし、前提条件 が満たされた後、一元的な監査ログの使用に進むことができます。

注釈

既存の監査ログ構成を Confluent Platform 6.0 に移行する場合、一元的な監査ログを使用する一方で、古い監査ログにも引き続きアクセスする必要があれば、その期間中は元のクラスターと送信先クラスターの両方から消費するか、クラスター内の元のトピックから送信先クラスタートピックに古いログをコピーする必要があります。

以前に構成された監査ログ構成

監査ログが単一の送信先クラスターに生成されるように、(場合によっては複雑なルールを使用して)各 Confluent Platform (5.4 または 5.5)の Kafka クラスターを個別に構成した場合、すべての Kafka クラスターの監査ログ構成を移行して、1 つの JSON に結合する必要があります。これらの構成を結合した後、confluent audit-log config update コマンドを使用して、JSON を MDS 監査ログ構成 API に渡します。

注釈

すべての一元監査ログについて、単一の送信先クラスターを使用する必要があります。

たとえば、Kafka クラスター cluster123clusterABC について、2 つの監査ログ構成があるとします。各クラスターの構成は、それぞれ /tmp/cluster123/server.properties および /tmp/clusterABC/server.propertiesserver.properties ファイルに保存されます。

cluster123 の監査ログルーター構成は次のようになります。

cluster123/server.properties:
...
confluent.security.event.router.config= \
{ \
  "destinations": { \
    "bootstrap_servers":["audit.example.com:9092"],\
    "topics":{ \
      "confluent-audit-log-events_payroll":{ \
        "retention_ms":50 \
      }, \
      "confluent-audit-log-events":{ \
        "retention_ms":500 \
      }
    }
  }, \
  "default_topics":{ \
    "allowed":"confluent-audit-log-events", \
    "denied":"confluent-audit-log-events"}, \
    "routes":{ \
      "crn://mds1.example.com/kafka=*/topic=payroll-*": { \
        "produce":{ \
          "allowed":"confluent-audit-log-events_payroll", \
          "denied":"confluent-audit-log-events_payroll" \
        }, \
        "consume":{ \
          "allowed":"confluent-audit-log-events_payroll", \
          "denied":"confluent-audit-log-events_payroll" \
        } \
    }, \
    "crn://some-authority/kafka=clusterX":{ \
      "management":{ \
        "allowed":"confluent-audit-log-events_payroll", \
        "denied":"confluent-audit-log-events_payroll" \
      }
    }
  }, \
  "excluded_principals":["User:Alice"]
}

clusterABC の監査ログルーター構成は次のようになります。

clusterABC/server.properties
...
confluent.security.event.router.config={ \
  "destinations": { \
    "bootstrap_servers": [ \
      "OLD_ID.us-central1.gcp.cloud:9092" \
    ], \
    "topics": { \
      "confluent-audit-log-events_payroll": { \
        "retention_ms": 2592000000 \
      }, \
      "confluent-audit-log-events_billing": { \
        "retention_ms": 2592000000 \
      }, \
      "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC": { \
        "retention_ms": 100 \
      } \
    } \
  }, \
  "default_topics": { \
    "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC", \
    "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC" \
  }, \
  "routes": { \
    "crn://mds1.example.com/kafka=*/topic=billing-*": { \
      "produce": { \
        "allowed": "confluent-audit-log-events_billing", \
        "denied": "confluent-audit-log-events_billing" \
      }, \
      "consume": { \
        "allowed": "confluent-audit-log-events_billing", \
        "denied": "confluent-audit-log-events_billing" \
      }, \
      "management": { \
        "allowed": "confluent-audit-log-events_billing", \
        "denied": "confluent-audit-log-events_billing" \
      } \
    }, \
    "crn://diff-authority/kafka=different-cluster-id/topic=payroll-*": { \
      "produce": { \
        "allowed": "confluent-audit-log-events_payroll", \
        "denied": "confluent-audit-log-events_payroll" \
      }, \
      "consume": { \
        "allowed": "confluent-audit-log-events_payroll", \
        "denied": "confluent-audit-log-events_payroll" \
      } \
    }, \
    "crn://some-authority/kafka=clusterX": { \
      "management": { \
        "allowed": "confluent-audit-log-events_payroll", \
        "denied": "confluent-audit-log-events_payroll" \
      } \
    } \
  }, \
  "excluded_principals": [ \
    "User:Bob" \
  ] \
}

指定されたブートストラップサーバー(NEW_ID_2.us.gcp.cloud:9092NEW_ID_1.us.gcp.cloud:9092)を使用してこれらの構成を結合するには、次のように移行ツールを実行します。

# Migrate the audit log configurations and combine into a single JSON blob
confluent audit-log migrate config \
--combine cluster123=/tmp/cluster123/server.properties,\
clusterABC=/tmp/clusterABC/server.properties \
--bootstrap-servers NEW_ID_2.us.gcp.cloud:9092 \
--bootstrap-servers NEW_ID_1.us.gcp.cloud:9092 \
> /tmp/audit-log-config.json

Mismatched Kafka Cluster Warning: Cluster "cluster123" has a route for a different cluster, route: "crn://some-authority/kafka=clusterX". Routes from one Kafka cluster ID on a completely different cluster ID are unexpected, but not necessarily wrong. For example, this message might be returned if you reuse the same routing configuration on multiple clusters.
Mismatched Kafka Cluster Warning: Cluster "clusterABC" has a route for a different cluster, route: "crn://diff-authority/kafka=different-cluster-id/topic=payroll-*". Routes from one Kafka cluster ID on a completely different cluster ID are unexpected, but not necessarily wrong. For example, this message might be returned if you reuse the same routing configuration on multiple clusters.
Mismatched Kafka Cluster Warning: Cluster "clusterABC" has a route for a different cluster, route: "crn://some-authority/kafka=clusterX". Routes from one Kafka cluster ID on a completely different cluster ID are unexpected, but not necessarily wrong. For example, this message might be returned if you reuse the same routing configuration on multiple clusters.
Multiple CRN Authorities Warning: Cluster "cluster123" had multiple CRN authorities in its routes: [crn://mds1.example.com/ crn://some-authority/]. Multiple, different CRN authorities exist in routes from a single cluster. This is unexpected in a configuration targeting a single cluster, but makes sense if you are reusing the same routing rules on multiple clusters. If this is the case you can ignore this warning or consider using CRN patterns with wildcard (empty) authority values in your audit log routes.
Multiple CRN Authorities Warning: Cluster "clusterABC" had multiple CRN authorities in its routes: [crn://diff-authority/ crn://mds1.example.com/ crn://some-authority/]. Multiple, different CRN authorities exist in routes from a single cluster. This is unexpected in a configuration targeting a single cluster, but makes sense if you are reusing the same routing rules on multiple clusters. If this is the case you can ignore this warning or consider using CRN patterns with wildcard (empty) authority values in your audit log routes.
New Bootstrap Servers Warning: Cluster "cluster123" currently has bootstrap servers = [audit.example.com:9092]. Replacing with [NEW_ID_1.us.gcp.cloud:9092 NEW_ID_2.us.gcp.cloud:9092]. Migrated clusters will use the specified bootstrap servers.
New Bootstrap Servers Warning: Cluster "clusterABC" currently has bootstrap servers = [OLD_ID.us-central1.gcp.cloud:9092]. Replacing with [NEW_ID_1.us.gcp.cloud:9092 NEW_ID_2.us.gcp.cloud:9092]. Migrated clusters will use the specified bootstrap servers.
New Excluded Principals Warning: Due to combining the excluded principals from every input cluster, cluster "cluster123" will now also exclude the following principals: [User:Bob]
New Excluded Principals Warning: Due to combining the excluded principals from every input cluster, cluster "clusterABC" will now also exclude the following principals: [User:Alice]
Repeated Route Warning: Route Name : "crn://some-authority/kafka=clusterX". There are duplicate routes specified between different router configurations. Duplicate routes will be dropped.
Retention Time Discrepancy Warning: Topic "confluent-audit-log-events_payroll" had discrepancies in retention time. Using max: 2592000000. Discrepancies in retention time occur when two cluster configurations have the same topic in a router configuration, but different retention times. The maximum specified retention time will be used.

# If desired, make adjustments
vim /tmp/audit-log-config.json

# Post the JSON to the MDS audit log configuration API
confluent audit-log config update --force < /tmp/audit-log-config.json

結合結果は、標準出力(stdout)に出力されます(この例では、/tmp/audit-log-config.json にあります)。警告は、標準エラー(stderr)に出力されます。出力ブートストラップサーバーはデフォルトでは空ですが、ここでは、移行ツールの実行時に指定された値を反映しています。

{
  "destinations": {
    "bootstrap_servers": [
      "NEW_ID_1.us.gcp.cloud:9092",
      "NEW_ID_2.us.gcp.cloud:9092"
    ],
    "topics": {
      "confluent-audit-log-events": {
        "retention_ms": 500
      },
      "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC": {
        "retention_ms": 100
      },
      "confluent-audit-log-events_billing": {
        "retention_ms": 2592000000
      },
      "confluent-audit-log-events_payroll": {
        "retention_ms": 2592000000
      }
    }
  },
  "excluded_principals": [
    "User:Alice",
    "User:Bob"
  ],
  "default_topics": {
    "allowed": "confluent-audit-log-events",
    "denied": "confluent-audit-log-events"
  },
  "routes": {
    "crn:///kafka=cluster123/topic=payroll-*": {
      "produce": {
        "allowed": "confluent-audit-log-events_payroll",
        "denied": "confluent-audit-log-events_payroll"
      },
      "consume": {
        "allowed": "confluent-audit-log-events_payroll",
        "denied": "confluent-audit-log-events_payroll"
      }
    },
    "crn:///kafka=clusterABC": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      },
      "management": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/all=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/cluster-registry=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/connect=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/connect=*/all=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/connect=*/connector=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/connect=*/secret=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/control-center-alerts=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/control-center-broker-metrics=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/delegation-token=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/group=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      },
      "management": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/ksql=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/ksql=*/all=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/ksql=*/ksql-cluster=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/schema-registry=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/schema-registry=*/all=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/schema-registry=*/subject=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/security-metadata=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/topic=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      },
      "management": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterABC/topic=billing-*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      },
      "management": {
        "allowed": "confluent-audit-log-events_billing",
        "denied": "confluent-audit-log-events_billing"
      },
      "produce": {
        "allowed": "confluent-audit-log-events_billing",
        "denied": "confluent-audit-log-events_billing"
      },
      "consume": {
        "allowed": "confluent-audit-log-events_billing",
        "denied": "confluent-audit-log-events_billing"
      }
    },
    "crn:///kafka=clusterABC/transaction-id=*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      }
    },
    "crn:///kafka=clusterX": {
      "management": {
        "allowed": "confluent-audit-log-events_payroll",
        "denied": "confluent-audit-log-events_payroll"
      }
    },
    "crn:///kafka=different-cluster-id/topic=payroll-*": {
      "authorize": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      },
      "management": {
        "allowed": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC",
        "denied": "confluent-audit-log-events_DIFFERENT-DEFAULT-TOPIC"
      },
      "produce": {
        "allowed": "confluent-audit-log-events_payroll",
        "denied": "confluent-audit-log-events_payroll"
      },
      "consume": {
        "allowed": "confluent-audit-log-events_payroll",
        "denied": "confluent-audit-log-events_payroll"
      }
    }
  },
  "metadata": null
}

監査ログ構成の表示

さまざまな場面で、現在の監査ログ構成を確認する必要性が生じます。たとえば、現在監査ログに使用されているターゲットクラスターを特定する場合や、特定の監査ログ操作のターゲットトピックを確認する場合は、confluent audit-log config describe コマンドを使用して、監査ログ構成を表示できます。このコマンドでは、JSON 構成全体が標準出力に返されます。監査ログ構成ルールを 更新 する場合は、このコマンドを使用して現在の構成をキャプチャし、テキストエディタで開きます。空のファイルから始めるより、この方法を使う方が簡単です。

confluent audit-log config describe > /tmp/audit-log-config.json
cat /tmp/audit-log-config.json
{
  "destinations": {
    "bootstrap_servers": [
      "localhost:9091",
      "localhost:9093"
    ],
    "topics": {
      "confluent-audit-log-events": {
        "retention_ms": 259200000
      }
    }
  },
  "excluded_principals": [
    "User:Alice",
    "User:service_account_id"
  ],
  "default_topics": {
    "allowed": "confluent-audit-log-events",
    "denied": "confluent-audit-log-events"
  },
  "metadata": {
    "resource_version": "FElOq8fl5Mp4imIaRbX4iA",
    "updated_at": "2020-08-06T18:50:01Z"
  }
}

監査ログ構成の更新

confluent audit-log config update コマンドを使用すると、既存の監査ログ構成を動的に置き換えることができます。update オプションを指定すると、更新された JSON 構成が MDS API 監査ログ構成 にプッシュされます。

confluent audit-log config update コマンドへの入力は、デフォルトで標準入力から読み取られます。--file 引数を使用すると、入力ファイルへのパスを指定できます。たとえば、ほとんどのシェルでは、以下のすべての方法で結果は同じになります。

cat /path/to/my/file.json | confluent audit-log config update

confluent audit-log config update < /path/to/my/file.json

confluent audit-log config update --file /path/to/my/file.json

以下は、監査ログ構成を動的に更新するための一般的なワークフローです。

  1. confluent audit-log config describe > tempfile を実行して、既存の構成をキャプチャします。
  2. tempfile を編集します。
  3. confluent audit-log config update < tempfile を実行して、変更を MDS API 監査ログ構成に書き戻します。

組織がすべての構成をソース管理システムに保存し、ソースコードの更新時に、フックまたはトリガーを使用して構成の更新を自動的にプッシュするという形態を取っていることもあります。このユースケースでは、JSON の "ゴールデン" 構成がソース管理に保存されているため、トリガーでは常に、MDS API 監査ログ構成に保存されている JSON 構成を上書きする必要があります。

以下は、"コードとしてのインフラストラクチャ" の典型的なワークフローです。

  1. バージョン管理された構成ファイルをチェックアウトします。ファイルを編集し、マージリクエストを作成します。
  2. 同僚によるレビューと承認が行われたら、変更をソース管理システムにマージします。
  3. 制御システムのフックが、組織の自動スクリプトを呼び出します。このスクリプトは、JSON の "ゴールデン" 構成を <path-to-audit-log-config.json> のファイルにチェックアウトし、confluent audit-log config update --force --file <path-to-audit-log-config.json> を呼び出します。これにより、MDS API に認識されている以前の監査ログ構成が、新しく更新された構成で上書きされます。

--force オプションの使用

同時変更を上書きする場合は、--force オプションを使用します。たとえば、管理者 A が構成の編集を開始し、管理者 B が同時編集を行っている場合、管理者 A が編集を完了して新しい構成をアップロードしようとすると、エラーが発生します。このエラーが発生するのは、両方の管理者が古いバージョンの構成を同時に更新しようとしているためです。この場合、管理者 A は新しいバージョンの構成を調べた後、--force オプションを使用して管理者 B の変更を上書きするかどうかを判断することができます。

MDS API では、JSON 更新で resource_version の確認が行われることに注意してください。最新バージョンと一致しない場合、API は次のような同時更新エラーを返します。

Error: Metadata Service backend error: 409 Conflict: {"destinations":{"topics":{"confluent-audit-log-events":{"retention_ms":1000000000}}},"default_topics":{"allowed":"confluent-audit-log-events","denied":"confluent-audit-log-events"},"metadata":{"resource_version":"4Ecnf-3erIWXjqgbjLXauw","updated_at":"2020-07-15T22:30:12Z"}}

このシナリオで --force オプションを使用すると、更新された JSON の resource_version が現在のバージョンと異なっていても許容されます。

以下に示す構成の更新例では、元の構成がファイル acme-audit-log-config-hr の構成に置き換えられます。--force オプションは、ここでの resource_version が既存の構成の値と異なるため必要です。更新が正常に完了すると、新しい構成が返されます。

confluent audit-log config update --force --file acme-audit-log-config-hr
{
  "destinations": {
    "bootstrap_servers": [
      "localhost:9091",
      "localhost:9093"
    ],
    "topics": {
      "confluent-audit-log-events": {
        "retention_ms": 259200000
      },
      "confluent-audit-log-events_hr": {
        "retention_ms": 604800000
      }
    }
  },
  "excluded_principals": [
    "User:Alice",
    "User:service_account_id"
  ],
  "default_topics": {
    "allowed": "confluent-audit-log-events",
    "denied": "confluent-audit-log-events"
  },
  "routes": {
    "crn:///kafka=*/topic=hr-*": {
      "management": {
        "allowed": null,
        "denied": null
      },
      "authorize": {
        "allowed": null,
        "denied": null
      },
      "produce": {
        "allowed": "confluent-audit-log-events_hr",
        "denied": "confluent-audit-log-events_hr"
      },
      "consume": {
        "allowed": "confluent-audit-log-events_hr",
        "denied": "confluent-audit-log-events_hr"
      },
      "describe": {
        "allowed": "",
        "denied": ""
      }
    }
  },
  "metadata": {
    "resource_version": "3N-cNxcdIRtVr-4Jvkbg5w",
    "updated_at": "2020-08-06T19:01:32Z"
  }
}

監査ログ構成の編集

confluent audit-log config update の使用時とは異なり、中間ファイルを作成せずに既存の監査ログ構成を変更できます。

confluent audit-log config edit コマンドを実行すると、MDS サーバーに認識されている最新の監査ログ構成の内容を含む一時ファイルが、デフォルトのエディター($EDITOR)によって開かれます。エディターで、構成の更新内容を入力します。構成の更新を完了してエディターを閉じると、Confluent CLI により一時ファイルが MDS サーバーに送信され、更新が完了します。

監査ログルートのトラブルシューティング

監査ログの ルーティングルール は扱いが難しい場合があります。CLI には、2 つのコマンドが用意されています。これらは、特定のリソースの CRN を指定し、監査ログのルーティングルールを明確にして、トラブルシューティングを行うために役立ちます。

  • 特定のリソースまたはそのサブリソースのいずれかに一致するすべての監査ログルートをリストするには、confluent audit-log route list を使用します。
  • 特定のリソースに対して、"最長の共通プレフィックス" を優先するルールでこれらのルートのうちどれが選択されるかを決定するには、confluent audit-log route lookup を使用します。

注釈

MDS API 監査ログ構成 のルートルックアップには、ワイルドカード文字(*)を使用したパターンではなく、単一のリソースの CRN が必要です。検索にワイルドカードを含めると、エラーが発生します。

CRN crn://mds1.example.com/kafka=test-cluster-1 によって識別された Kafka クラスターに関連するすべての監査ログルートを表示するには:

confluent audit-log route list -r "crn://mds1.example.com/kafka=test-cluster-1"
 {
   "default_topics": {
     "allowed": "confluent-audit-log-events",
     "denied": "confluent-audit-log-events"
   },
   "routes": {
     "crn://mds1.example.com/kafka=*/topic=billing-*": {
       "management": {
         "allowed": "confluent-audit-log-events_billing",
         "denied": "confluent-audit-log-events_other"
       },
       "authorize": {
         "allowed": null,
         "denied": null
       },
       "produce": {
         "allowed": "confluent-audit-log-events_billing",
         "denied": "confluent-audit-log-events_other"
       },
       "consume": {
         "allowed": "confluent-audit-log-events_billing",
         "denied": "confluent-audit-log-events_other"
       }
     },
     "crn://mds1.example.com/kafka=*/topic=payroll-*": {
       "management": {
         "allowed": "confluent-audit-log-events_payroll",
         "denied": "confluent-audit-log-events_other"
       },
       "authorize": {
         "allowed": null,
         "denied": null
       },
       "produce": {
         "allowed": "confluent-audit-log-events_payroll",
         "denied": "confluent-audit-log-events_other"
       },
       "consume": {
         "allowed": "confluent-audit-log-events_payroll",
         "denied": "confluent-audit-log-events_other"
       }
     },
     "crn://mds1.example.com/kafka=test-cluster-1": {
       "management": {
         "allowed": "confluent-audit-log-events_other",
         "denied": "confluent-audit-log-events_other"
       },
       "authorize": {
         "allowed": "confluent-audit-log-events",
         "denied": "confluent-audit-log-events"
       }
     }
   }
 }

リソース "crn://mds1.example.com/kafka=test-cluster-1" に関する監査ログメッセージのルーティング先を確認するには:

confluent audit-log route lookup confluent audit-log route lookup "crn://mds1.example.com/kafka=test-cluster-1"

{
  "route": "crn://mds1.example.com/kafka=test-cluster-1",
  "categories": {
    "management": {
      "allowed": "confluent-audit-log-events_other",
      "denied": "confluent-audit-log-events_other"
    },
    "authorize": {
      "allowed": "confluent-audit-log-events",
      "denied": "confluent-audit-log-events"
    },
    "produce": {
      "allowed": "",
      "denied": ""
    },
    "consume": {
      "allowed": "",
      "denied": ""
    },
    "interbroker": {
      "allowed": "",
      "denied": ""
    },
    "heartbeat": {
      "allowed": "",
      "denied": ""
    },
    "describe": {
      "allowed": "",
      "denied": ""
    }
  }
}

すべてのデフォルト値が設定され、この CRN を使用する監査ログメッセージのルーティング先を示す単一のルートのみが返されます。