顧客管理の暗号鍵の使用

このトピックでは、Cloud KMS の顧客管理の暗号鍵(CMEK)を使用して、Cloud Run サービスにデプロイされたコンテナ イメージを保護する方法について説明します。この機能を使用すると、Cloud Run によってインポートされたコンテナを保存時に CMEK 鍵を使用して保護できます。

次の点に注意してください。

  • ファイルパスなどのファイル メタデータは暗号化されません。
  • Cloud Run サービスのメタデータ(名前や環境変数など)は、指定された鍵ではなく、Google が管理する鍵を使用して暗号化されます。
  • メモリとファイルのコンテンツは実行時に暗号化されません。
  • CMEK 鍵が無効になっている場合、その鍵を使用する既存の Cloud Run リビジョンの新しいインスタンスは起動しません。
  • CMEK 鍵が無効になっている場合は、新しい有効な鍵を使用しない限り、新しい Cloud Run リビジョンのデプロイは失敗します。

CMEK 鍵はユーザーの管理下にあり、Google によって管理されません。鍵が無効化または破棄されると、これらの暗号鍵で保護されたデータにはアクセスできなくなります(Google もアクセスできません)。

CMEK を使用すると監査ログが生成されます。詳しくは、監査ログとエラー メッセージについてをご覧ください。

Cloud KMS の割り当てと Cloud Run

CMEK に保護レベルを設定して、暗号オペレーションをどのように行うかを示すことができます。Cloud Run で CMEK を使用すると、プロジェクトで Cloud KMS 暗号リクエストの割り当てが消費されることがあります。たとえば、CMEK で暗号化されたリポジトリは、アップロードまたはダウンロードごとにこれらの割り当てを消費することがあります。

CMEK 鍵を使用する暗号化と復号のオペレーションは、次のように Cloud KMS の割り当てに影響します。

  • Cloud KMS で生成されたソフトウェア CMEK 鍵の場合、Cloud KMS の割り当ては消費されません。
  • ハードウェア CMEK 鍵(Cloud HSM 鍵とも呼ばれる)の場合、暗号化と復号のオペレーションは、その鍵が含まれるプロジェクトの Cloud HSM の割り当てにカウントされます。
  • 外部 CMEK 鍵(Cloud EKM 鍵とも呼ばれる)の場合、暗号化と復号のオペレーションは、その鍵が含まれるプロジェクトの Cloud EKM の割り当てにカウントされます。

詳細については、Cloud KMS の割り当てをご覧ください。

CMEK の影響を受ける自動スケーリングの動作

顧客管理の暗号鍵を使用すると、Cloud Run サービスの予想される自動スケーリングに影響する可能性があります。たとえば、新しいインスタンスの起動時のレイテンシは、鍵オペレーション中に外部の鍵管理システムと通信する際の遅延によって増大する可能性があります。

次の表は、CMEK 鍵の使用によって発生する可能性のある動作の変化を示しています。

CMEK 関連のオペレーション 自動スケーリングの動作
鍵の無効化 / 破棄 / 取り消し 新しいインスタンスは起動しません。
外部の鍵マネージャーには接続できません 鍵のリクエストを再試行できる場合は、再試行中にインスタンスはシャットダウンされず、新しいインスタンスは起動されません。スケールアウトが想定より遅くなる可能性があります。
鍵リクエストを再試行できない場合は、新しいインスタンスは開始されず、実行中のインスタンスは待機期間後にシャットダウンされます。
KMS の割り当て超過 この割り当てを超えると、RESOURCE_EXHAUSTED エラーがログに記録され、新しいインスタンスが起動されなくなります。追加の割り当てをリクエストすると、この問題を解決できます。

始める前に

Cloud Run が鍵にアクセスできるようにする

Cloud Run で CMEK を使用するには、次の操作を行います。

  1. 既存の Cloud KMS 対称鍵を使用するか、新しい対称鍵を作成します

  2. Cloud Run が鍵にアクセスできるようにするには、Cloud Run サービス エージェントに Cloud KMS 暗号鍵の暗号化 / 復号ロールを付与します。

    コンソール

    1. [暗号鍵] ページに移動

    2. 鍵のキーリングをクリックして、鍵のリストページを開きます。

    3. 鍵を選択して、右側の権限タブの [プリンシパルを追加] をクリックします。

    4. [新しいプリンシパル] フィールドに、Cloud Run のサービス エージェントのメールアドレスをコピーします。次の接尾辞が付いています。

      @serverless-robot-prod.iam.gserviceaccount.com

    5. [ロールを選択] プルダウンで、[Cloud KMS 暗号鍵の暗号化 / 復号] を選択します。

    gcloud

    次の gcloud kms コマンドを使用します。

    gcloud kms keys add-iam-policy-binding KEY_NAME \
    --keyring=KEYRING \
    --location=LOCATION) \
    --member=MEMBER \
    --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'

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

    • KEY_NAME: 鍵の名前。
    • KEYRING: キーリングの名前。
    • LOCATION: リージョンの名前。
    • MEMBER: Cloud Run サービス エージェントのメールアドレス。このアドレスには、@serverless-robot-prod.iam.gserviceaccount.com という接尾辞が付いています。

    IAM ロール roles/cloudkms.cryptoKeyEncrypterDecrypter を付与するには、Google Cloud プロジェクト内の Cloud KMS リソースを管理する権限が必要です。Cloud KMS リソースへのアクセス権を付与または取り消すことができるのは、オーナー(roles/owner)または Cloud KMS 管理者(roles/cloudkms.admin)のロールを持つ IAM メンバーのみです。

