GCP 服务帐号权限

GCP 服务帐号权限

我是 GCP 新手,希望能够得到我所缺少的快速答案。

我有一个项目,其中运行着一个 GCE VM。我想不时将数据集备份到 GCP 的对象存储中。我的计划是从 cron 作业运行“gsutil rsync ...”。

我创建了一个存储桶供该作业使用。我没有编辑存储桶上的权限、角色或任何内容。

我运行“sudo su -”,这样我就以 root 身份运行,正如我期望 cron 作业那样,然后输入

gsutil rsync -r -d <要备份的目录> gs://<bucket>/

我得到了

AccessDeniedException:403 权限不足

在此状态下,我输入了“gcloud config list”,结果显示

帐户 = <xyz>[电子邮件保护]

disable_usage_reporting = True

project = <项目 ID>

您当前使用的配置是:[默认]

这是我创建虚拟机时创建的默认服务帐户。我没有对其进行任何编辑。

在控制台中,我转到 IAM->服务帐户,单击此服务帐户,单击权限选项卡,然后我看到此服务帐户是 <project id> 上的编辑器

在控制台中,我转到 Cloud Storage,浏览,单击我的存储桶,转到权限选项卡,然后我看到编辑者的角色具有“存储旧存储桶所有者”和“存储旧对象所有者”角色。查看这些角色,我被告知第一个角色具有对现有存储桶的读/写访问权限,并具有对对象的创建/列出/删除权限。第二个角色授予我对现有对象的读/写访问权限。

我已经确认该存储桶目前是空的。

我需要做什么才能使我的 gsutil 命令以足够的权限运行?

答案1

最有可能的问题是 Compute Engine VM 实例云 API 访问范围不足。

gsutil rsync命令需要以下权限:

  • 存储.对象.创建
  • 存储.对象.删除
  • 存储.对象.列表
  • storage.objects.get # 存储桶到存储桶复制所需

该角色roles/editor不具备上述任何权限。

Google Cloud Compute Engine VM 实例使用两种方法进行授权:

  • 默认服务帐户
  • 云 API 访问范围

服务帐户必须具有授予上述权限的角色,或者必须授予服务帐户身份对存储桶及其内容的访问权限。Google Cloud Storage 支持两种不同的授权方法。为简单起见,我建议您向服务帐户添加必需角色。对于您的用例gsutil rsync,我建议添加角色roles/storage.legacyBucketOwner

但是,即使服务帐户通过角色具有所需的权限,Compute Engine Cloud API 访问范围也可以夺走这些权限。转到 Google Cloud Console,选择您的 VM 实例。检查启用了哪些范围。您应该启用“存储:完整”或“允许完全访问所有 Cloud API”。否则,服务帐户将受到 gsutil 授权所需的 OAuth 访问令牌所获权限的限制。

Compute Engine VM 实例云 API 访问范围

相关内容