IAM permissions for gcloud storage commands

The following table lists theIdentity and Access Management (IAM) permissionsrequired to rungcloud storage commands. IAM permissionsare bundled together to makeroles. Yougrant roles to principals.

See the sections below the table for notes on using wildcards, the--recursiveflag, and the--billing-project flag.

CommandFlagRequired IAM Permissions
batch-operations jobs createstoragebatchoperations.jobs.create
batch-operations jobs cancelstoragebatchoperations.jobs.cancel
batch-operations jobs deletestoragebatchoperations.jobs.delete
batch-operations jobs getstoragebatchoperations.jobs.get
batch-operations jobs liststoragebatchoperations.jobs.list
buckets add-iam-policy-bindingstorage.buckets.get
storage.buckets.getIamPolicy
storage.buckets.setIamPolicy
storage.buckets.update
buckets anywhere-caches createstorage.anywhereCaches.create
buckets anywhere-caches describestorage.anywhereCaches.get
buckets anywhere-caches liststorage.anywhereCaches.list
buckets anywhere-caches updatestorage.anywhereCaches.update
buckets anywhere-caches pausestorage.anywhereCaches.pause
buckets anywhere-caches resumestorage.anywhereCaches.resume
buckets anywhere-caches disablestorage.anywhereCaches.disable
buckets createstorage.buckets.create
storage.buckets.setIpFilter15
buckets deletestorage.buckets.delete
buckets describestorage.buckets.get
storage.buckets.getIamPolicy1
storage.buckets.getIpFilter16
buckets get-iam-policystorage.buckets.get
storage.buckets.getIamPolicy
buckets liststorage.buckets.list
storage.buckets.getIamPolicy1
buckets notifications createstorage.buckets.get
storage.buckets.update
pubsub.topics.get (for the project containing the Pub/Sub topic)
pubsub.topics.create3 (for the project containing the Pub/Sub topic)
pubsub.topics.getIamPolicy (for Pub/Sub topic receiving notifications)
pubsub.topics.setIamPolicy3 (for Pub/Sub topic receiving notifications)
buckets notifications create--skip-topic-setupstorage.buckets.get
storage.buckets.update
buckets notifications deletestorage.buckets.get
storage.buckets.update
buckets notifications describestorage.buckets.get
buckets notifications liststorage.buckets.get
buckets relocatestorage.buckets.relocate
buckets remove-iam-policy-bindingstorage.buckets.get
storage.buckets.getIamPolicy
storage.buckets.setIamPolicy
storage.buckets.update
buckets set-iam-policystorage.buckets.setIamPolicy
storage.buckets.update
buckets updatestorage.buckets.update
storage.buckets.setIpFilter15
buckets update--no-requester-paysstorage.buckets.update
resourcemanager.projects.createBillingAssignment2
buckets update--recovery-point-objective
--rpo
--[no-]uniform-bucket-level-access
storage.buckets.get
storage.buckets.update
buckets update--clear-pap
--clear-public-access-prevention
--[no-]pap
--[no-]public-access-prevention
storage.buckets.get
storage.buckets.update
storage.buckets.setIamPolicy
catstorage.objects.get
storage.objects.list13
cpstorage.objects.get (for the source objects)
storage.objects.create (for the destination bucket)
storage.objects.list4 (for the destination bucket)
storage.objects.delete5 (for the destination bucket)
storage.buckets.get12 (for the destination bucket)
dustorage.objects.list
folders createstorage.folders.create
folders deletestorage.folders.delete
folders describestorage.folders.get
folders liststorage.folders.list
folders renamestorage.folders.rename (for the source bucket)
storage.folders.create (for the destination bucket)
hashstorage.objects.get
hmac createstorage.hmacKeys.create
hmac deletestorage.hmacKeys.delete
hmac describestorage.hmacKeys.get
hmac liststorage.hmacKeys.list
hmac updatestorage.hmacKeys.update
insights dataset-configs createstorageinsights.datasetConfigs.create
insights dataset-configs create-linkstorageinsights.datasetConfigs.linkDataset
insights dataset-configs deletestorageinsights.datasetConfigs.delete
insights dataset-configs delete-linkstorageinsights.datasetConfigs.unlinkDataset
insights dataset-configs describestorageinsights.datasetConfigs.get
insights dataset-configs liststorageinsights.datasetConfigs.list
insights dataset-configs updatestorageinsights.datasetConfigs.update
insights inventory-reports createstorageinsights.reportConfigs.create
insights inventory-reports deletestorageinsights.reportConfigs.delete
insights inventory-reports details liststorageinsights.reportDetails.list
insights inventory-reports details describestorageinsights.reportDetails.get
insights inventory-reports liststorageinsights.reportConfigs.list
insights inventory-reports updatestorageinsights.reportConfigs.get
storageinsights.reportConfigs.update
ls (for bucket listing)storage.buckets.list
storage.buckets.getIamPolicy6
ls (for object listing)storage.objects.get7
storage.objects.list
storage.objects.getIamPolicy8
ls--bucketsstorage.buckets.get
storage.buckets.getIamPolicy6
storage intelligence-config enablestorage.intelligenceConfigs.update
storage-intelligence disablestorage.intelligenceConfigs.update
storage-intelligence describestorage.intelligenceConfigs.get
storage-intelligence updatestorage.intelligenceConfigs.update
mvstorage.objects.get (for the source objects)
storage.objects.delete (for the source bucket)
storage.objects.create (for the destination bucket)
storage.objects.list4 (for the destination bucket)
storage.objects.delete5 (for the destination bucket)
storage.buckets.get12 (for the destination bucket)
objects composestorage.objects.get
storage.objects.create
storage.objects.delete9
objects describestorage.objects.get
storage.objects.getIamPolicy8
objects liststorage.objects.list
storage.objects.getIamPolicy8
objects updatestorage.objects.get
storage.objects.list
storage.objects.update
objects update--storage-class
--encryption-key
--clear-encryption-key
storage.objects.get
storage.objects.list
storage.objects.create
storage.objects.delete
objects update--retention-mode
--retain-until
--clear-retention
storage.objects.get
storage.objects.list
storage.objects.update
storage.objects.setRetention
storage.objects.overrideUnlockedRetention11
operations cancelstorage.bucketOperations.cancel
operations describestorage.bucketOperations.get
operations liststorage.bucketOperations.list
restorestorage.objects.create
storage.objects.delete9
storage.objects.restore
restore--asyncstorage.objects.create
storage.objects.delete14
storage.objects.restore
storage.buckets.restore
rmstorage.buckets.delete
storage.objects.delete
storage.objects.list
rsyncstorage.objects.list (for the source bucket)
storage.objects.get (for the source objects)
storage.objects.list (for the destination bucket)
storage.objects.get (for the destination bucket)
storage.objects.create (for the destination bucket)
storage.objects.delete10 (for the destination bucket)
storage.buckets.get12 (for the destination bucket)
rsync--dry-runstorage.objects.list (for the source and destination buckets)
service-agentresourceManager.projects.get
sign-urlNone; however, the service account whose key is used as part of this command must have permission to perform the request being encoded into the signed URL.

