Cut Cloud Storage access confusion by enabling uniform bucket-level access
Uniform bucket-level access makes bucket IAM the only access control for Cloud Storage objects. Here is how to enable it safely, what breaks, and how to verify.
17 Oct 2025, 14:10 UTC

A Cloud Storage bucket that mixes object ACLs with bucket-level IAM is hard to reason about: two people can debug the same permission problem and reach different conclusions. Uniform bucket-level access removes that ambiguity by making bucket-level IAM the only authorization mechanism for objects in the bucket.
The hidden cost of object ACL sprawl
Object ACLs are per-object grants. They are useful for narrow sharing, but they accumulate quietly. A bucket may have thousands of objects, each with its own reader or writer list. When access fails, the question is no longer "what does the bucket policy say?" but "what does this specific object ACL say, and did a later upload overwrite it?"
That model also creates drift. A client can upload an object with a public-read ACL even when the bucket policy never intended public access. In mixed environments, the effective permission is the union of several mechanisms, which makes audits and incident reviews slower.
What uniform bucket-level access actually changes
Uniform bucket-level access, often shortened to UBLA, tells Cloud Storage to evaluate bucket-level IAM policy for requests to the bucket and its objects. Object ACLs are not used for authorization while UBLA is enabled.
Enabling UBLA does not rewrite IAM bindings, encrypt data, move objects, or change object metadata. It changes which access-control list Cloud Storage consults. If a principal could read an object through IAM before, that grant still works. If a principal could read an object only through an object ACL, that access stops being honored.
| Mechanism | Scope | Used when UBLA is enabled? | Practical role |
|---|---|---|---|
| Bucket-level IAM policy | Bucket and objects | Yes | Primary access control |
| Object ACLs | Single object | No | Legacy or S3-interop compatibility |
Worked example: enable and verify UBLA on a non-production bucket
Run these commands in Cloud Shell or any shell where the gcloud CLI is authenticated. You need permission to change bucket configuration, such as roles/storage.admin on the project or bucket. A viewer role is not enough. Replace PROJECT_ID, BUCKET_NAME, and OBJECT_NAME with real values.
gcloud config set project PROJECT_ID
gcloud storage buckets update gs://BUCKET_NAME --uniform-bucket-level-access
gcloud storage buckets describe gs://BUCKET_NAME --format='value(iamConfiguration.uniformBucketLevelAccess.enabled)'
The describe command should return True. IAM policy changes are eventually consistent, so verify after a short wait rather than assuming the change is immediate. If you use the Cloud Storage JSON API instead, call storage.buckets.get and inspect iamConfiguration.uniformBucketLevelAccess.enabled.
Next, test the behavior your application depends on. If your workflow edits object ACLs, try that operation in the non-production bucket. In the CLI, that may look like the following, if your installed version exposes the flag:
gcloud storage objects update gs://BUCKET_NAME/OBJECT_NAME --predefined-acl=private
Do not assume a specific error message. The useful check is whether the operation is rejected or has no effect. At the same time, confirm that a principal granted through bucket IAM can still read and write objects as expected. If both checks pass, the bucket is behaving predictably under UBLA.
Trade-offs and limitations
- Object-level sharing becomes harder. You cannot grant one external user access to a single object by editing that object's ACL. Use a separate bucket or an IAM condition if the condition attributes you need are supported.
- Legacy S3-interop workflows may break. Some tools send object ACL headers such as
x-amz-acl. Review those clients before enabling UBLA on production buckets. - UBLA is not a full security boundary. It does not restrict network origin, enforce VPC Service Controls, choose customer-managed encryption keys, or apply object retention. Combine it with those controls when required.
- Exact behavior can vary by interface. Toggle behavior, condition support, and error responses can differ across releases and client libraries. Confirm current behavior in a non-production bucket first.
Rollback and an actionable checklist
Because enabling UBLA changes how access is evaluated, plan a rollback path. Disabling it is a bucket update:
gcloud storage buckets update gs://BUCKET_NAME --no-uniform-bucket-level-access
Treat rollback carefully. If object ACLs were not maintained while UBLA was enabled, disabling UBLA may not restore the exact per-object grants you had before.
- Inventory clients that upload objects with ACL headers or call object ACL APIs.
- Enable UBLA by default for new buckets unless an application specifically requires object ACLs.
- For existing buckets, test in a non-production copy first, then enable after confirming client behavior.
- Verify with
gcloud storage buckets describeand a real read/write test from an IAM-granted principal. - Re-check access after IAM changes because policy propagation is eventually consistent.
The practical win is not a new feature; it is fewer places to look. One bucket policy, one authorization path, and a clear answer when access fails.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.