📖
Cloud KMS for Cloud SQL, GKE
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を使用します:
- アプリケーションシークレット(Kubernetesシークレット)の保護
- 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",
]
}
実際の運用ポイント
-
アクセス管理:
- KMSキーへのアクセスを最小限に保つ
- サービスアカウント間の適切な権限分離を行う
-
鍵のバックアップと復旧計画:
- 重要な鍵のバックアップ方法を確立する
- 鍵の管理手順を文書化する
-
監視と監査:
- KMS操作の監査ログを有効にする
- 不正アクセスに対するアラートを設定する
-
コンプライアンス:
- 鍵の管理ポリシーをコンプライアンス要件に合わせる
- 定期的な監査を実施する
Cloud KMSを適切に設定することで、GKEクラスターとCloud SQLデータベースの両方でデータとシークレットを保護することができます。これにより、規制要件を満たしながら、セキュリティ侵害のリスクを軽減できます。
Discussion