このページでは、Backup for GKE における顧客管理の暗号鍵(CMEK)のサポートについて説明します。
概要
Backup for GKE を介して生成され、保存されるユーザーデータのアーティファクトには、次の 2 種類があります。
- 構成のバックアップ: クラスタの状態をキャプチャして、バックアップを実行するクラスタの API サーバーから抽出された一連の Kubernetes リソースの説明。
- ボリュームのバックアップ: 構成のバックアップにある
PersistentVolumeClaim
リソースに対応するボリュームのバックアップのセット。
デフォルトでは、Backup for GKE によって生成されたすべてのバックアップ アーティファクトは、Google 提供の鍵を使用して保存時に暗号化されます。
ただし、これらのアーティファクトは、Cloud Key Management Service を介して管理される顧客管理の暗号鍵(CMEK)を使用して暗号化することもできます。
CMEK 暗号化を有効にする
CMEK の暗号化を有効にするには、2 つの手順を実施します。
BackupPlan
用に生成されたバックアップを暗号化する鍵を指定します。適切なサービス アカウントで適切な鍵へのアクセスを許可します。
特定のバックアップ シナリオでは、次の 3 つの CMEK 鍵が関係する可能性があります。
bplan_key
:BackupPlan
を作成または更新するときに参照する鍵です。可能な場合は、すべてのバックアップ アーティファクトを暗号化する際に使用されます。この鍵は、BackupPlan
自体と同じリージョンに存在する必要があります(リソースのロケーションについてをご覧ください)。orig_disk_key
: CMEK 鍵を使用して永続ディスク ボリュームを暗号化している場合は、これらのボリュームに対して Backup for GKE が生成するボリューム バックアップは、別の鍵がBackupPlan
に登録されていても、この鍵で暗号化されます。new_disk_key
: バックアップから復元したボリュームの暗号化に使用する CMEK 鍵です。これは、復元のターゲット クラスタのStorageClass
によって参照されます。
次に挙げる 4 つのサービス アカウントが、CMEK 鍵へのアクセスを必要とする可能性があります。
agent_robot
: このサービス アカウントには、bplan_key
へのアクセス権を付与する必要があります。このサービス アカウントの形式は、service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
です。ここで、PROJECT_NUMBER
は Google Cloud プロジェクトの番号です。non_cmek_service_agent
: CMEK 暗号化されていないボリュームをバックアップする場合は、このサービス アカウントにbplan_key
へのアクセス権を付与する必要があります。このサービス アカウントの形式は、service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com
です。ここで、PROJECT_NUMBER
は Google Cloud プロジェクトの番号です。cmek_service_agent
: CMEK 暗号化ボリュームをバックアップする場合は、このサービス アカウントにorig_disk_key
へのアクセス権を付与する必要があります。このサービス アカウントの形式は、service-TENANT_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
です。ここで、TENANT_PROJECT_NUMBER
はBackupPlan
に割り当てられたテナント プロジェクトの番号です。compute_service_agent
: このサービス アカウントは、クラスタ用に、暗号化された新しいボリュームを作成するときに使用され、new_disk_key
へのアクセス権を付与する必要があります。このサービス アカウントの形式は、service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
です。ここで、PROJECT_NUMBER
は Google Cloud プロジェクトの番号です。
ディスクに diskEncryptionKey.kmsKeyServiceAccount が設定されている場合は、バックアップを作成する前に次の操作を行う必要があります。
組織のポリシー
iam.disableCrossProjectServiceAccountUsage
を無効にして、プロジェクト間でのサービス アカウントの権限借用を有効にします。gcloud resource-manager org-policies disable-enforce \ iam.disableCrossProjectServiceAccountUsage --project=PROJECT_ID
有効期間の短い認証情報を作成するために、
cmek_service_agent
にroles/iam.serviceAccountTokenCreator
ロールを付与します。gcloud iam service-accounts add-iam-policy-binding \ # Replace the email with the value from # `diskEncryptionKey.kmsKeyServiceAccount` your-kms-key-service-acount@PROJECT_ID.iam.gserviceaccount.com \ --member=service-TENANT_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
次の表では、さまざまなシナリオにおいて、どのサービス アカウントにどの鍵へのアクセス権を付与する必要があるかを示します。
アーティファクト | サービス アカウント | キー |
---|---|---|
config backup cluster | agent_robot | bplan_key |
CMEK 暗号化ボリュームのバックアップ | cmek_service_agent | orig_disk_key |
Google 暗号化ボリュームのバックアップ | non_cmek_service_agent | bplan_key |
復元中に作成された新しい CMEK 暗号化ボリューム | Compute サービス エージェント | new_disk_key |
鍵へのアクセス権は、プロジェクト レベルで付与する(そのプロジェクトにあるすべての鍵へのアクセス権を付与する)か、個別に鍵へのアクセス権を付与するかを選択できます。
プロジェクト レベルのアクセス権を付与する
鍵へのアクセス権は、プロジェクト レベルで付与できます。これにより、そのプロジェクト内のすべての鍵へのアクセス権が付与されます。
プロジェクト レベルでアクセス権を付与する手順は次のとおりです。
Console
Google Cloud コンソールの [IAM] ページに移動します。
[アクセス権を付与] をクリックします。
[新しいプリンシパル] フィールドに、サービス アカウントのメールアドレスを入力します。
[ロールを選択] リストで、[Cloud KMS 暗号鍵の暗号化/復号] ロールを選択します。
[保存] をクリックします。
gcloud
プロジェクト レベルでアクセス権を付与します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
次のように置き換えます。
PROJECT_ID
: アクセス権を付与するプロジェクトの ID。PROJECT_NUMBER
: アクセス権を付与するプロジェクトの数。
Terraform
プロジェクト レベルでアクセス権を付与します。
resource "google_project_iam_member" "example_iam_member" { project = "PROJECT_ID" role = "roles/cloudkms.cryptoKeyEncrypterDecrypter" member = "serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com" }
次のように置き換えます。
PROJECT_ID
: アクセス権を付与するプロジェクトの ID。PROJECT_NUMBER
: アクセス権を付与するプロジェクトの数。
鍵レベルでアクセス権を付与する
次の手順に沿って、個々の鍵レベルでアクセス権を付与します。
Console
Google Cloud コンソールで、[鍵管理] ページに移動します。
キーリングの名前をクリックします。
鍵の名前をクリックします。
[権限] タブをクリックします。
[アクセス権を付与] をクリックします。
[新しいプリンシパル] フィールドに、サービス アカウントのメールアドレスを入力します。
[ロールを選択] リストで、[Cloud KMS 暗号鍵の暗号化/復号] ロールを選択します。
[保存] をクリックします。
gcloud
個々の鍵レベルでアクセス権を付与します。
gcloud kms keys add-iam-policy-binding KEY_NAME \ --keyring KEY_RING \ --location LOCATION \ --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com" \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
次のように置き換えます。
KEY_NAME
: 鍵の名前KEY_RING
: 鍵を含むキーリングの名前。LOCATION
: キーリングの Cloud KMS のロケーションPROJECT_NUMBER
: アクセス権を付与するプロジェクトの数。
Terraform
個々の鍵レベルでアクセス権を付与します。
resource "google_kms_crypto_key_iam_member" "crypto_key_iam_member" { crypto_key_id = "projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME" role = "roles/cloudkms.cryptoKeyEncrypterDecrypter" member = "serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com" }
次のように置き換えます。
PROJECT_ID
: アクセス権を付与するプロジェクトの ID。LOCATION
: キーリングの Cloud KMS のロケーションKEY_RING
: 鍵を含むキーリングの名前。KEY_NAME
: 鍵の名前PROJECT_NUMBER
: アクセス権を付与するプロジェクトの数。
使用上の検討事項と制限事項
CMEK 暗号化ボリュームをバックアップするには、
BackupPlan
で CMEK 暗号化を有効にしない場合でも、そのディスクの鍵へのアクセス権を付与する必要があります。バックアップにアクセスしている間でも、リージョンが停止しても鍵へのアクセス権が解除されないように、CMEK 鍵は
BackupPlan
と同じリージョンに存在する必要があります。ただし、この制約は、暗号化ボリュームと共有される鍵には適用できません。暗号化されたボリュームが関与する場合は、ディスク暗号鍵がバックアップと同じリージョンに格納されないことがあるため、バックアップが使用可能な場合でも復元が失敗する可能性があります。
外部鍵の使用と管理
Cloud External Key Manager(Cloud EKM)を使用して、外部鍵を作成して管理できます。外部鍵は、Google Cloud の外部にある鍵へのポインタです。これらの鍵は、サポートされている外部鍵管理パートナーに保存されます。詳細については、Cloud External Key Manager をご覧ください。
Cloud EKM で外部鍵を作成したら、新しいバックアップ プランを作成するときにその鍵の ID を指定して、新しいバックアップ プランに適用できます。この手順は、新しいバックアップ プランに Cloud KMS 鍵を適用する場合と同じです。
Cloud EKM の一部として、Key Access Justifications を使用できます。Key Access Justifications を使用すると、Cloud EKM リクエストの理由を確認できます。さらに、示された理由に基づいて、リクエストを自動的に承認または拒否できます。詳細については、概要をご覧ください。