チュートリアル: シークレットの保護

概要

Confluent Platform のシークレット機能を使用すると、パスワードや API トークンなどの機密情報を保管および管理できます。パスワードやその他の機密データをクリアテキストとして保存する代わりに、構成ファイル自体の内部でデータを暗号化することができます。

前提条件

  1. Confluent Platform 6.2.4 の ダウンロード

チュートリアルの実行

パスフレーズに基づくマスター暗号化キー生成

  1. マスター暗号化キーパスフレーズを決定します。パスフレーズは、通常のパスワードより長いテキストである必要があります。一連の単語として憶えることができる語句を選択してください。

  2. パスフレーズをローカルファイル(/path/to/passphrase.txt など)に書き込みます。これが CLI に渡されます。ファイルに書き込むと、ログ履歴にパスフレーズが表示されなくなります。

  3. シークレットファイルの格納場所をローカルホスト上で選択します。この場所は、Confluent Platform サービスの実行場所以外である必要があります。シークレットファイルには、マスター暗号化キー、データ暗号化キー、構成パラメーターの暗号化済みシークレットが、暗号化に使用された暗号などのメタデータとともに含まれます。

  4. 次のコマンドを実行してマスター暗号化キーを生成します。

    # passphrase: /path/to/passphrase.txt
    # local-secrets-file: /path/to/secrets.txt
    
    confluent secret master-key generate --local-secrets-file /path/to/secrets.txt --passphrase @/path/to/passphrase.txt
    

    次のように表示されます。

    Save the master key. It cannot be retrieved later.
    +------------+----------------------------------------------+
    | Master Key | Nf1IL2bmqRdEz2DO//gX2C+4PjF5j8hGXYSu9Na9bao= |
    +------------+----------------------------------------------+
    
  5. コンピューター上の安全な場所にマスターキーを保存します。

  6. ローカルホスト、およびシークレットが保護されている構成ファイルがある他のすべてのホスト上の環境に、このキーをエクスポートします。以下に例を示します。

    export CONFLUENT_SECURITY_MASTER_KEY=Nf1IL2bmqRdEz2DO//gX2C+4PjF5j8hGXYSu9Na9bao=
    
  7. (省略可)本稼働環境のホストの以前の環境変数を保護するには、グローバルマシンレベルではなく、プロセスレベルでマスター暗号化キーを設定します。たとえば、実行済みプロセスについて systemd オーバーライドで設定すると、環境ディレクティブファイルをルートのみのアクセスに制限できます。

構成パラメーターの値の暗号化

このセクションでは、Confluent Platform に同梱されている構成ファイルのサンプルに用意されている構成パラメーターを暗号化します。

$CONFLUENT_HOME/etc/schema-registry/connect-avro-distributed.properties のパラメーター config.storage.topic を暗号化するには、次の手順を実行します。

  1. CLI では、現在、元のファイルがその場所で変更されるため、バックアップファイル $CONFLUENT_HOME/etc/schema-registry/connect-avro-distributed.properties を作成します。

  2. Confluent Platform サービスが実行されるリモートホストでのシークレットファイルの格納場所として、正確なパス(/path/to/secrets-remote.txt など)を選択します。

  3. 暗号化前の値を表示します。

    grep "config\.storage\.topic" connect-avro-distributed.properties
    

    出力は以下のようになります。

    config.storage.topic=connect-configs
    
  4. フィールドを暗号化します。

    # remote-secrets-file: /path/to/secrets-remote.txt
    confluent secret file encrypt --local-secrets-file /path/to/secrets.txt --remote-secrets-file /path/to/secrets-remote.txt --config-file connect-avro-distributed.properties --config config.storage.topic
    
  5. 暗号化後の値を表示します。

    grep "config\.storage\.topic" connect-avro-distributed.properties
    

    出力は以下のようになります。

    config.storage.topic = ${securepass:/path/to/secrets-remote.txt:connect-avro-distributed.properties/config.storage.topic}
    
  6. 構成パラメーター config.storage.topic の設定が connect-configs から ${securepass:/path/to/secrets-remote.txt:connect-avro-distributed.properties/config.storage.topic} に変更されたことを確認します。これは、シークレットファイル /path/to/secrets-remote.txt のファイル/パラメーターのペア connect-avro-distributed.properties/config.storage.topic の暗号化済みの値の検索に使用することをサービスに指示するタプルです。

  7. ローカルのシークレットファイル /path/to/secrets.txt の内容を表示します。これには、このファイルまたはパラメーターペアの暗号化済みシークレットが、メタデータ(暗号化に使用した暗号など)とともに含まれているはずです。

    cat /path/to/secrets.txt
    

    次のように表示されます。

    ...
    connect-avro-distributed.properties/config.storage.topic = ENC[AES/CBC/PKCS5Padding,data:CUpHh5lRDfIfqaL49V3iGw==,iv:vPBmPkctA+yYGVQuOFmQJw==,type:str]
    

