顧客管理の暗号鍵の使用

このページでは、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

Streaming Engine を使用している場合は、ジョブに対して experiment enable_kms_on_streaming_engine も有効にする必要があります。

--experiment=enable_kms_on_streaming_engine

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 の状態。

鍵の無効化または破棄

なんらかの理由でキーの無効化または破棄が必要な場合は、pantheon UI を使用できます。無効化オペレーションと破棄オペレーションでは、どちらもその鍵を使用するジョブをキャンセルします。この操作を取り消すことはできません。

Streaming Engine のオプションを使用している場合は、鍵を無効にする前にジョブのスナップショットを作成することをおすすめします。

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 Audit Logs が使用できます。Dataflow は、ジョブ ID をコンテキストとして Cloud KMS の呼び出し元に提供します。これにより、Dataflow ジョブで使用される特定の Cloud KMS 鍵を各インスタンスで追跡できます。

Cloud Audit Logs では、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 の料金の詳細をご覧ください。

トラブルシューティング

Cloud KMS を検証できないため、ワークフローが失敗する

次のようなエラーが発生する場合があります。

Workflow failed. Causes: Cloud KMS key <key-name> cannot be validated.

この問題を解決するには、鍵の完全なパスを渡していることを確認します。パスは「projects/<project-id>/locations/<gcp-region>/keyRings/<key-ring-name>/cryptoKeys/<key-name>」のような形式になります。鍵のパスに入力ミスがないか確認します。

Cloud KMS 鍵の権限が拒否されたため、ワークフローが失敗する

次のようなエラーが発生する場合があります。

Workflow failed. Causes: Cloud KMS key Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource
'projects/<project-id>/locations/<gcp-region>/keyRings/<key-ring-name>/cryptoKeys/<key-name>' (or it may not exist). cannot be validated.

この問題を解決するには、キーパスに含まれるプロジェクト ID が正しいことを確認します。また、鍵を使用するための権限があることを確認します。

Cloud KMS 鍵のロケーションが Dataflow ジョブのロケーションと一致しないため、ワークフローが失敗する

次のようなエラーが発生する場合があります。

Workflow failed. Causes: Cloud KMS key projects/<project-id>/locations/<gcp-region>/keyRings/<key-ring-name>/cryptoKeys/<key-name>
can't protect resources for this job. Please make sure the KMS key's region matches the dataflow region.

リージョン鍵を使用している場合は、KMS 鍵がデータフロー ジョブと同じリージョンにあることを確認します。