Cloud Run サービスに CMEK を構成する

構成を変更すると、新しいリビジョンが作成されます。明示的に更新しない限り、以降のリビジョンでも、この構成が自動的に設定されます。

コンソール

  1. Google Cloud コンソールで、[Cloud Run] に移動します。

    Cloud Run に移動

  2. デプロイ先の新しいサービスを構成する場合は、[サービスを作成] をクリックします。既存のサービスを構成する場合は、サービスをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。

  3. 新しいサービスを構成する場合は、最初のサービス設定のページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックしてサービス構成ページを開きます。

  4. [セキュリティ] タブをクリックします。

    イメージ

    • [暗号化] で、次の操作を行います。
      1. [顧客管理の暗号鍵(CMEK)] を選択します。
      2. [顧客管理の鍵を選択] メニューから、次のいずれかのオプションを選択します。
        • 別のプロジェクトの鍵を使用する必要がある場合は、[プロジェクトを切り替え] を選択します。プロジェクトのサービス アカウントが暗号化と復号のオペレーションで鍵にアクセスできる場合は、別のプロジェクトの鍵を参照できます。

        • [手動でキーを入力] を選択して、プロジェクトのシークレットを projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME の形式で入力します。

        アクセス権がある別のプロジェクトからリソース名をコピーして貼り付けるには:

        • [暗号鍵] ページに移動します。
        • キーリングをクリックします。
        • 選択したキーリング名を選択し、[アクション] をクリックします。
        • メニューから [リソース名をコピー] を選択し、前の手順の [鍵のリソース名] フィールドに貼り付けます。

      3. [キーの取り消し操作] メニューから、次のいずれかのオプションを選択します。
        • 新しいコンテナ インスタンスを禁止します: CMEK 鍵の取り消し後に新しいインスタンスは起動しません。

        • できるだけ早くシャットダウン: CMEK 鍵の取り消し後に、新しいインスタンスは開始されず、既存のインスタンスはシャットダウンされます。

        • カスタムのシャットダウン遅延: サービスがシャットダウンするまでの時間を指定します。

  5. [作成] または [デプロイ] をクリックします。

gcloud

サービスに鍵を設定するには、次のいずれかのコマンドを使用します。

gcloud run deploy SERVICE \
--image IMAGE_URL \
--key KEY \
--post-key-revocation-action-type KEY_REVOCATION_ACTION
--encryption-key-shutdown-hours SHUTDOWN_HOURS
gcloud run services update SERVICE --key KEY
--post-key-revocation-action-type KEY_REVOCATION_ACTION
--encryption-key-shutdown-hours SHUTDOWN_HOURS

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

  • SERVICE: 実際のサービスの名前。
  • IMAGE_URL: コンテナ イメージへの参照(us-docker.pkg.dev/cloudrun/container/hello:latest など)。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式は REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG です。
  • KEY: 鍵の完全修飾名(projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME の形式)。
  • KEY_REVOCATION_ACTION: 鍵取り消しの設定に応じて shut-down または prevent-new
  • SHUTDOWN_HOURS: 取り消し後にサービスがシャットダウンされるまでの遅延時間。

YAML

