📖

Cloud KMS for Cloud SQL, GKE

2025/03/02に公開

Cloud KMS(Key Management Service)をGKEとCloud SQLで使用する例についてTerraformコードで説明します。

1. Cloud KMSの基本設定

まず、基本的なCloud KMSの設定を行います:

# KMSキーリングの作成
resource "google_kms_key_ring" "keyring" {
  name     = "my-keyring"
  location = "asia-northeast1"
}

# 暗号鍵の作成(GKE用)
resource "google_kms_crypto_key" "gke_key" {
  name     = "gke-key"
  key_ring = google_kms_key_ring.keyring.id
  purpose  = "ENCRYPT_DECRYPT"
  
  rotation_period = "7776000s"  # 90日
  
  version_template {
    algorithm        = "GOOGLE_SYMMETRIC_ENCRYPTION"
    protection_level = "SOFTWARE"
  }
}

# 暗号鍵の作成(Cloud SQL用)
resource "google_kms_crypto_key" "sql_key" {
  name     = "sql-key"
  key_ring = google_kms_key_ring.keyring.id
  purpose  = "ENCRYPT_DECRYPT"
  
  rotation_period = "7776000s"  # 90日
  
  version_template {
    algorithm        = "GOOGLE_SYMMETRIC_ENCRYPTION"
    protection_level = "SOFTWARE"
  }
}

# サービスアカウントに鍵へのアクセス権を付与
resource "google_kms_crypto_key_iam_binding" "gke_key_binding" {
  crypto_key_id = google_kms_crypto_key.gke_key.id
  role          = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
  
  members = [
    "serviceAccount:service-${var.project_number}@container-engine-robot.iam.gserviceaccount.com",
  ]
}

resource "google_kms_crypto_key_iam_binding" "sql_key_binding" {
  crypto_key_id = google_kms_crypto_key.sql_key.id
  role          = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
  
  members = [
    "serviceAccount:service-${var.project_number}@gcp-sa-cloud-sql.iam.gserviceaccount.com",
  ]
}

2. GKEでのCloud KMSの使用

GKEでは、主に2つの用途でCloud KMSを使用します:

  1. アプリケーションシークレット(Kubernetesシークレット)の保護
  2. PersistentVolumeの暗号化

GKEクラスターでのアプリケーションシークレット暗号化の設定

resource "google_container_cluster" "primary" {
  name     = "my-gke-cluster"
  location = "asia-northeast1"
  
  # その他のクラスター設定
  
  database_encryption {
    state    = "ENCRYPTED"
    key_name = google_kms_crypto_key.gke_key.id
  }
}

GKEでのアプリケーションレベルでのKMS使用例

KMS暗号鍵にアクセスするためのPodの例:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: kms-user-sa
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kms-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kms-app
  template:
    metadata:
      labels:
        app: kms-app
    spec:
      serviceAccountName: kms-user-sa
      containers:
      - name: app
        image: my-app:latest
        env:
        - name: KMS_KEY_ID
          value: "projects/PROJECT_ID/locations/asia-northeast1/keyRings/my-keyring/cryptoKeys/gke-key"

3. Cloud SQLでのCloud KMSの使用

Cloud SQLインスタンスでのCMEK(Customer-Managed Encryption Keys)設定:

resource "google_sql_database_instance" "main" {
  name             = "my-database-instance"
  database_version = "POSTGRES_14"
  region           = "asia-northeast1"
  
  settings {
    tier = "db-f1-micro"
    
    # CMEKの設定
    encryption_key_name = google_kms_crypto_key.sql_key.id
    
    # その他のデータベース設定
    database_flags {
      name  = "cloudsql.enable_pgaudit"
      value = "on"
    }
  }
}

4. バックアップの暗号化

Cloud SQLバックアップも暗号化することができます:

resource "google_sql_database_instance" "main" {
  # 前述の設定に加えて
  
  settings {
    # 他の設定
    
    backup_configuration {
      enabled            = true
      start_time         = "02:00"
      binary_log_enabled = true
      
      # バックアップの暗号化設定
      encryption_key_name = google_kms_crypto_key.sql_key.id
    }
  }
}

5. 鍵のローテーション管理

# 自動ローテーションポリシーの設定
resource "google_kms_crypto_key" "rotated_key" {
  name            = "rotated-key"
  key_ring        = google_kms_key_ring.keyring.id
  rotation_period = "2592000s"  # 30日ごとにローテーション
}

# 監査ログ設定
resource "google_kms_key_ring_iam_binding" "key_ring_audit" {
  key_ring_id = google_kms_key_ring.keyring.id
  role        = "roles/cloudkms.auditor"
  
  members = [
    "group:security-auditors@example.com",
  ]
}

実際の運用ポイント

  1. アクセス管理

    • KMSキーへのアクセスを最小限に保つ
    • サービスアカウント間の適切な権限分離を行う
  2. 鍵のバックアップと復旧計画

    • 重要な鍵のバックアップ方法を確立する
    • 鍵の管理手順を文書化する
  3. 監視と監査

    • KMS操作の監査ログを有効にする
    • 不正アクセスに対するアラートを設定する
  4. コンプライアンス

    • 鍵の管理ポリシーをコンプライアンス要件に合わせる
    • 定期的な監査を実施する

Cloud KMSを適切に設定することで、GKEクラスターとCloud SQLデータベースの両方でデータとシークレットを保護することができます。これにより、規制要件を満たしながら、セキュリティ侵害のリスクを軽減できます。

Discussion