Cloud KMS暗号鍵の自動キーローテーション設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、gcloud CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、Google Cloud Platform(GCP)のCloud KMS暗号鍵の自動ローテーション有効化について、セキュリティリスクと具体的な対策を解説します。

ポリシーの説明

Cloud KMSでの暗号鍵管理において、暗号鍵の自動ローテーションを有効化することは、セキュリティ上極めて重要な対策です。長期間同じ暗号鍵を使用し続けることは、暗号解読や侵害のリスクを大幅に高めます。

コンプライアンスなどの要件において定期的なキーローテンションが求められる場合には対応をしておきましょう。

修復方法

コンソールでの修復手順

Google Cloud コンソールを使用して、Cloud KMS暗号鍵の自動ローテーションを有効化します。

  1. Cloud KMSコンソールへアクセス
    • Google Cloud Consoleにログイン
    • ナビゲーションメニューから「セキュリティ」→「Key Management」を選択
  2. 対象の暗号鍵を選択
    • キーリングの一覧から対象のキーリングをクリック
    • 暗号鍵の一覧から、自動ローテーションを設定したい鍵を選択
  1. 鍵の詳細ページで設定を確認
    • 暗号鍵の詳細ページで「ローテーション期間」のセクションを確認
    • 現在のローテーション設定状態を確認
  2. 自動ローテーションの有効化
    • 「編集」ボタンをクリック
    • 「ローテーション期間」セクションで「自動ローテーションを有効にする」にチェック
    • ローテーション期間を設定(推奨: 90日)
      • 最小値: 1日
      • 最大値: 100年
      • 一般的な推奨値: 30日〜90日
    • 「次回のローテーション日」を確認
  3. 設定の保存
    • 「保存」ボタンをクリック
    • 変更が正常に適用されたことを確認
  4. ローテーション履歴の確認
    • 暗号鍵の詳細ページで「バージョン」タブをクリック
    • 過去のキーバージョンとローテーション履歴を確認

Terraformでの修復手順

Cloud KMS暗号鍵の自動ローテーションを有効化するTerraformコードと、主要な修正ポイントを説明します。

# KMSキーリングの作成
resource "google_kms_key_ring" "keyring" {
  name     = "${var.environment}-keyring"
  location = var.key_ring_location  # "global", "us-central1"など
  project  = var.project_id
}

# 自動ローテーションが有効化されたKMS暗号鍵の作成
resource "google_kms_crypto_key" "crypto_key" {
  name            = "${var.environment}-crypto-key"
  key_ring        = google_kms_key_ring.keyring.id

  # 自動ローテーションの設定(必須)
  rotation_period = var.rotation_period  # 例: "7776000s" (90日)

  # 鍵のアルゴリズムとプロテクションレベル
  version_template {
    algorithm        = "GOOGLE_SYMMETRIC_ENCRYPTION"
    protection_level = "HSM"  # セキュリティを高めるためHSMを推奨
  }

  # 誤削除防止
  lifecycle {
    prevent_destroy = true
  }

  labels = {
    environment = var.environment
    purpose     = var.key_purpose
    rotation    = "enabled"
  }
}

# 既存の暗号鍵に自動ローテーションを適用する場合
resource "google_kms_crypto_key" "existing_key_with_rotation" {
  name            = "existing-key"
  key_ring        = google_kms_key_ring.keyring.id

  # 90日ごとに自動ローテーション(7776000秒)
  rotation_period = "7776000s"

  # import後に適用
  lifecycle {
    prevent_destroy = true
  }
}

# ローテーション期間の変数定義
variable "rotation_period" {
  description = "暗号鍵の自動ローテーション期間(秒単位)"
  type        = string
  default     = "7776000s"  # 90日(推奨)

  validation {
    condition = can(regex("^[0-9]+s$", var.rotation_period)) &&
                tonumber(trimsufix(var.rotation_period, "s")) >= 86400 &&
                tonumber(trimsufix(var.rotation_period, "s")) <= 3153600000
    error_message = "ローテーション期間は86400s(1日)から3153600000s(100年)の間で設定してください。"
  }
}

# 複数の暗号鍵を一括で管理する場合
locals {
  crypto_keys = {
    "data-encryption-key" = {
      rotation_period = "2592000s"   # 30日
      purpose        = "data-encryption"
    }
    "backup-encryption-key" = {
      rotation_period = "7776000s"   # 90日
      purpose        = "backup-encryption"
    }
    "app-encryption-key" = {
      rotation_period = "5184000s"   # 60日
      purpose        = "application-encryption"
    }
  }
}

# 複数の暗号鍵を動的に作成
resource "google_kms_crypto_key" "crypto_keys" {
  for_each = local.crypto_keys

  name            = each.key
  key_ring        = google_kms_key_ring.keyring.id
  rotation_period = each.value.rotation_period

  version_template {
    algorithm        = "GOOGLE_SYMMETRIC_ENCRYPTION"
    protection_level = "SOFTWARE"
  }

  labels = {
    environment     = var.environment
    purpose        = each.value.purpose
    rotation_enabled = "true"
    managed_by     = "terraform"
  }

  lifecycle {
    prevent_destroy = true
  }
}

# 自動ローテーションの監視アラート設定
resource "google_monitoring_alert_policy" "kms_rotation_alert" {
  display_name = "KMS Key Rotation Alert"
  combiner     = "OR"

  conditions {
    display_name = "KMS Key Rotation Overdue"

    condition_threshold {
      filter          = <<-EOT
        resource.type = "cloudkms.googleapis.com/CryptoKey"
        AND metric.type = "cloudkms.googleapis.com/crypto_key/days_since_rotation"
      EOT
      duration        = "0s"
      comparison      = "COMPARISON_GT"
      threshold_value = 100  # 100日以上ローテーションされていない場合

      aggregations {
        alignment_period   = "60s"
        per_series_aligner = "ALIGN_MAX"
      }
    }
  }

  notification_channels = [var.notification_channel_id]

  alert_strategy {
    auto_close = "1800s"
  }
}

# 変数定義
variable "project_id" {
  description = "GCPプロジェクトID"
  type        = string
}

variable "environment" {
  description = "環境名(dev, staging, prod)"
  type        = string
}

variable "key_ring_location" {
  description = "キーリングのロケーション"
  type        = string
  default     = "global"
}

variable "key_purpose" {
  description = "暗号鍵の用途"
  type        = string
  default     = "general-encryption"
}

variable "notification_channel_id" {
  description = "アラート通知チャンネルID"
  type        = string
}

# 出力値
output "crypto_key_ids" {
  description = "作成された暗号鍵のID"
  value       = {
    for k, v in google_kms_crypto_key.crypto_keys : k => v.id
  }
}

output "next_rotation_time" {
  description = "次回のローテーション予定時刻"
  value       = {
    for k, v in google_kms_crypto_key.crypto_keys : k => v.rotation_period
  }
}

 

まとめ

GCP Cloud KMSの暗号鍵自動ローテーションは、セキュリティとコンプライアンスの両方の観点から極めて重要な機能です。本記事で紹介した手順により、コンソール、gcloud CLI、Terraformのいずれの方法でも簡単に設定できます。

特に重要なのは、適切なローテーション期間の設定と、ローテーションイベントの監視です。組織のセキュリティ要件とデータの機密性に応じて、適切な設定を行ってください。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

参考情報

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る