顧客管理の暗号鍵の使用

このページでは、Cloud Dataflow で Cloud Key Management Service(Cloud KMS)暗号鍵を使用する方法について説明します。顧客管理の暗号鍵(CMEK)を使用すると、Cloud KMS で管理可能な鍵で保存データを暗号化できます。CMEK で保護されたバッチまたはストリーミング パイプラインを作成できます。また、ソースとシンクで CMEK によって保護されたデータにアクセスできます。

また、Cloud HSM も使用できます。Cloud HSM は、FIPS 140-2 レベル 3 認定 HSM のクラスタで暗号鍵のホスティングや暗号オペレーションを実行できるようにする、クラウドでホストされたハードウェア セキュリティ モジュール(HSM)サービスです。Cloud HSM の追加の割り当ての詳細については、Cloud KMS の割り当てをご覧ください。

詳細については、Google Cloud Platform の暗号化オプションをご覧ください。

始める前に

  1. Apache Beam SDK for Java 2.13.0 以降または Apache Beam SDK for Python 2.13.0 以降を使用していることを確認します。

    詳細については、Apache Beam SDK のインストールをご覧ください。

  2. Cloud Dataflow と Cloud KMS を同じ Google Cloud Platform(GCP)プロジェクトで実行するか、別のプロジェクトで実行するかを決定します。このページでは、次の命名規約を使用します。

    • PROJECT_ID は、Cloud Dataflow を実行しているプロジェクトのプロジェクト ID です。
    • PROJECT_NUMBER は、Cloud Dataflow を実行しているプロジェクトのプロジェクト番号です。
    • KMS_PROJECT_ID は、Cloud KMS を実行しているプロジェクトのプロジェクト ID です。

    GCP プロジェクト ID とプロジェクト番号については、プロジェクトの識別をご覧ください。

  3. Cloud KMS を実行する GCP プロジェクトの場合:

    1. Cloud KMS API を有効化します。
    2. 対称鍵の作成の説明に従って、鍵リングと鍵を作成します。Cloud KMS と Cloud Dataflow はどちらもリージョン サービスです。Cloud Dataflow ワーカー インスタンスのロケーションと一致するロケーションに鍵リングを作成します。

      • region で指定した Cloud Dataflow ジョブに、同じリージョンで使用する鍵を選択します。
      • zone で指定した Cloud Dataflow ジョブに、同じリージョンで使用する鍵を選択します。

暗号化権限と復号権限の付与

  1. Cloud Dataflow サービス アカウントCloud KMS CryptoKey Encrypter/Decrypter 役割を割り当てます。これにより、指定した CMEK で暗号化と復号を行う権限が Cloud Dataflow サービス アカウントに付与されます。Google Cloud Platform Console の [テンプレートからジョブを作成] ページを使用すると、この権限が自動的に付与されるので、この手順は省略できます。

    gcloud コマンドライン ツールを使用して役割を割り当てます。

    gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
    --member serviceAccount:service-PROJECT_NUMBER@dataflow-service-producer-prod.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    KMS_PROJECT_ID は Cloud KMS を実行する GCP プロジェクトの ID に置き換え、PROJECT_NUMBER は Cloud Dataflow リソースを実行する GCP プロジェクトのプロジェクト番号(プロジェクト ID ではありません)で置き換えます。

  2. Compute Engine サービス アカウントCloud KMS CryptoKey Encrypter/Decrypter 役割を割り当てます。これにより、指定した CMEK で暗号化と復号を行う権限が Compute Engine サービス アカウントに付与されます。

    gcloud コマンドライン ツールを使用して役割を割り当てます。

    gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
    --member serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    KMS_PROJECT_ID は Cloud KMS を実行する GCP プロジェクトの ID に置き換え、PROJECT_NUMBER は Compute Engine リソースを実行する GCP プロジェクトのプロジェクト番号(プロジェクト ID ではありません)で置き換えてください。

Cloud KMS で保護されるパイプラインを作成する

バッチまたはストリーミング パイプラインを作成する際に、パイプラインの状態を暗号化する Cloud KMS キーを選択できます。パイプラインの状態は、Cloud Dataflow によって一時ストレージに保存されるデータです。

コマンドライン インターフェース

Cloud KMS キーで保護されるパイプライン状態で新しいパイプラインを作成するには、関連するフラグをパイプライン パラメータに追加します。次の例では、Cloud KMS で保護された単語数カウント パイプラインの実行方法を示しています。

Java

