このトピックでは、Cloud KMS の顧客管理の暗号鍵(CMEK)を使用して、Cloud Run サービスにデプロイされたコンテナ イメージを保護する方法について説明します。この機能を使用すると、Cloud Run によってインポートされたコンテナを保存時に CMEK 鍵を使用して保護できます。
次の点に注意してください。
- ファイルパスなどのファイル メタデータは暗号化されません。
- Cloud Run サービスのメタデータ(名前や環境変数など)は、指定された鍵ではなく、Google が所有し 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 を使用するには、次の操作を行います。
CMEK を使用するように Artifact Registry を構成します。
Artifact Registry の Docker クイックスタートを参照して、Docker リポジトリを作成し、イメージを push します。
既存の Cloud KMS 対称鍵を使用するか、新しい対称鍵を作成します。
Cloud Run が鍵にアクセスできるようにするには、Cloud Run サービス エージェントに Cloud KMS 暗号鍵の暗号化 / 復号ロールを付与します。
コンソール
鍵のキーリングをクリックして、鍵のリストページを開きます。
鍵を選択して、右側の権限タブの [プリンシパルを追加] をクリックします。
[新しいプリンシパル] フィールドに、Cloud Run のサービス エージェントのメールアドレスをコピーします。次の接尾辞が付いています。
PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com。
[ロールを選択] プルダウンで、[Cloud KMS 暗号鍵の暗号化 / 復号] を選択します。
[保存] をクリックします。
gcloud
次の
gcloud kms
コマンドを使用します。gcloud kms keys add-iam-policy-binding KEY_NAME \ --keyring=KEYRING \ --location=LOCATION) \ --member serviceAccount:PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com \ --role='roles/cloudkms.cryptoKeyEncrypterDecrypter'
次のように置き換えます。
- KEY_NAME: 鍵の名前。
- KEYRING: キーリングの名前。
- LOCATION: リージョンの名前。
- PROJECT_NUMBER: Cloud Run サービスをデプロイするプロジェクトのプロジェクト番号。
IAM ロール
roles/cloudkms.cryptoKeyEncrypterDecrypter
を付与するには、Google Cloud プロジェクト内の Cloud KMS リソースを管理する権限が必要です。Cloud KMS リソースへのアクセス権を付与または取り消すことができるのは、オーナー(roles/owner
)または Cloud KMS 管理者(roles/cloudkms.admin
)のロールを持つ IAM メンバーのみです。
Cloud Run サービスに CMEK を構成する
構成を変更すると、新しいリビジョンが作成されます。明示的に更新しない限り、以降のリビジョンでも、この構成が自動的に設定されます。
コンソール
Google Cloud コンソールで、[Cloud Run] に移動します。
[コンテナをデプロイ] をクリックし、[サービス] を選択して、新しいサービスを構成します。既存のサービスを構成する場合は、サービスをクリックし、[新しいリビジョンの編集とデプロイ] をクリックします。
新しいサービスを構成する場合は、最初のサービス設定のページに入力してから、[コンテナ、ボリューム、ネットワーキング、セキュリティ] をクリックしてサービス構成ページを開きます。
[セキュリティ] タブをクリックします。
- [暗号化] で、次の操作を行います。
- [顧客管理の暗号鍵(CMEK)] を選択します。
- [顧客管理の鍵を選択] メニューから、次のいずれかのオプションを選択します。
別のプロジェクトの鍵を使用する必要がある場合は、[プロジェクトを切り替え] を選択します。プロジェクトのサービス アカウントが暗号化と復号のオペレーションで鍵にアクセスできる場合は、別のプロジェクトの鍵を参照できます。
[手動でキーを入力] を選択して、プロジェクトのシークレットを
projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
の形式で入力します。- [暗号鍵] ページに移動します。
- キーリングをクリックします。
- 選択したキーリング名を選択し、[アクション] をクリックします。
- メニューから [リソース名をコピー] を選択し、前の手順の [鍵のリソース名] フィールドに貼り付けます。
- [キーの取り消し操作] メニューから、次のいずれかのオプションを選択します。
新しいコンテナ インスタンスを禁止します: CMEK 鍵の取り消し後に新しいインスタンスは起動しません。
できるだけ早くシャットダウン: CMEK 鍵の取り消し後に、新しいインスタンスは開始されず、既存のインスタンスはシャットダウンされます。
カスタムのシャットダウン遅延: サービスがシャットダウンするまでの時間を指定します。
アクセス権がある別のプロジェクトからリソース名をコピーして貼り付けるには:
- [暗号化] で、次の操作を行います。
[作成] または [デプロイ] をクリックします。
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 の形式はLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
です。 - KEY: 鍵の完全修飾名(
projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
の形式)。 - KEY_REVOCATION_ACTION: 鍵取り消しの設定に応じて
shut-down
またはprevent-new
。 - SHUTDOWN_HOURS: 取り消し後にサービスがシャットダウンされるまでの遅延時間。
YAML
新しいサービスを作成する場合は、この手順をスキップします。既存のサービスを更新する場合は、その YAML 構成をダウンロードします。
gcloud run services describe SERVICE --format export > service.yaml
次の 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/KEYRING_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 サービスのロケーションと一致する必要があります。
- KEYRING_NAME: キーリングの名前。
- KEY_NAME: 鍵の名前。
- KEY_REVOCATION_ACTION: 鍵取り消しの設定に応じて
shut-down
またはprevent-new
。 - SHUTDOWN_HOURS: 取り消し後にサービスがシャットダウンされるまでの遅延時間。
- REVISION を新しいリビジョン名に置き換えるか、削除(存在する場合)します。新しいリビジョン名を指定する場合は、次の条件を満たす必要があります。
SERVICE-
で始まる- 小文字、数字、
-
のみが使用されている - 末尾が
-
ではない - 63 文字以内である
次のコマンドを使用して、サービスを新しい構成に置き換えます。
gcloud run services replace service.yaml
セキュリティ設定を表示する
Cloud Run サービスの現在のセキュリティ設定を表示するには:
コンソール
Google Cloud コンソールで、[Cloud Run] に移動します。
目的のサービスをクリックして、[サービスの詳細] ページを開きます。
[変更内容] タブをクリックします。
右側の詳細パネルの [セキュリティ] タブにセキュリティ設定が表示されます。
gcloud
次のコマンドを使用します。
gcloud run services describe SERVICE
返された構成で、セキュリティの設定を見つけます。
CMEK 取り消しをテストする
次のコマンドを実行して、サービスにアクセスできることを確認します。
curl SERVICE_URL
SERVICE_URL は、サービス URL に置き換えます。これは、デプロイ後にコンソール UI で確認できます。コンテナ URL は「URL:」というテキストの横に表示されます。
指定した SHUTDOWN_HOURS の時間だけ待ちます。鍵を再度有効にするを指定しなかった場合は、値を最小 1 時間に設定してサービスを編集または再デプロイします。
設定した SHUTDOWN_HOURS の時間待機した後、次のコマンドを再実行して、サービスにアクセスできなくなったことを確認します。
curl SERVICE_URL
監査ログとエラー メッセージについて
監査ログのモニタリングを担当している場合、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 a 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 鍵を変更し、サービスを再デプロイします。 |
次のステップ
- Cloud KMS の権限とロールについて学習する。
- 鍵を作成する。
- 監査ログ