1This permission is only required if you want IAMpolicies included in the details.

2This permission is only required if you don't include a billingproject in your request. See Requester PaysUse and access requirementsfor more information.

3These permissions are not required if the topic already exists andthe relevant service account has access to it.

4This permission is only required when the destination in thecommand contains an object path.

5This permission is only required if you useparallel composite uploads or if you don't use the--no-clobber flag butinsert an object that has the same name as an object that already exists in thebucket.

6This permission is only required if you want IAMpolicies included in the details.

7This permission is only required if you use the--fetch-encrypted-object-hashes flag.

8This permission is only required if you want IAMpolicies included in the details, and it does not apply to buckets withuniform bucket-level access enabled.

9This permission is only required if the operation creates an objectwith the same name as an object that already exists in the bucket.

10This permission is only required if you use the--delete-unmatched-destination-objects flag or if you insert an object thathas the same name as, butdifferent data than, an object that alreadyexists in the bucket.

11This permission is only required if the request also requires youto use the--override-unlocked-retention flag.

12This permission is required to performparallel composite uploads if the gcloud CLI propertystorage/parallel_composite_upload_compatibility_check is set toTrue.

13This permission is only required if you want to use regularexpressions to retrieve objects.

14This permission is only required if the request includes the--allow-overwrite flag and the operation creates an object with the same nameas an object that already exists in the bucket.

15This permission is only required if the request includes the flag--ip-filter-file to create, update or delete the IP filtering ruleson a bucket.

16This permission is only required if you want to get the bucket's IP filter configuration as part of the response.

Note: The permissions listed in the previous table allow you to use thecommands. Some commands set bucket configurations that won't work withoutadditional permissions. For example,buckets notification create requires onlystorage.buckets.get andstorage.buckets.update to use, but you must haveadditional permissions for the feature to work properly.

The--billing-project top-level flag

If you use the--billing-project global flag to specify a project thatshould be billed for your request, you must haveserviceusage.services.usepermission for the project you specify. The--billing-project flag is used,for example, when accessing a bucket withRequester Pays enabled.

Wildcards and recursive flags

If you useURI wildcards to select multiple objects in a command, youmust havestorage.objects.list permission for the bucket containing theobjects. Similarly, if you use URI wildcards to select multiple bucketsin a command, you must havestorage.buckets.list permission for theproject(s) containing the buckets.

If you use the--recursive flag, you must havestorage.objects.listpermission for the relevant bucket, in addition to the permissions required forthe specific command you are using.

What's next

Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2026-02-19 UTC.