Cloud Dataflow で Cloud KMS 鍵を使用する場合、一時ファイル用にデフォルトの Cloud Storage パスは作成できません。gcpTempLocation を指定する必要があります。

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount \
  -Dexec.args="--inputFile=gs://dataflow-samples/shakespeare/kinglear.txt \
               --output=gs://STORAGE_BUCKET/counts \
               --runner=DataflowRunner --project=PROJECT_ID \
               --gcpTempLocation=gs://STORAGE_BUCKET/tmp \
               --dataflowKmsKey=KMS_KEY"
  -Pdataflow-runner

Python

Cloud Dataflow で Cloud KMS 鍵を使用する場合、一時ファイル用にデフォルトの Cloud Storage パスは作成できません。temp_location を指定する必要があります。

python -m apache_beam.examples.wordcount \
  --input gs://dataflow-samples/shakespeare/kinglear.txt \
  --output gs://STORAGE_BUCKET/counts \
  --runner DataflowRunner \
  --project PROJECT_ID \
  --temp_location gs://STORAGE_BUCKET/tmp/ \
  --dataflow_kms_key=KMS_KEY

Cloud Console

  1. Cloud Dataflow Monitoring UI を開きます。
    Cloud Dataflow ウェブ UI に移動
  2. [テンプレートからジョブを作成] を選択します。
  3. [暗号化] セクションで [顧客管理の暗号鍵] を選択します。
[テンプレートからジョブを作成] ページで Google 管理または顧客管理の暗号鍵を使用するための暗号化オプション。

特定の Cloud KMS 鍵を使用するジョブを最初に実行するときに、その鍵を使用する暗号化または復号を行う権限が Compute Engine サービス アカウントまたは Cloud Dataflow サービス アカウントに付与されていない場合があります。その場合、サービス アカウントに権限を付与するように警告するメッセージが表示されます。

プロンプトが表示され、特定の CMEK を使用して暗号化と復号を行う権限を Compute Engine と Cloud Dataflow のサービス アカウントに付与するかように指示されます。

パイプライン状態アーティファクトの暗号化

ユーザーがキーベースの変換に指定したデータキーを除き、Cloud Dataflow パイプラインがユーザー指定のデータソースから読み取るデータはすべて暗号化されます。

ウィンドウ処理、グループ化、結合などのキーベースのオペレーションで使用されるデータキーは、CMEK 暗号化によって保護されません。これらのキーに個人情報(PII)が含まれている場合は、キーをハッシュ化または変換してから Cloud Dataflow パイプラインに入力する必要があります。CMEK 暗号化では、Key-Value ペアの値が対象範囲になります。

ジョブのメタデータは Cloud KMS 鍵では暗号化されません。ジョブのメタデータには次のものが含まれます。

  • ユーザーが提供するデータ(ジョブ名、ジョブ パラメータ値、パイプライン グラフなど)
  • システムが生成するデータ(ジョブ ID、ワーカーの IP アドレスなど)

暗号化されるパイプライン状態のストレージ

次のストレージは Cloud KMS 鍵で保護されます。

  • Cloud Dataflow ワーカーに接続され、永続ディスクベースのシャッフルとストリーミング状態の保存に使用される永続ディスク。
  • エクスポート データまたはインポート データを一時的に格納する Cloud Storage バケット。Cloud Dataflow は、ユーザーがバケットレベルで設定したデフォルトキーのみをサポートします。
  • パイプライン コードを含むバイナリ ファイルを格納するために使用される Cloud Storage バケット。Cloud Dataflow は、ユーザーがバケットレベルで設定したデフォルトキーのみをサポートします。

現在、Cloud Dataflow Shuffle と Streaming Engine の状態は CMEK で保護できません。これらの状態は、Google が管理する鍵で暗号化されます。すべてのパイプライン状態を CMEK で保護する場合は、これらの機能を使用しないでください。

Cloud KMS 鍵の使用状況の確認

パイプラインが Cloud KMS 鍵を使用しているかどうかを確認するには、GCP Console または gcloud コマンドライン ツールを使用します。

Console

  1. Cloud Dataflow Monitoring UI を開きます。
    Cloud Dataflow ウェブ UI に移動
  2. ジョブの詳細を表示する Cloud Dataflow ジョブを選択します。
  3. [ジョブの概要] セクションの [暗号化のタイプ] フィールドに鍵の種類が表示されます。
    Cloud Dataflow ジョブの詳細が表示されている [ジョブの概要] セクション。
          ジョブが使用している鍵の種類が [暗号化のタイプ] フィールドに表示されています。

CLI

gcloud ツールを使用して describe コマンドを実行します。

