顧客管理の暗号鍵の使用

Pub/Sub の顧客管理の暗号鍵(CMEK)を使用すると、保存されているメッセージ データへのアクセスの制御を強化できます。メッセージの暗号化に Cloud Key Management Service 暗号鍵を使用するようにトピックを構成できます。

  • デフォルトでは、Google が管理する鍵が使用されます。

  • CMEK では、Cloud KMS を使用して鍵のアクセス権を管理できます。Pub/Sub がメッセージを復号しないようにするには、その鍵を無効にします。

Pub/Sub はエンベロープ暗号化パターンを使用します。このアプローチでは、メッセージは Cloud KMS によって暗号化されません。Cloud KMS は、各トピックの Pub/Sub によって作成されたデータ暗号鍵(DEK)を暗号化するために使用されます。これらの DEK は Pub/Sub によって暗号化またはラップされた形式でのみ保存されます。DEK を保存する前に、サービスによって DEK が Cloud KMS に送信されて、トピックで指定された鍵暗号鍵(KEK)で暗号化されます。新しい DEK は、トピックごとに、約 6 時間おきに生成されます。

Pub/Sub は、サブスクリプションにメッセージをパブリッシュする前に、トピック用に生成された最新の DEK を使用してメッセージを暗号化します。Pub/Sub は、メッセージをサブスクライバーに配信する直前に復号します。

Pub/Sub は Google Cloud サービス アカウントを使用して Cloud KMS にアクセスします。サービス アカウントはプロジェクトごとに Pub/Sub によって内部的に維持され、サービス アカウントのリストには表示されません。サービス アカウントの形式は service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com です。CMEK 機能を有効にするには、Cloud Identity and Access Management の Cloud KMS 暗号鍵の暗号化 / 復号の役割をこのアカウントに付与する必要があります。

CMEK の構成と無効化

トピックの構成

CMEK は、Google Cloud Console または gcloud コマンドライン ツールを使用して構成できます。前提条件として、次のことが必要です。

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

Pub/Sub リソースはグローバルなので、CMEK 対応のトピックを構成するにはグローバルの Cloud KMS 鍵を使用することを強くおすすめします。トピックのパブリッシャーとサブスクライバーのロケーションによっては、リージョンの Cloud KMS 鍵を使用すると、リージョン間のネットワーク リンクに不必要な依存関係が発生することがあります。

Cloud Console の使用

Cloud Console のトピック作成ダイアログを使用して暗号鍵を追加できます。このダイアログにアクセスする方法については、Cloud Console のクイックスタートをご覧ください。

[顧客管理の暗号鍵を選択] プルダウンが表示されない場合は、プロジェクトで KMS API が有効になっていることを確認します。

Cloud Console:

  • Pub/Sub サービス アカウントに適切な権限を維持しながら、Cloud IAM の構成を簡素化します。

  • トピック作成ダイアログ内で暗号化を構成できます。

コマンドラインの使用

次の例は、gcloud コマンドライン ツールを使用して CMEK をトピックに構成する方法を示しています。


   # Grant the Pub/Sub service account the Cloud KMS CryptoKey
   # Encrypter/Decrypter role. This service account is different
   # from the service account you are using to authorize requests to GCP.

   $ gcloud projects add-iam-policy-binding ${PROJECT_ID} --member=\
        "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" \
        --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'

   # Create a topic that uses customer-managed encryption, using the
   # --topic-encryption-key argument to specify the Cloud KMS key to use
   # for protecting message data.

   $ KEY_ID=projects/${PROJECT_ID}/locations/global/keyRings/my-key-ring/cryptoKeys/my-crypto-key
   $ alias pubsub="gcloud pubsub"
   $ pubsub topics create $TOPIC_NAME --topic-encryption-key=$KEY_ID

   # Confirm that the topic is configured for customer-managed encryption,
   # indicated by the presence of the kmsKeyName specified on the topic.

   $ pubsub topics describe $TOPIC_NAME
     name: $TOPIC_NAME
     kmsKeyName: $KEY_ID
     

鍵の無効化と再有効化

