メッセージ暗号化の構成

このドキュメントでは、Google Cloud Managed Service for Apache Kafka クラスタに顧客管理の暗号鍵(CMEK)を構成する方法について説明します。

Managed Service for Apache Kafka は、デフォルトで Google-owned and Google-managed encryption keys を使用して保存時のメッセージを暗号化します。 Google-owned and Google-managed encryption keysを使用するために追加の設定は必要ありません。

CMEK について

CMEK は、ユーザーが所有し、Cloud Key Management Service(Cloud KMS)で管理および保存される暗号鍵です。Managed Service for Apache Kafka の保存データを保護するために使用する暗号鍵をより詳細に制御する必要がある場合は、CMEK を使用できます。

CMEK を使用して Managed Service for Apache Kafka クラスタを構成すると、サービスは指定された鍵を使用して、保存されているすべてのクラスタデータを自動的に暗号化します。CMEK の Cloud KMS の使用量によっては、使用パターンに応じて追加費用が発生する場合があります。

Managed Service for Apache Kafka クラスタに関連付けられている CMEK は、鍵暗号鍵(KEK)です。KEK は、データ暗号鍵(DEK)の暗号化に使用されます。DEK は、ブローカーに接続された永続ディスク上の保存データと、Cloud Storage の階層型ストレージ内のデータの読み取りと書き込みに使用されます。

ディスク暗号化の詳細については、ディスクの暗号化についてをご覧ください。Cloud Storage での暗号化の詳細については、Cloud Storage ドキュメントの顧客管理の暗号鍵をご覧ください。

鍵のローテーション

キーをローテーションするには、新しいキー バージョンを作成して、キーのプライマリとして設定します。

ブローカーにアタッチされたディスクの場合、新しい KEK はブローカーが再起動された後にのみ有効になります。クラスタの容量構成を更新することで、ブローカーのローリング再起動を強制的に行うことができます。たとえば、クラスタの RAM 容量を変更できます。

新しいパーティション セグメント ファイルはすべて、新しいメインの鍵バージョンを使用して階層型ストレージに書き込まれます。新しい主キー バージョンが選択された後、数分遅延することがあります。

CMEK 用に Managed Service for Apache Kafka クラスタを構成する

Managed Service for Apache Kafka クラスタの CMEK は、Google Cloud コンソールまたは Google Cloud CLI を使用して構成できます。

始める前に

次の作業を行います。

  • Cloud KMS API を有効化します。

  • Cloud KMS でキーリングと鍵を作成します。鍵とキーリングは削除できません。Managed Service for Apache Kafka リソースはリージョン リソースであるため、Kafka クラスタが配置されているリージョンと同じリージョンに CMEK を作成することをおすすめします。

これらのタスクを行う方法については、Cloud KMS クイックスタート ガイドをご覧ください。

CMEK の構成に必要なロールと権限

Managed Service for Apache Kafka は、 Google Cloud サービス エージェントを使用して Cloud KMS にアクセスします。 Google Cloudプロジェクトのサービス エージェントは、最初の Managed Service for Apache Kafka クラスタを作成した後に自動的に作成されます。

サービス エージェントは、プロジェクトごとに Managed Service for Apache Kafka によって内部的に維持されます。デフォルトでは、 Google Cloud コンソールの [サービス アカウント] ページには表示されません。

Managed Service for Apache Kafka サービス エージェントの形式は service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com です。

Managed Service for Apache Kafka では、CMEK を使用してデータを暗号化および復号するために特定の権限が必要です。

必要なアクセス権を設定する手順は次のとおりです。

  1. 省略可: gcloud beta services identity create コマンドを使用して、Managed Service for Apache Kafka サービス エージェントを手動で作成します。

    プロジェクトでクラスタをすでに作成している場合は、Managed Service for Apache Kafka サービス エージェントがプロジェクトにすでに作成されているため、この手順をスキップできます。

    gcloud beta services identity create \
        --service=managedkafka.googleapis.com \
        --project=PROJECT_ID
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  2. Managed Service for Apache Kafka サービス エージェントに Cloud KMS Crypto Key Encrypter/Decrypter(roles/cloudkms.cryptoKeyEncrypterDecrypter)ロールを付与します。

    gcloud kms keys add-iam-policy-binding CLOUD_KMS_KEY_NAME \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-managedkafka.iam.gserviceaccount.com \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    次のように置き換えます。

    • CLOUD_KMS_KEY_NAME: Cloud KMS 鍵の名前

      キーの形式は projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY です。

      たとえば、projects/test-project/locations/us-central1/keyRings/test-keyring/cryptoKeys/test-key です。

    • PROJECT_NUMBER: Managed Service for Apache Kafka プロジェクトのプロジェクト番号。