既存のサービス構成をダウンロードして表示するには、gcloud run services describe --format export コマンドを使用します。読みやすく整えられた結果が YAML 形式で出力されます。次に、下記の手順でフィールドを変更し、gcloud run services replace コマンドを使用して変更後の YAML ファイルをアップロードします。必ず説明されているとおりにフィールドを変更してください。

  1. 次のコマンドで、構成を表示してダウンロードします。

    gcloud run services describe SERVICE --format export > service.yaml
  2. 次の CMEK アノテーションを必要な値に更新します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/encryption-key: projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
            run.googleapis.com/post-key-revocation-action-type: KEY_REVOCATION_ACTION
            run.googleapis.com/encryption-key-shutdown-hours: SHUTDOWN_HOURS
          name: REVISION

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

    • SERVICE: Cloud Run サービスの名前。
    • PROJECT_NAME: 鍵が作成されたプロジェクトの名前。
    • LOCATION: 鍵が作成されたロケーション。Cloud Run サービスのロケーションと一致する必要があります。
    • RING_NAME: キーリングの名前。
    • KEY_NAME: 鍵の名前。
    • KEY_REVOCATION_ACTION: 鍵取り消しの設定に応じて shut-down または prevent-new
    • SHUTDOWN_HOURS: 取り消し後にサービスがシャットダウンされるまでの遅延時間。
    • REVISION を新しいリビジョン名に置き換えるか、削除(存在する場合)します。新しいリビジョン名を指定する場合は、次の条件を満たす必要があります
      • SERVICE- で始まる
      • 小文字、数字、- のみが使用されている
      • 末尾が - ではない
      • 63 文字以内である
  3. 次のコマンドを使用して、サービスを新しい構成に置き換えます。

    gcloud run services replace service.yaml

セキュリティ設定を表示する

Cloud Run サービスの現在のセキュリティ設定を表示するには:

コンソール

  1. Google Cloud コンソールで、[Cloud Run] に移動します。

    Cloud Run に移動

  2. 目的のサービスをクリックして、[サービスの詳細] ページを開きます。

  3. [変更内容] タブをクリックします。

  4. 右側の詳細パネルの [セキュリティ] タブにセキュリティ設定が表示されます。

コマンドライン

  1. 次のコマンドを使用します。

    gcloud run services describe SERVICE
  2. 返された構成で、セキュリティの設定を見つけます。

監査ログとエラー メッセージについて

監査ログのモニタリングを担当している場合、Cloud Run サービスでの CMEK オペレーションの検証がタスクの一つになります。この場合、関連する監査ログを理解する必要があります。

Cloud Run サービスのランタイム エラーへの対応と修正を担当している場合は、Cloud Run サービスのオペレーション中に記録された CMEK 関連のエラーのトラブルシューティングが必要になることがあります。

以降のセクションでは、前述のタスクに必要な情報について説明します。

監査ログ

KMS 監査ログは、鍵で実行されたすべてのオペレーションの監査証跡を提供します。CMEK 対応の Cloud Run サービスの場合、Cloud Run は Cloud Run 固有の呼び出し元コンテキストを追加します。このコンテキストには、顧客の鍵がシステムからアクセスされた詳しい理由が記述されています。次の表に、監査ログに表示されるコンテキストの一覧を示します。

鍵アクセスの理由 説明
Decrypting CMEK-encrypted layer during container clone start. 新しいインスタンスが開始されるたびに記録されます。
Encrypting a newly created data-encryption-key w/ the customer-managed-encryption-key. CMEK 対応サービスのデプロイ時に記録されます。CMEK 鍵は KMS 鍵でラップされます。
Decrypting an existing encrypted data-encryption-key, under the same customer-managed-encryption-key, to be used to encrypt container contents. 新しいインスタンスの起動時に記録されます。イメージの復号が必要です。
Performing an encrypt operation on dummy data to check the customer-managed-encryption-key status and access. 鍵に対して定期的な検証チェックが行われるたびに記録されます。
Performing an decrypt operation on dummy data to check the customer-managed-encryption-key status and access. 鍵に対して定期的な検証チェックが行われるたびに記録されます。

監査ログの形式と内容の詳細については、KMS 監査ロギングのページをご覧ください。

エラー メッセージ

外部鍵マネージャーが提供するエラー メッセージは、サービスの Cloud Run ログに直接渡されます。

次の表に、表示される CMEK 関連のエラー メッセージと、説明、考えられる解決方法を示します。

メッセージ 説明
User's service account does not have CMEK decrypter permission. Service account: %s 解決策: サービスに鍵へのアクセスを許可する
User's KMS operation quota has been exceeded. CMEK key: %s CMEK 対応のサービスが KMS の割り当てを超過しました。解決策: KMS の割り当て増加をリクエストする
User's CMEK key has been disabled. CMEK key: %s CMEK 鍵が取り消されました。解決策: サービスの CMEK 鍵を変更し、サービスを再デプロイします。
User's CMEK key has been destroyed. CMEK key: %s CMEK 鍵が削除されました。解決策: サービスの CMEK 鍵を変更し、サービスを再デプロイします。
User's CMEK key has been scheduled for deletion. CMEK Key: %s CMEK 鍵の削除がスケジュールされました。解決策: サービスの CMEK 鍵を変更し、サービスを再デプロイします。

次のステップ