gcloud dataflow jobs describe JOB_ID

serviceKmsKeyName を含む行を検索します。この情報があれば、Cloud Dataflow パイプライン状態の暗号化に Cloud KMS 鍵が使用されています。

Cloud Storage と BigQuery の GCP Console のページやツールを使用するか、Cloud KMS 監査ログを参照して、ソースとシンクの暗号化に Cloud KMS 鍵が使用されているかどうかを確認します。

Cloud KMS 鍵に対する Cloud Dataflow のアクセス権の削除

Cloud KMS 鍵に対する Cloud Dataflow のアクセス権を削除するには、次の操作を行います。

  1. GCP Console または プログラムでCloud Dataflow サービス アカウントから Cloud KMS CryptoKey Encrypter/Decrypter 役割を削除します。
  2. GCP Console または プログラムで、Compute Engine サービス アカウントから Cloud KMS CryptoKey Encrypter/Decrypter 役割を削除します。
  3. Cloud Dataflow や他のサービスがパイプライン状態にアクセスしないように、鍵バージョンのマテリアルを破棄することもできます。

鍵バージョンのマテリアルは破棄できますが、鍵と鍵リングは削除できません。 鍵リングと鍵には請求可能な費用や割り当ての制限がないため、これらが存在し続けても費用や本番環境の制限に影響することはありません。

Cloud Dataflow ジョブは、Cloud Dataflow サービス アカウントが指定の Cloud KMS 鍵を正常に使用できるかどうか定期的に検証します。暗号化または復号のリクエストが失敗すると、Cloud Dataflow サービスはデータの取り込みと処理をできるだけ早く停止し、ジョブに接続された GCP リソースのクリーンアップを開始します。

Cloud KMS 鍵で保護されている GCP のソースとシンクの使用

新しいオブジェクトを作成しない限り、Cloud KMS 鍵で保護されているソースとシンクには Cloud KMS 鍵を指定せずにアクセスできます。Cloud Dataflow パイプラインでシンク内に新しいオブジェクトを作成できる場合は、そのシンクの Cloud KMS 鍵を指定するパイプライン パラメータを定義し、この Cloud KMS 鍵を適切な I/O コネクタ メソッドに渡す必要があります。

GCP または Amazon Simple Storage Service(S3)でホストされている Confluent Kafka など、Cloud Dataflow パイプラインのソースとシンクが Cloud KMS で管理されている CMEK をサポートしていない場合、Cloud Dataflow CMEK の設定は関係ありません。

Cloud KMS 鍵の権限

Cloud KMS 鍵で保護されているサービスにアクセスする場合、そのサービスに対する Cloud KMS CryptoKey Encrypter/Decrypter 役割が付与されているかどうかを確認します。アカウントの形式は次のようになります。

  • Cloud Storage: service-{project_number}@gs-project-accounts.iam.gserviceaccount.com
  • BigQuery: bq-{project_number}@bigquery-encryption.iam.gserviceaccount.com
  • Cloud Pub/Sub: service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com

Cloud Storage

TempLocation / temp_locationstagingLocation / staging_location パイプライン パラメータで指定した一時バケットとステージング バケットを保護する場合は、CMEK で保護された Cloud Storage バケットの設定をご覧ください。

BigQuery

Java

BigQueryIO.readTableRows()BigQueryIO.read()BigQueryIO.writeTableRows()BigQueryIO.write() からの戻り値に with_kms_key() メソッドを使用します。

Apache Beam GitHub リポジトリにサンプルがあります。

Python

BigQuerySourceBigQuerySinkkms_key 引数を使用します。

Apache Beam GitHub リポジトリにサンプルがあります。

Cloud Pub/Sub

Cloud Dataflow は、トピックの CMEK 構成を使用して、CMEK で保護されたトピックへのアクセスを処理します。

CMEK で保護された Cloud Pub/Sub トピックの読み取りと書き込みを行う方法については、CMEK を使用するための Cloud Pub/Sub の手順をご覧ください。

料金

Cloud KMS が使用可能なすべての Cloud Dataflow リージョン エンドポイントで、Cloud Dataflow と Cloud KMS 暗号鍵を使用できます。

この統合により、鍵オペレーション以外の追加の費用は発生しません。鍵オペレーションの費用は GCP プロジェクトに課金されます。Cloud Dataflow サービス アカウントが Cloud KMS 鍵を使用するたびに、Cloud KMS 鍵オペレーションのレートでオペレーションが課金されます。

詳細については、Cloud KMS の料金の詳細をご覧ください。