IAM ロールの付与の詳細については、リソースに対するロールの付与をご覧ください。

CMEK を使用してクラスタを作成する

Kafka クラスタの作成時に暗号鍵を追加するには、 Google Cloud コンソールまたは gcloud CLI を使用します。

Enable the Apache Kafka for BigQuery, Compute Engine, Cloud DNS, and Cloud KMS APIs.

Roles required to enable APIs

To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

Enable the APIs

クラスタを作成する前に、クラスタ プロパティのドキュメントを確認してください。

CMEK を使用してクラスタを作成する手順は次のとおりです。

コンソール

  1. Google Cloud コンソールで、[クラスタ] ページに移動します。

    [クラスタ] に移動

  2. [作成] を選択します。

    [Kafka クラスタの作成] ページが開きます。

  3. [クラスタ名] に文字列を入力します。

    クラスタの命名方法の詳細については、 Managed Service for Apache Kafka リソースの命名ガイドラインをご覧ください。

  4. [ロケーション] に、サポートされているロケーションを入力します。

    サポートされているロケーションの詳細については、 サポートされている Managed Service for Apache Kafka のロケーションをご覧ください。

  5. [容量構成] で、[メモリ] と [vCPU] の値を入力します。

    vCPU とメモリの比率は 1:1 ~ 1:8 の範囲にする必要があります。

    Managed Service for Apache Kafka クラスタのサイズ設定方法については、 Kafka クラスタのサイズを計画するをご覧ください。

  6. [ネットワーク構成] に、次の詳細を入力します。
    1. プロジェクト: サブネットワークが配置されているプロジェクト。サブネットはクラスタと同じリージョンに存在する必要がありますが、プロジェクトは異なっていてもかまいません。
    2. ネットワーク: サブネットが接続されているネットワーク。
    3. サブネットワーク: サブネットの名前。
    4. サブネットの URI パス: このフィールドは自動的に入力されます。または、ここにサブネット パスを入力することもできます。サブネットの名前は、projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_ID の形式にする必要があります。
    5. [完了] をクリックします。
  7. (省略可)[接続されたサブネットを追加] をクリックして、サブネットを追加します。

    サブネットは最大 10 個まで追加できます。

  8. [暗号化] で、[Cloud KMS 鍵] を選択します。
  9. [鍵のタイプ] で [Cloud KMS] を選択し、[顧客管理の鍵を選択] に作成した CMEK を入力します。
  10. [作成] をクリックします。

gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  1. gcloud managed-kafka clusters create コマンドを実行します。

    gcloud managed-kafka clusters create CLUSTER_ID \
        --location=LOCATION \
        --cpu=CPU \
        --memory=MEMORY \
        --subnets=SUBNETS \
        --encryption-key=CLOUD_KMS_KEY \

    次のように置き換えます。

    • CLUSTER_ID: クラスタの ID または名前。

      クラスタの命名方法の詳細については、 Managed Service for Apache Kafka リソースの命名ガイドラインをご覧ください。

    • LOCATION: クラスタのロケーション。

      サポートされているロケーションの詳細については、 サポートされている Managed Service for Apache Kafka のロケーションをご覧ください。

    • CPU: クラスタの仮想 CPU の数。vCPU とメモリの比率は 1:1 ~ 1:8 の範囲にする必要があります。

      Managed Service for Apache Kafka クラスタのサイズ設定方法については、 Kafka クラスタのサイズを計画するをご覧ください。

    • MEMORY: クラスタのメモリ容量。「MB」、「MiB」、「GB」、「GiB」、「TB」、「TiB」の単位を使用します。たとえば、「10GiB」のようにします。

    • SUBNETS: 接続するサブネットのリスト。複数のサブネット値を指定する場合は、カンマで区切ります。

      サブネットの形式は projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_ID です。

    • ENCRYPTION_KEY: クラスタに使用する CMEK の ID。

      形式は projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/CRYPTO_KEY です。

