説明
Cloud StorageのIAMバインディングは、membersに指定した主体にロールを付与します。allUsersはGoogleアカウントの有無を問わずすべての人を含み、allAuthenticatedUsersも自分のプロジェクトの利用者だけには限定されません。これらの主体に必要以上のロールを付与すると、意図しないデータアクセスを許可する可能性があります。
空のメンバー一覧は、それ自体で匿名アクセスを許可するものではありません。バインディングが必要か、意図した利用者が抜けていないかを確認してください。実際のアクセスは、ロール、継承された権限、IAMポリシー、ACL、公開アクセスの防止設定を併せて確認する必要があります。
想定される影響
- 公開主体に読み取り権限が適用されると、ファイル、バックアップ、ログが意図した範囲を超えて公開される可能性があります。
- 書き込みや管理権限も許可すると、不要なオブジェクトの変更・削除やバケット設定の変更を許すおそれがあります。
対処方法
- 公開アクセスが不要な場合は
allUsersとallAuthenticatedUsersを削除し、必要なユーザー、グループ、サービスアカウントに最小限のロールだけを付与してください。空の一覧を埋めるためだけに任意の主体を追加せず、不要なバインディングは削除してください。 google_storage_bucket_iam_bindingはそのロールのメンバー一覧を管理するため、必要な既存メンバーを維持し、Terraformの計画を確認してください。- 公開アクセスの防止設定と、ほかのIAMポリシーやACLも確認し、必要なアクセスと拒否すべきアクセスをテストしてください。均一なバケットレベルのアクセスを有効にするだけでは、公開IAM権限は削除されません。
例
google_storage_bucket.defaultを別途定義し、例のアカウントjane@example.comを必要な実際のアカウントに置き換えてください。既存の構成に適用する場合は、リソース名の変更も含めてTerraformの計画を確認してください。
変更前
hcl
resource "google_storage_bucket_iam_binding" "public_binding" {
bucket = google_storage_bucket.default.name
role = "roles/storage.admin"
members = ["user:jane@example.com", "allUsers"]
}
allUsersに、バケットとオブジェクトを管理できるroles/storage.adminを付与しています。公開アクセスの防止設定などで遮断されていなければ、必要な範囲を大幅に超える公開権限になる可能性があります。
変更後
hcl
resource "google_storage_bucket_iam_binding" "restricted_binding" {
bucket = google_storage_bucket.default.name
role = "roles/storage.admin"
members = [
"user:jane@example.com",
]
}
公開主体を削除し、特定のユーザーだけを残しています。そのユーザーには引き続きroles/storage.adminが付与されるため、業務上必要なロールかを確認し、可能であればより限定したロールを使ってください。