構成パラメーターの値の復号化

次の手順を実行して、構成パラメーターの値をファイルに復号化することもできます。

  1. 次のコマンドを実行して値をファイルに復号化します。

    confluent secret file decrypt --local-secrets-file /path/to/secrets.txt --config-file connect-avro-distributed.properties --output-file decrypted.txt
    
  2. このファイルを表示します。

    cat decrypted.txt
    

    次のように出力されます。

    config.storage.topic = connect-configs
    

構成パラメーターの値のアップデート

場合によっては、定期的にシークレットをアップデートして、シークレットが古くならないようにする必要があります。構成パラメーター config.storage.topic は、最初は connect-configs に設定されていました。将来、この値の変更が必要になった場合は、CLI を使用してアップデートすることができます。

  1. 次の CLI で、config.storage.topic=newTopicName が書き込まれた /path/to/updated-config-and-value に渡し、新しい値がログ履歴に表示されないようにします。

    confluent secret file update --local-secrets-file /path/to/secrets.txt --remote-secrets-file /path/to/secrets-remote.txt --config-file connect-avro-distributed.properties --config @/path/to/updated-config-and-value
    
  2. 構成ファイル connect-avro-distributed.properties は変更されません。構成ファイルがシークレットファイルをポイントしていても、このファイル/パラメーターペアの暗号化済みの値が新しくなっているためです。次のコマンドを実行します。

    cat /path/to/secrets.txt
    

    次のように表示されます。

    ...
    connect-avro-distributed.properties/config.storage.topic = ENC[AES/CBC/PKCS5Padding,data:CblF3k1ieNkFJzlJ51qAAA==,iv:dnZwEAm1rpLyf48pvy/T6w==,type:str]
    

Kafka クラスターでの検証

Kafka を実行し、次の手順を実行して、変更された Connect ワーカーを config.storage.topic=newTopicName の暗号化済みの値で起動します。

  1. ZooKeeper と Kafka ブローカーを起動します。

    confluent local services kafka start
    
  2. 変更された Connect ワーカーを実行します。

    connect-distributed connect-avro-distributed.properties > connect.stdout 2>&1 &
    
  3. トピックのリストを作成します。

    kafka-topics --bootstrap-server localhost:9092 --list
    __confluent.support.metrics
    __consumer_offsets
    _confluent-metrics
    connect-offsets
    connect-statuses
    newTopicName   <<<<<<<
    

本稼働環境への移行

これまでに、構成ファイルでマスター暗号化キーと暗号化シークレットの作成方法を説明しました。Confluent では、オーケストレーションツールを拡張して、シークレット保護が機能するために必要なものをすべて送信先ホストに配布することでワークフローを実用化することを推奨しています。これらのホストには、Kafka ブローカー、Connect ワーカー、Confluent Schema Registry インスタンス、ksqlDB サーバー、Confluent Control Center など、パスワード暗号化を使用するあらゆるサービスを含めることができます。CLI には、希望するあらゆるシークレットディストリビューションモデルに対応する柔軟性があります。シークレットの生成と構成の変更は、各送信先ホストで直接実行することも、すべてを 1 つのホストで処理してから暗号化済みシークレットを送信先ホストに配布することもできます。次の 4 つのタスクが必要です。

  1. シークレットが保護されている構成ファイルがあるすべてのホスト環境に、マスター暗号化キーをエクスポートします。
  2. シークレットファイルを配布 : 作業を行っているローカルホストから送信先ホストの /path/to/secrets-remote.txt に、シークレットファイル /path/to/secrets.txt をコピーします。
  3. 必要な構成ファイルの変更を伝播: 構成パラメーターにシークレットのタプルが含まれるように、すべてのホストの構成ファイルをアップデートします。
  4. サービスが既に実行されている場合は、再起動します。

さらに、マスター暗号化キーまたはデータ暗号化キーのローテーションを定期的に行うという要件がある場合もあります。CLI で、次のいずれかを実行できます。データ暗号化キーのローテーションのみを行うには、次のコマンドを実行します。

confluent secret file rotate --data-key --local-secrets-file /path/to/secrets.txt --passphrase @/path/to/passphrase.txt