クラスタの作成を確認する

gcloud managed-kafka clusters describe コマンドを実行して、クラスタが CMEK 用に構成されていることを確認します。

gcloud managed-kafka clusters describe CLUSTER_ID \
    --location=LOCATION

出力には、構成された CMEK が含まれます。

監査ログ

鍵の有効化または無効化を行うと、Cloud KMS により監査ログが生成されます。このログは、メッセージの暗号化または復号で Managed Service for Apache Kafka が鍵を使用したときにも生成されます。これは、パブリッシュまたは配信の利用可能性に関する問題のデバッグに役立ちます。

Cloud KMS 鍵 ID は、Managed Service for Apache Kafka クラスタ リソースの監査ログに関連付けられます。Managed Service for Apache Kafka では、監査ログに他の Cloud KMS 関連情報を含めません。

CMEK を無効にしてから再度有効にする

CMEK を無効にする方法は 2 つあります。次のいずれかを行います。

  • クラスタに関連付けられている Cloud KMS 鍵を無効にします。このアプローチは、その鍵に関連付けられているすべての Cloud リソースに影響します。

  • Identity and Access Management(IAM)を使用して、Managed Service for Apache Kafka サービス エージェント(service-${PROJECT_NUMBER}@gcp-sa-managedkafka.iam.gserviceaccount.com)から暗号鍵の暗号化/復号のロールを取り消します。このアプローチは、プロジェクト内のすべての Managed Service for Apache Kafka クラスタと、CMEK を使用して暗号化されたメッセージに影響します。

いずれのオペレーションでも即時のアクセス取り消しは保証されませんが、通常は IAM の変更のほうがより速く反映されます。

詳細については、Cloud KMS リソースの整合性アクセス権の変更の伝播をご覧ください。

Managed Service for Apache Kafka が Cloud KMS 鍵にアクセスできない場合、メッセージのパブリッシュと配信はエラーで失敗します。配信とパブリッシュを再開するには、Cloud KMS 鍵へのアクセスを復元します。

Cloud KMS 鍵が Managed Service for Apache Kafka にアクセスできるようになると、パブリッシュは 12 時間以内に利用可能になり、メッセージの配信は 2 時間以内に再開します。

Cloud KMS が 1 分未満で断続的に停止しても、公開と配信が大幅に中断されることはありませんが、Cloud KMS が長期にわたって使用不能になった場合は鍵の取り消しと同じ影響が及ぼされます。

制限事項

  • Cloud KMS 鍵と Managed Service for Apache Kafka クラスタの関連付けは変更できません。クラスタに関連付けられているキーは変更できません。代わりに、新しいバージョンを作成して鍵をローテーションできます。

  • プライマリ以外の鍵バージョンを無効にしても、ローカル ディスクは変更なしで引き続き機能します。各ブローカーは、再起動時に新しい KEK をダウンロードします。ただし、Cloud Storage は元のバージョンで暗号化されたトピック セグメント ファイルにアクセスできません。そのため、これらのセグメント ファイルからメッセージを消費できない可能性があります。つまり、古いデータを使用できなくなる可能性があります。

  • 鍵のメインのバージョンを無効にすると、ブローカーは階層化ストレージに新しいセグメント ファイルを書き込むことができなくなり、ローカル ディスクの使用率が増加します。また、ブローカーの再起動も失敗します。再起動は、ユーザーが事前にトリガーすることも、サービスが開始したクラスタの更新によっていつでもトリガーすることもできます。

  • Managed Service for Apache Kafka サービス エージェントから鍵へのアクセス権を削除すると、プライマリ鍵と非プライマリ鍵の両方のバージョンを無効にした場合と同様の動作になります。

  • 鍵を削除すると、クラスタはシャットダウンがスケジュール設定され、復元できません。

  • 保存データの再暗号化をリクエストすることはできません。CMEK は KEK として使用されますが、再暗号化にはデータ暗号鍵の変更が必要です。

Apache Kafka® は、Apache Software Foundation または米国その他の諸国における関連会社の商標です。