首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用户没有storage.objects.list访问桶的权限

用户没有storage.objects.list访问桶的权限
EN

Stack Overflow用户
提问于 2019-12-20 09:24:27
回答 4查看 31.9K关注 0票数 8

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

代码语言:javascript
运行
复制
Owner
Storage Admin
Storage Object Admin
Tester

Tester是我使用以下权限创建的用于学习目的的角色:

代码语言:javascript
运行
复制
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代码应该可以工作(在我的本地计算机上运行):

代码语言:javascript
运行
复制
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)

但事实并非如此:

代码语言:javascript
运行
复制
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.

桶使用统一的桶级访问控制。我使用的服务帐户是这个桶的成员,它继承这个成员身份:

代码语言:javascript
运行
复制
Storage Admin
Storage Object Admin
Tester

有人能解释一下这种行为背后的原因吗?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-12-20 14:30:44

我个人认为,在开发/测试中,没有必要回避过度授予的角色。但是,如果您确实要提供多个角色,那么不如提供一个管理角色,而不是多个较小的角色(因为实际上它们都在执行相同的任务,但是角色较少)。

对于你的具体问题,我建议

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

在SO上有一个类似职位,这似乎是以类似的方式解决的。

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

票数 10
EN

Stack Overflow用户

发布于 2021-10-27 12:09:59

在创建项目之前,当我试图检查项目中是否已经存在一个桶时,我遇到了这个问题。在我的例子中,这个问题并不是说角色问题,因为我的服务帐户有一个存储管理、存储对象管理和创建者角色,但是我试图检查的桶名(从我的python代码中)不是全局唯一的。当我将桶的名称改为全局唯一的名称时,错误就消失了。

票数 5
EN

Stack Overflow用户

发布于 2019-12-20 11:27:41

这就是为什么我问您是否将这个桶转换为统一的桶级访问控制,还是创建它。我的理论是,你把它调到统一桶级,触发了这个免责声明。

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

这就是为什么当您手动添加角色时,它是工作的。

您可以更多地了解统一桶级访问权限是如何工作的,这里

这里有更多关于正在发生的事情的相关信息。

此外,如果您启用统一的桶级访问作为创建新桶的一部分,则桶将自动接收额外的Cloud角色。此行为维护从桶的默认对象ACL继承的对象的权限。如果在现有桶上启用统一的桶级访问,则必须手动应用任何此类角色;如果更改了桶的默认对象ACL,则可能希望应用不同的角色集。

这也是我所理解的,是对我们所得到的错误的解释。

一旦启用,以下ACL功能将停止: 设置、读取或修改桶和对象ACL的请求失败,导致400个坏请求错误。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59422730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档