GCP Compute Engineインスタンスの削除保護の有効化について

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

この記事では、Compute Engineインスタンスで削除保護機能が無効化されている問題について、リスクと対策を解説します。

ポリシーの説明

Compute Engineインスタンスで削除保護機能が無効化されているケースを検出します。削除保護(deletionProtection)は、仮想マシンインスタンスが誤って、または悪意を持って削除されることを防ぐセキュリティ機能です。この機能を有効にすると、APIコール、gcloud CLI、Cloud Console、Terraformなど、あらゆるインターフェースからの削除要求がブロックされます。重要な本番環境やビジネスクリティカルなインスタンスには、この保護機能の有効化が強く推奨されます。

修復方法

コンソールでの修復手順

Google Cloud コンソールを使用して、Compute Engineインスタンスで削除保護を有効化します。

1. 既存インスタンスで削除保護を有効化

  1. Google Cloud コンソールで「Compute Engine」→「VMインスタンス」に移動します。
  2. 削除保護を有効にしたいインスタンスの名前をクリックします。
  3. インスタンスの詳細ページで「編集」ボタンをクリックします。
  4. 「削除からの保護」セクションまでスクロールします。
  5. 「削除保護を有効にする」のチェックボックスをオンにします。
  1. ページ下部の「保存」ボタンをクリックします。

2. 新規インスタンス作成時に削除保護を有効化

  1. 「Compute Engine」→「VMインスタンス」→「インスタンスを作成」をクリックします。
  2. 必要な設定(名前、リージョン、マシンタイプなど)を入力します。
  3. 「管理、セキュリティ、ディスク、ネットワーク、単一テナンシー」を展開します。
  4. 「管理」タブをクリックします。
  5. 「削除保護」セクションで「削除保護を有効にする」をチェックします。
  6. その他の設定を完了し、「作成」をクリックします。

Terraformでの修復手順

Compute Engineインスタンスで削除保護を有効にするTerraformコードと、主要な修正ポイントを説明します。

# 削除保護を有効にした本番環境インスタンス
resource "google_compute_instance" "production_instance" {
  name                = "${var.environment}-critical-instance"
  machine_type        = var.machine_type
  zone                = var.zone
  deletion_protection = true  # 削除保護を有効化

  boot_disk {
    initialize_params {
      image = var.boot_image
      size  = var.boot_disk_size
      type  = "pd-ssd"
    }
  }

  network_interface {
    network    = var.network
    subnetwork = var.subnetwork

    access_config {
      // 必要に応じてパブリックIPを設定
    }
  }

  metadata = {
    enable-oslogin = "TRUE"
  }

  service_account {
    email  = google_service_account.instance_sa.email
    scopes = ["cloud-platform"]
  }

  labels = {
    environment = var.environment
    criticality = "high"
    protected   = "true"
  }

  tags = ["production", "protected-instance"]
}

# Terraformレベルでの追加保護
resource "google_compute_instance" "critical_database" {
  name                = "${var.environment}-database-server"
  machine_type        = "n2-highmem-8"
  zone                = var.zone
  deletion_protection = true  # GCPレベルの削除保護

  boot_disk {
    initialize_params {
      image = "ubuntu-os-cloud/ubuntu-2004-lts"
      size  = 100
      type  = "pd-ssd"
    }
  }

  attached_disk {
    source      = google_compute_disk.database_disk.id
    device_name = "database"
  }

  network_interface {
    network    = var.network
    subnetwork = var.subnetwork
  }

  # Terraformレベルでの削除保護も追加
  lifecycle {
    prevent_destroy = true
  }

  labels = {
    environment = var.environment
    application = "database"
    protected   = "true"
  }
}

# 削除保護付きインスタンスのモジュール化
module "protected_instances" {
  source = "./modules/protected-compute-instance"

  for_each = var.critical_instances

  instance_name       = each.value.name
  machine_type        = each.value.machine_type
  zone                = each.value.zone
  deletion_protection = true  # 常に有効

  boot_disk_image = each.value.boot_image
  boot_disk_size  = each.value.disk_size

  network    = var.network
  subnetwork = var.subnetwork

  labels = merge(var.common_labels, {
    protected = "true"
    role      = each.value.role
  })
}

# 削除保護の監査とモニタリング
resource "google_monitoring_alert_policy" "deletion_protection_disabled" {
  display_name = "Instance Deletion Protection Disabled"
  project      = var.project_id

  conditions {
    display_name = "Deletion protection disabled on critical instance"
    condition_threshold {
      filter          = <<-EOT
        resource.type = "gce_instance"
        AND logName = "projects/${var.project_id}/logs/cloudaudit.googleapis.com%2Factivity"
        AND protoPayload.methodName = "v1.compute.instances.setDeletionProtection"
        AND protoPayload.request.deletionProtection = false
      EOT
      duration        = "60s"
      comparison      = "COMPARISON_GT"
      threshold_value = 0
    }
  }

  notification_channels = [google_monitoring_notification_channel.security_team.id]

  documentation {
    content = "A critical instance has had its deletion protection disabled. Immediate review required."
  }
}

 

主要な修正ポイント

  1. デフォルトで有効化: すべての本番環境インスタンスでdeletion_protection = trueを設定します。
  2. 二重の保護: GCPの削除保護とTerraformのprevent_destroyを併用します。
  3. ラベルによる識別: 保護されたインスタンスをprotected = "true"ラベルで明確化します。
  4. モジュール化: 削除保護を含む標準化されたインスタンス作成モジュールを使用します。
  5. 監査とアラート: 削除保護が無効化された際のアラート設定を行います。

最後に

この記事では、Compute Engineインスタンスで削除保護を有効化する手順について、リスクと対策を解説しました。

削除保護は、シンプルながら非常に効果的なセキュリティ機能です。特に本番環境やビジネスクリティカルなシステムでは必須の設定と言えるでしょう。Terraformのprevent_destroyと組み合わせることで、より堅牢な保護が実現できます。

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

参考情報

この記事をシェアする

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

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

料金プランを詳しく見る