Pub/Sub がメッセージ データを復号しないようにするには、次の 2 つの方法があります。

  • 推奨: Pub/Sub を使用してトピックに関連付けられた Cloud KMS 鍵を無効にします。このアプローチは、特定の鍵に関連付けられている Pub/Sub トピックとサブスクリプションにのみ影響します。

  • Cloud IAM を使用して、Pub/Sub サービス アカウント(service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com)から Pub/Sub 暗号鍵の暗号化 / 復号の役割を取り消します。このアプローチは、プロジェクトのすべての Pub/Sub トピックと、CMEK を使用して暗号化されたメッセージを含むサブスクリプションに影響します。

いずれのオペレーションでも即時のアクセス取り消しは保証されませんが、通常は Cloud IAM の変更のほうがより速く反映されます。詳細については、Cloud KMS リソースの整合性Cloud IAM のよくある質問をご覧ください。

Pub/Sub が鍵にアクセスできない場合、streamingPull または pull を使用したメッセージのパブリッシュと配信は、FAILED_PRECONDITION エラーで失敗します。push エンドポイントへのメッセージ配信は停止します。配信とパブリッシュを再開するには、鍵へのアクセスを復元します。

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

Pub/Sub は、鍵の無効化などの意図的なアクションによる鍵の使用不能状態と、Cloud KMS サービスの長期的な使用不能状態を区別することを試みます。Cloud KMS の停止によってパブリッシュと配信が中断されることはほとんどありませんが、使用不能状態は鍵の取り消しと同じ影響を及ぼします。

監査ログ

Cloud KMS は、鍵が有効になったとき、無効になったとき、またはメッセージの暗号化と復号のために Pub/Sub によって鍵が使用されたときに、監査ログを生成します。これは、パブリッシュまたは配信の利用可能性に関する問題のデバッグに役立ちます。

Cloud KMS 鍵は、Pub/Sub トピック リソースの監査ログに関連付けられます。Pub/Sub では他の Cloud KMS 関連情報を含めません。

料金と費用

次の Pub/Sub リクエストについては、CMEK を使用すると、Pub/Sub の料金に基づいて、Cloud KMS サービスへのアクセスに料金が発生します。

  • CMEK を使用する各トピックで、新しい DEK が 6 時間ごとに暗号化されて保存されます。

  • 鍵は、6 分ごとに DEK を復号するために使用されます。復号は 3 回発生します(Pub/Sub サービスが実行されているリージョン内のゾーンごとに 1 回)。

たとえば、次のようなトピックがあるとします。

  • 少なくとも 1 つのサブスクリプション

  • 同じリージョンのパブリッシャーとサブスクライバーのクライアント

Cloud KMS 暗号オペレーションの数は次のように推定できます。

1 key access for ENCRYPT * (30 days / month * 24 hours / day) / 6 hours
 + 3 key accesses for DECRYPT
   * (30 days / month * 24 hours / day * 60 minutes / hour ) / 5 minutes
  = 26,000 Cloud KMS key access events.
暗号オペレーションの 10,000 オペレーションあたりの費用が $0.03 である料金体系では、上記の使用量の費用は約 $0.08 になります。最新の料金情報については、Cloud KMS の料金をご覧ください。

実際には、アクセス パターンに応じて鍵の取得頻度が増減することがあります。この数値は推定値としてのみ使用してください。

モニタリングとトラブルシューティング

鍵のアクセスに関する問題が発生すると、次のような影響があります。

  • メッセージ配信の遅延

  • パブリッシュ エラー

response_classresponse_code でグループ化された次の指標を使用して、パブリッシュ エラーと pull リクエストのエラーをモニタリングします。

  • topic/send_request_count
  • subscription/pull_request_count
  • subscription/streaming_pull_response_count

StreamingPull レスポンスのエラー率は 100% です。これは、リクエストが失敗したことではなく、ストリームが終了したことを示します。StreamingPull をモニタリングするには、FAILED_PRECONDITION レスポンス コードを調べます。

push サブスクリプションの場合、CMEK 固有の配信の問題を直接検出する方法はありません。代替方法は次のとおりです。

  • subscription/num_unacked_messages を使用して push サブスクリプションのバックログのサイズと経過時間をモニタリングします。

  • subscription/oldest_unacked_message_age で異常な増減をモニタリングします。

  • パブリッシュ エラーと CMEK 監査ログを使用して問題を特定します。