Cloud Storageバケットのオブジェクトバージョニング有効化設定手順

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

この記事では、GCP Cloud Storageバケットのオブジェクトバージョニング機能を有効化し、誤削除やランサムウェア攻撃からデータを保護する方法について、具体的な手順とベストプラクティスを解説します。

ポリシーの説明

Cloud Storageバケットでオブジェクトバージョニング機能が無効化されている状態を検出します。オブジェクトバージョニングは、ファイルの削除や上書きの際に以前のバージョンを自動的に保存する機能で、誤操作や悪意のある削除からデータを保護する重要なセキュリティ機能です。この機能が無効の場合、削除されたオブジェクトは即座に失われ、復元できなくなります。

リスク

オブジェクトバージョニングが無効化されている場合、以下のようなリスクが発生します:

  1. データの永久的な損失:誤ってファイルを削除または上書きした場合、元のデータを復元する手段がなく、重要なビジネスデータが永久に失われる可能性があります。
  2. ランサムウェア攻撃への脆弱性:攻撃者がバケット内のデータを暗号化または削除した場合、以前のバージョンが存在しないため、身代金を支払わない限りデータを復元できません。
  3. コンプライアンス違反:多くの規制要件では、データの保存期間や復元可能性について定められており、バージョニングなしではこれらの要件を満たせない可能性があります。
  4. 監査証跡の欠如:データの変更履歴が保存されないため、誰がいつどのような変更を行ったかを追跡することが困難になり、セキュリティインシデントの調査が複雑化します。

修復方法

ライフサイクルルールによってはコストが大きく発生する可能性があるため要件に合わせて適切に設定してください。

コンソールでの修復手順

Google Cloud コンソールを使用して、Cloud Storageバケットのオブジェクトバージョニングを有効化します。

ステップ1: Cloud Storageコンソールへのアクセス

  1. Google Cloud コンソールにログインし、対象のプロジェクトを選択します。
  2. ナビゲーションメニューから「Cloud Storage」→「バケット」を選択します。
  1. バージョニングを有効化したいバケットの名前をクリックします。

ステップ2: バケット設定の編集

  1. バケットの詳細ページで、「保護」タブをクリックします。
  2. 「オブジェクトバージョニング」セクションを見つけます。
  1. 「編集」ボタンをクリックします。

ステップ3: オブジェクトバージョニングの有効化

  1. 「オブジェクトバージョニング」のトグルスイッチを「有効」に切り替えます。
    1. 適切なライフサイクルルールを設定してください
  2. 「確認」をクリックして設定を保存します。
  3. 設定変更が反映されるまで約30秒待ちます。

Terraformでの修復手順

Cloud Storageバケットのオブジェクトバージョニングを有効にするTerraformコードと、主要な修正ポイントを説明します。

# Cloud Storageバケットの作成(バージョニング有効)
resource "google_storage_bucket" "versioned_bucket" {
  name          = "${var.project_id}-secure-bucket"
  location      = var.region
  project       = var.project_id

  # オブジェクトバージョニングの有効化
  versioning {
    enabled = true
  }

  # 均一なバケットレベルアクセスの有効化(推奨)
  uniform_bucket_level_access {
    enabled = true
  }

  # 暗号化設定(CMEK使用)
  encryption {
    default_kms_key_name = google_kms_crypto_key.bucket_key.id
  }

  # ライフサイクルルールの設定
  lifecycle_rule {
    condition {
      # 古いバージョンを90日後に削除
      num_newer_versions = 3
      with_state         = "ARCHIVED"
    }
    action {
      type = "Delete"
    }
  }

  lifecycle_rule {
    condition {
      # 削除マーカーを30日後に削除
      days_since_noncurrent_time = 30
      with_state                 = "ANY"
    }
    action {
      type = "Delete"
    }
  }

  # 監査ログの設定
  logging {
    log_bucket = google_storage_bucket.log_bucket.name
    log_object_prefix = "storage-logs/"
  }
}

# ログ保存用バケット
resource "google_storage_bucket" "log_bucket" {
  name          = "${var.project_id}-logs-bucket"
  location      = var.region
  project       = var.project_id

  # ログバケットもバージョニング有効化
  versioning {
    enabled = true
  }

  # ログの保持期間設定
  lifecycle_rule {
    condition {
      age = 365  # 1年間保持
    }
    action {
      type = "Delete"
    }
  }
}

# バケット用のKMS暗号鍵
resource "google_kms_crypto_key" "bucket_key" {
  name            = "bucket-encryption-key"
  key_ring        = google_kms_key_ring.keyring.id
  rotation_period = "7776000s"  # 90日

  lifecycle {
    prevent_destroy = true
  }
}

# KMSキーリング
resource "google_kms_key_ring" "keyring" {
  name     = "storage-keyring"
  location = var.region
  project  = var.project_id
}

# バケットへのアクセス制御(例:読み取り専用)
resource "google_storage_bucket_iam_member" "viewer" {
  bucket = google_storage_bucket.versioned_bucket.name
  role   = "roles/storage.objectViewer"
  member = "serviceAccount:${var.service_account_email}"
}

# 追加の推奨設定:バケットの公開アクセス防止
resource "google_storage_bucket_iam_binding" "no_public_access" {
  bucket = google_storage_bucket.versioned_bucket.name
  role   = "roles/storage.legacyBucketReader"

  members = [
    "projectViewer:${var.project_id}",
  ]
}

# アラート設定:バージョニング無効化の検知
resource "google_monitoring_alert_policy" "versioning_disabled" {
  display_name = "Cloud Storage バージョニング無効化アラート"
  combiner     = "OR"

  conditions {
    display_name = "バージョニングが無効化されました"

    condition_monitoring_query_language {
      query = <<-EOT
        fetch gcs_bucket
        | metric 'storage.googleapis.com/bucket/object_version_count'
        | filter resource.bucket_name == '${google_storage_bucket.versioned_bucket.name}'
        | group_by 1m, [value_version_count_mean: mean(value.object_version_count)]
        | every 1m
        | condition val() < 1
      EOT
      duration = "60s"
    }
  }

  notification_channels = [var.notification_channel_id]
}

 

まとめ

この記事では、Cloud Storageバケットのオブジェクトバージョニング有効化設定手順について、リスクと対策を解説しました。

オブジェクトバージョニングは、誤操作やランサムウェア攻撃からデータを保護する重要な機能です。すべての重要なバケットでこの機能を有効化し、適切なライフサイクルポリシーを設定することを強く推奨します。

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

参考情報

Google Cloud 公式ドキュメント

この記事をシェアする

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

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

料金プランを詳しく見る