Cloud Storageバケットのパブリックアクセスを防ぐ設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、gcloud CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、Cloud Storageバケットがパブリックアクセス可能な権限設定で構成されている問題について、リスクと対策を解説します。

ポリシーの説明
Cloud Storageバケットでグローバルなアクセス権限を制限し、データの不正アクセスを防止します。Google Cloud Storageバケットに「allUsers」や「allAuthenticatedUsers」といったパブリックアクセスを許可するIAMバインディングが設定されていると、インターネット上の誰でもバケット内のデータにアクセスできる状態となります。この設定は、機密データの漏洩やサイバー攻撃の標的となる重大なセキュリティリスクとなります。
修復方法
コンソールでの修復手順
Google Cloud コンソールを使用して、Cloud Storageバケットのパブリックアクセスを制限します。
- Google Cloud Consoleにアクセス
- Google Cloud Consoleにログインします
- ナビゲーションメニューから「Cloud Storage」→「バケット」を選択します
- 対象バケットの選択
- バケット一覧から、修復対象のバケット名をクリックします
- バケットの詳細ページが表示されます
- 権限タブへの移動
- バケット詳細ページの上部にある「権限」タブをクリックします
- 現在のIAMポリシーとアクセス設定が表示されます
- パブリックアクセス防止の有効化
- 「パブリックアクセス」カードで「パブリックアクセスを防止」をクリックします
- 確認ダイアログで「確認」をクリックして変更を適用します
- この設定により、新たなパブリックアクセス権限の付与が防止されます
- 既存のパブリックアクセス権限の削除
- IAMバインディングの一覧で「allUsers」または「allAuthenticatedUsers」を探します
- これらのプリンシパルの横にある削除アイコン(ゴミ箱)をクリックします
- 削除の確認ダイアログで「削除」をクリックします
- 設定の確認
- パブリックアクセスカードに「パブリックアクセス防止が適用されています」と表示されることを確認します
- IAMポリシーにパブリックプリンシパルが存在しないことを確認します
- 必要に応じて、特定のユーザーやサービスアカウントに適切な権限を付与します
Terraformでの修復手順
Cloud Storageバケットのパブリックアクセスを防止するTerraformコードと、主要な修正ポイントを説明します。
# セキュアなCloud Storageバケットの作成
resource "google_storage_bucket" "secure_bucket" {
name = "my-secure-bucket-${var.project_id}"
location = "ASIA-NORTHEAST1"
storage_class = "STANDARD"
# 均一なバケットレベルアクセスを有効化(推奨)
# これにより、ACLを無効化し、IAMのみでアクセス制御を行います
uniform_bucket_level_access = true
# パブリックアクセス防止を強制
public_access_prevention = "enforced"
# バージョニングを有効化(データ保護のため)
versioning {
enabled = true
}
# ライフサイクルルール(必要に応じて設定)
lifecycle_rule {
condition {
age = 90
matches_storage_class = ["NEARLINE"]
}
action {
type = "Delete"
}
}
# ログバケットの設定
logging {
log_bucket = google_storage_bucket.log_bucket.name
log_object_prefix = "storage-logs/"
}
# CORS設定(必要な場合のみ、最小限に)
cors {
origin = ["<https://trusted-domain.com>"]
method = ["GET", "HEAD"]
response_header = ["Content-Type"]
max_age_seconds = 3600
}
# 暗号化設定(推奨)
encryption {
default_kms_key_name = google_kms_crypto_key.bucket_key.id
}
}
# 特定のユーザーとサービスアカウントにのみアクセスを許可
# 注意: iam_bindingは既存のバインディングを上書きするため、iam_memberを推奨
resource "google_storage_bucket_iam_member" "viewer" {
for_each = toset([
"<user:authorized-user@example.com>",
"serviceAccount:${var.service_account_email}",
])
bucket = google_storage_bucket.secure_bucket.name
role = "roles/storage.objectViewer"
member = each.value
}
# 管理者権限の付与(必要最小限に)
resource "google_storage_bucket_iam_binding" "admin" {
bucket = google_storage_bucket.secure_bucket.name
role = "roles/storage.admin"
members = [
"<user:admin@example.com>",
]
}
# 組織レベルでのパブリックアクセス防止ポリシー(推奨)
resource "google_organization_policy" "storage_public_access_prevention" {
org_id = var.organization_id
constraint = "storage.publicAccessPrevention"
boolean_policy {
enforced = true
}
}
# VPCサービスコントロールの設定(追加のセキュリティ層として)
resource "google_access_context_manager_service_perimeter" "storage_perimeter" {
parent = "accessPolicies/${var.access_policy_id}"
name = "accessPolicies/${var.access_policy_id}/servicePerimeters/storage_perimeter"
title = "Storage Service Perimeter"
status {
restricted_services = ["storage.googleapis.com"]
# 特定のプロジェクトのみアクセスを許可
resources = [
"projects/${var.project_number}",
]
}
}
Terraformでの主要な修正ポイント:
public_access_prevention = "enforced"
でパブリックアクセスを完全に防止uniform_bucket_level_access = true
でIAMベースの統一的なアクセス制御を実現- 明示的に必要なユーザーとサービスアカウントのみに権限を付与
- 組織レベルのポリシーで全体的な保護を実施
- VPCサービスコントロールで追加のネットワークレベル制御を実装
まとめ
GCP Cloud Storageバケットのパブリックアクセスを防止することは、データセキュリティの最も基本的かつ重要な対策です。本記事で紹介したgcloud CLI、コンソール、Terraformの各手法を活用し、組織の環境に合った方法で迅速に対応することが重要です。特に、設定ミスによる侵害が最短30分で発生するという統計を踏まえ、常に警戒し継続的な監視を行うことが不可欠です。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。
参考情報
- Google Cloud Storage のパブリックアクセス防止
- Cloud Storage セキュリティのベストプラクティス
- VPC Service Controls を使用した追加保護
- Cloud Storage のアクセスログ