服务帐户没有对 Google Cloud Storage 的 storage.objects.get 访问权限

Posted

技术标签:

【中文标题】服务帐户没有对 Google Cloud Storage 的 storage.objects.get 访问权限【英文标题】:service account does not have storage.objects.get access for Google Cloud Storage 【发布时间】:2018-12-26 21:10:36 【问题描述】:

我在 Google Cloud Console 中创建了一个服务帐号并选择了角色 Storage / Storage Admin(即完全控制 GCS 资源)。

gcloud projects get-iam-policy my_project 似乎indicate 认为该角色实际上已被选中:

- members:
  - serviceAccount:my_sa@my_project.iam.gserviceaccount.com
  role: roles/storage.admin
- members:
  - serviceAccount:my_sa@my_project.iam.gserviceaccount.com
  role: roles/storage.objectAdmin
- members:
  - serviceAccount:my_sa@my_project.iam.gserviceaccount.com
  role: roles/storage.objectCreator

并且documentation 清楚地表明角色roles/storage.admin 包含权限storage.objects.*(以及storage.buckets.*)。

但是当我尝试将该服务帐户与适用于 Python 的 Google 云存储客户端库结合使用时,我收到以下错误消息:

my_sa@my_project.iam.gserviceaccount.com 没有 storage.objects.get 访问 my_project/my_bucket。

那么为什么所选角色在这种情况下还不够呢?

【问题讨论】:

你能分享你正在使用的代码吗?您能否进一步告诉我有关如何设置此服务帐户以供客户端库使用的信息? @FrankNatividad 这就是问题(和赞成票)的用途。为什么不发布这样的问题(并从此处链接到它,以便我也能注意到它)? gcloud 好像有问题。我遇到了同样的问题。从命令行分配但始终拒绝权限的角色,在删除服务帐户并创建另一个帐户后消失。 以防万一这对将来的任何人有帮助:我遇到了类似的问题,但在授予正确权限后必须重新启动我的 IDE (PyCharm)。 【参考方案1】:

问题显然是服务帐户与太多角色相关联,这可能是以前的配置尝试的结果。

这些步骤解决了这个问题:

删除了有问题的服务帐户(成员)my_saIAM & Admin / IAM 下的所有(三个)角色 在IAM & Admin/Service accounts 下删除了my_sa 重新创建 my_sa(再次使用角色 Storage / Storage Admin

效果是这样的:

my_saIAM & Admin / IAM 下显示一个角色 (Storage Admin) my_sa 显示为Storage / Browser / my_bucket / Edit bucket permissions 下的成员

【讨论】:

很高兴听到您解决了这个问题。原则上,如果服务帐户具有存储管理员角色,则无论它具有什么其他角色,它都应该能够创建存储桶。我尝试重现此问题,拥有一个具有三个角色 storage.admin、storage.objectAdmin 和 storage.objectCreator 的服务帐户;我确认我可以使用该服务帐户创建存储桶。如果您的问题仍然存在,您能否通过添加这些额外角色来仔细检查?【参考方案2】:

值得注意的是,如果您刚刚分配了权限,您需要等待一分钟或其他时间才能使权限生效。至少那是我之后发生的事情:

gcloud projects add-iam-policy-binding xxx --member
"serviceAccount:xxx@xxx.iam.gserviceaccount.com" --role "roles/storage.objectViewer"

【讨论】:

这正是我通过gcloud app deploy部署新的应用引擎时发生的事情。【参考方案3】:

转到您的存储桶的权限部分并为您的存储桶打开添加权限部分。例如,gcloud 告诉你的服务不足是;

1234567890-compute@developer.gserviceaccount.com 

将此服务添加为用户,然后赋予这些角色;

云存储 - 存储管理员 云存储 - 存储对象管理 云存储 - 存储对象创建者

那么您应该有足够的权限对​​您的存储桶进行更改。

【讨论】:

【参考方案4】:

对我来说,这是因为使用 "default-bucket" 作为存储模拟器所需的参数进行部署。

admin.storage().bucket('default-bucket'); // do not deploy that

为了解决这个问题,我在 firebase 管理员初始化时设置了默认存储桶名称。

const admin = require('firebase-admin');

const config = process.env.FUNCTIONS_EMULATOR ? 
    storageBucket: 'default-bucket',
 : 
    storageBucket: 'YOUT_FIREBASE_STORAGE_BUCKET',
;

admin.initializeApp(config);

const bucket = admin.storage().bucket();

【讨论】:

以上是关于服务帐户没有对 Google Cloud Storage 的 storage.objects.get 访问权限的主要内容,如果未能解决你的问题,请参考以下文章

使用 Postman 的服务帐户对 Google Cloud Storage JSON API 进行身份验证

如何从Java脚本安全地调用Google Cloud Run服务?

没有 Google 帐户的 Google Cloud Endpoints

使用 Google Cloud 服务帐户是 VSTS 构建

Google Cloud Dataflow 服务帐户未传播给工作人员?

保存Google Cloud Platform服务帐户凭据的位置