Compute Engine永続ディスクでのCMEKの有効化について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、gcloud CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、Compute Engine永続ディスクでカスタマー管理の暗号鍵(CMEK)による暗号化が無効化されている問題について、リスクと対策を解説します。

ポリシーの説明
Google Cloud Compute Engineの永続ディスクは、デフォルトでGoogleが管理する暗号鍵で暗号化されています。しかし、より高度なセキュリティ要件を満たすためには、Cloud KMS(Key Management Service)を使用したカスタマー管理の暗号鍵(CMEK)による暗号化が推奨されます。CMEKを使用することで、暗号鍵のライフサイクル管理、アクセス制御、監査ログの取得など、組織のセキュリティポリシーに沿った暗号化管理が可能になります。
修復方法
コンソールでの修復手順
Google Cloud コンソールを使用して、永続ディスクにCMEK暗号化を設定します。
- Cloud KMSの準備
- Google Cloud Consoleにログインします。
- ナビゲーションメニューから「セキュリティ」→「Key Management」を選択します。
- 「キーリングを作成」をクリックします。
- キーリング名(例:compute-disk-keyring)とロケーションを指定します。
- 「作成」をクリックします。
- 暗号鍵の作成
- 作成したキーリングを選択します。
- 「鍵を作成」をクリックします。
- 鍵名(例:disk-encryption-key)を入力します。
- 保護レベル:「ソフトウェア」または「HSM」を選択します。
- 目的:「対称暗号化/復号化」を選択します。
- ローテーション期間:90日(推奨)を設定します。
- 「作成」をクリックします。
- Compute Engine サービスアカウントへの権限付与
- 作成した鍵を選択します。
- 「権限」タブをクリックします。
- 「アクセス権を付与」をクリックします。
- プリンシパル:
service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com
- ロール:「Cloud KMS 暗号鍵の暗号化/復号化」を選択します。
- 「保存」をクリックします。
- 新規ディスクの作成(CMEK適用)
- 「Compute Engine」→「ディスク」に移動します。
- 「ディスクを作成」をクリックします。
- 基本設定を入力します。
- 「暗号化」セクションで「顧客管理の暗号鍵」を選択します。
- 作成した暗号鍵を選択します。
- 「作成」をクリックします。
- 既存ディスクの移行
- 既存ディスクのスナップショットを作成します。
- スナップショットから新規ディスクを作成(上記手順4でCMEKを適用)します。
- VMインスタンスを停止します。
- 古いディスクをデタッチし、新しいCMEK暗号化ディスクをアタッチします。
- VMインスタンスを起動します。
Terraformでの修復手順
永続ディスクのCMEK暗号化を有効にするTerraformコードと、主要な修正ポイントを説明します。
# Cloud KMSキーリングの作成
resource "google_kms_key_ring" "disk_keyring" {
name = "compute-disk-keyring"
location = var.region
}
# 暗号鍵の作成
resource "google_kms_crypto_key" "disk_key" {
name = "disk-encryption-key"
key_ring = google_kms_key_ring.disk_keyring.id
rotation_period = "7776000s" # 90日
lifecycle {
prevent_destroy = true # 誤削除防止
}
version_template {
algorithm = "GOOGLE_SYMMETRIC_ENCRYPTION"
protection_level = "SOFTWARE" # または "HSM" for higher security
}
}
# Compute Engineサービスアカウントへの権限付与
data "google_project" "current" {}
resource "google_kms_crypto_key_iam_member" "compute_engine" {
crypto_key_id = google_kms_crypto_key.disk_key.id
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
member = "serviceAccount:service-${data.google_project.current.number}@compute-system.iam.gserviceaccount.com"
}
# CMEK暗号化を使用した永続ディスクの作成
resource "google_compute_disk" "encrypted_disk" {
name = "cmek-encrypted-disk"
type = "pd-ssd" # または "pd-standard"
zone = var.zone
size = 100
# CMEK暗号化の設定
disk_encryption_key {
kms_key_self_link = google_kms_crypto_key.disk_key.id
}
# スナップショットからの作成(既存ディスクの移行時)
# snapshot = google_compute_snapshot.source_snapshot.id
}
# CMEK暗号化ディスクを使用したVMインスタンス
resource "google_compute_instance" "vm_with_cmek" {
name = "cmek-protected-vm"
machine_type = "e2-medium"
zone = var.zone
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
size = 20
type = "pd-standard"
}
# ブートディスクもCMEK暗号化
disk_encryption_key {
kms_key = google_kms_crypto_key.disk_key.id
}
}
# 追加ディスクのアタッチ
attached_disk {
source = google_compute_disk.encrypted_disk.id
mode = "READ_WRITE"
}
network_interface {
network = "default"
}
}
# 組織ポリシーによるCMEK強制(オプション)
resource "google_organization_policy" "require_cmek" {
org_id = var.organization_id
constraint = "compute.requireCmekEncryption"
list_policy {
allow {
all = true
}
}
}
# 既存ディスクの移行用スナップショット
resource "google_compute_snapshot" "migration_snapshot" {
name = "pre-cmek-snapshot"
source_disk = "existing-disk-id"
zone = var.zone
snapshot_encryption_key {
kms_key_self_link = google_kms_crypto_key.disk_key.id
}
}
最後に
この記事では、Compute Engine永続ディスクでカスタマー管理の暗号鍵(CMEK)による暗号化が無効化されている問題について、リスクと対策を解説しました。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。