用户没有对存储桶的storage.objects.list访问权限

时间:2019-12-20 09:24:27

标签: python google-cloud-platform google-cloud-storage

我创建了一个服务帐户并分配了以下角色:

Owner
Storage Admin
Storage Object Admin
Tester

Tester是我为学习而创建的角色,具有以下权限:

storage.buckets.create
storage.buckets.delete
storage.buckets.get
storage.buckets.getIamPolicy
storage.buckets.list
storage.buckets.setIamPolicy
storage.buckets.update
storage.objects.create
storage.objects.delete
storage.objects.get
storage.objects.getIamPolicy
storage.objects.list
storage.objects.setIamPolicy
storage.objects.update
...

我知道我不必要地过度使用这些角色的权限;但这只是出于测试目的。

考虑到存储桶仅包含一个文件,并且该帐户具有相应的权限,因此以下Python代码应该可以工作(在我的本地计算机上运行):

from google.cloud import storage


if __name__ == '__main__':
    storage_client = storage.Client()
    bucket = storage_client.bucket('my-bucket-name')
    blobs = bucket.list_blobs()
    for blob in blobs:
        print(blob.name)

但不是:

Traceback (most recent call last):
  File "gcloud/test.py", line 8, in <module>
    for blob in blobs:
  File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 212, in _items_iter
    for page in self._page_iter(increment=False):
  File "/home/berkay/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 243, in _page_iter
    page = self._next_page()
  File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 369, in _next_page
    response = self._get_next_page_response()
  File "/home/user/.local/lib/python3.6/site-packages/google/api_core/page_iterator.py", line 419, in _get_next_page_response
    method=self._HTTP_METHOD, path=self.path, query_params=params
  File "/home/user/.local/lib/python3.6/site-packages/google/cloud/_http.py", line 421, in api_request
    raise exceptions.from_http_response(response)
google.api_core.exceptions.Forbidden: 403 GET LINK: USER does not have storage.objects.list access to BUCKET.

存储桶使用统一的存储桶级别访问控制。我正在使用的服务帐户是该存储桶的成员,并且它是从以下成员继承该成员身份的:

Storage Admin
Storage Object Admin
Tester

有人可以向我解释这种行为的原因吗?

谢谢

4 个答案:

答案 0 :(得分:0)

这就是为什么我问您是否将此存储桶切换到统一存储桶级访问控制或创建它的原因。我的理论是您将其切换到统一存储桶级别并触发了此免责声明。

  

警告:如果启用统一的存储桶级访问,则撤消仅通过对象ACL获得访问权限的用户的访问。在启用统一存储桶级访问权限之前,请确保在迁移现有存储桶时已阅读注意事项。

这就是为什么当您手动添加角色时它可以正常工作的原因。

您可以了解更多有关统一存储桶级访问权限如何工作的信息,here

以下是与发生的情况相关的信息。

  

此外,如果在创建新存储桶的过程中启用了统一存储桶级访问,则存储桶将自动接收其他Cloud IAM角色。此行为保持了从存储桶的默认对象ACL继承的对象的许可。如果您在现有存储桶上启用统一的存储桶级访问,则必须手动应用任何此类角色;如果您更改了存储桶的默认对象ACL,则可能需要应用一组不同的角色。

据我所知,这也是对您遇到的错误的解释。

  

启用后,以下ACL功能将停止:

     

设置,读取或修改存储桶和对象ACL的请求失败,并显示400   错误的请求错误。

希望这会有所帮助。

答案 1 :(得分:0)

我个人认为在开发/测试中,不必回避过度授予的角色。但是,如果您肯定要担任多个角色,不妨授予一个管理员角色,而不是多个较小的角色(因为本质上他们俩都在做相同的工作,但角色较少)

对于这里的具体问题,我建议

  1. 删除旧服务帐户
  2. 创建一个新的服务帐户并授予storage.adminstorage.object.admin的角色
  3. 使用此服务帐户

SO上有一个similar post,而且似乎可以通过类似的方式解决。

对于将来的读者:如果问题仍然存在,请完全卸载gcloud-sdk,然后重新安装(using this link),并使用最新版本。

答案 2 :(得分:0)

这对我有用:

gsutil defacl ch -u \
    <project-number-compute>@developer.gserviceaccount.com:OWNER \
    gs://bucket

查看更多:https://cloud.google.com/storage/docs/gsutil/commands/defacl

答案 3 :(得分:0)

我希望注意到,如果您丢失了配置和初始化设置,也会出现此错误,就像我必须进行干净的操作系统安装时发生的那样。

就我而言,我只需要运行 gcloud auth logingcloud init(再次),按照提示并选择选项 1

[1] Re-initialize this configuration [default] with new settings