顧客管理の暗号鍵の使用

このページでは、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 での暗号化オプションをご覧ください。

始める前に

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

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

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

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

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

  3. Cloud KMS を実行する Google Cloud プロジェクトで次の操作を行います。

    1. Cloud KMS API を有効化します。
    2. 対称鍵の作成の説明に従って、鍵リングと鍵を作成します。Cloud KMS と Dataflow はどちらもリージョン サービスです。CMEK のリージョンと Dataflow ジョブのリージョン エンドポイントは同じである必要があります。

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

  1. Dataflow サービス アカウントCloud KMS CryptoKey Encrypter/Decrypter ロールを割り当てます。これにより、指定した CMEK で暗号化と復号を行う権限が Dataflow サービス アカウントに付与されます。Google Cloud 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 を実行している Google Cloud プロジェクトの ID に置き換えます。PROJECT_NUMBER は、Dataflow リソースを実行している Google Cloud プロジェクトのプロジェクト番号(プロジェクト 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 を実行している Google Cloud プロジェクトの ID に置き換えます。PROJECT_NUMBER は、Compute Engine リソースを実行している Google Cloud プロジェクトのプロジェクト番号(プロジェクト ID ではない)に置き換えます。

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

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

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

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

Java

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

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. Dataflow モニタリング UI を開きます。
    Dataflow ウェブ UI に移動
  2. [テンプレートからジョブを作成] を選択します。
  3. [暗号化] セクションで [顧客管理の暗号鍵] を選択します。
[テンプレートからジョブを作成] ページで Google 管理または顧客管理の暗号鍵を使用するための暗号化オプション。

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

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

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

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

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

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

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

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

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

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

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

Cloud KMS 鍵の使用状況の確認

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

Console

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

CLI

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

gcloud dataflow jobs describe JOB_ID

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

Pub/Sub、Cloud Storage、BigQuery などのソースとシンクの Cloud Console のページやツールを使用して、ソースとシンクの暗号化に Cloud KMS 鍵が使用されているかどうかを確認できます。Cloud KMS 監査ログを表示して、Cloud KMS 鍵の使用状況を確認することもできます。

監査ロギング Cloud KMS 鍵の使用

Dataflow では、Cloud KMS で暗号化や復号などの鍵オペレーションを記録する Cloud 監査ログが使用できます。Dataflow は、ジョブ ID をコンテキストとして Cloud KMS の呼び出し元に提供します。これにより、Dataflow ジョブで使用される特定の Cloud KMS 鍵を各インスタンスで追跡できます。

Cloud 監査ログでは、Google Cloud のプロジェクト、フォルダ、組織ごとに監査ログが保存されます。Cloud KMS の監査ログを表示する方法はいくつかあります。

Cloud KMS は、Dataflow ジョブの管理アクティビティ監査ログを CMEK 暗号化して書き込みます。これにより、リソースの構成やメタデータを変更するオペレーションが記録されます。管理アクティビティ監査ログは無効にできません。

明示的に有効にした場合、Cloud KMS は、Dataflow ジョブのデータアクセス監査ログを CMEK 暗号化して書き込みます。データアクセス監査ログには、リソースの構成やメタデータを読み取る API 呼び出しや、ユーザー提供のリソースデータの作成、変更、読み取りを行うユーザー主導の API 呼び出しが含まれます。データアクセス監査ログの一部または全部を有効にする方法については、データアクセス ログの構成をご覧ください。

Dataflow の Cloud KMS 鍵へのアクセス権を取り消す

Dataflow の Cloud KMS 鍵へのアクセス権を削除する方法は次のとおりです。

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

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

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

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

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

Google Cloud または Amazon Simple Storage Service(S3)でホストされている Confluent Kafka など、Dataflow パイプラインのソースとシンクが Cloud KMS で管理されている CMEK をサポートしていない場合、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
  • 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 リポジトリにサンプルがあります。

Pub/Sub

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

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

料金

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

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

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