使用 REST API 向 Google Cloud Platform 上的服务帐户添加角色

Posted

技术标签:

【中文标题】使用 REST API 向 Google Cloud Platform 上的服务帐户添加角色【英文标题】:Adding roles to service accounts on Google Cloud Platform using REST API 【发布时间】:2017-07-22 16:36:19 【问题描述】:

我想使用调用 REST API 的 python 脚本在 GCP 上创建一个服务帐户,然后赋予它特定的角色 - 最好是 these,例如 roles/logging.logWriter

首先我向create the account 发出请求,它工作正常,我可以在控制台/IAM 中看到该帐户。 其次,我想赋予它角色,this 似乎是正确的方法。但是,它不接受roles/logging.logWriter,说HttpError 400,"Role roles/logging.logWriter is not supported for this resource."> 相反,如果我在控制台中设置所需的策略,然后尝试getIamPolicy 方法(使用 gcloud 工具),我得到的只是响应etag: ACAB,没有提及我设置的实际角色。因此,我认为这些角色指的是不同的事物。

知道如何使用 API 为服务帐户编写角色/范围脚本吗?

【问题讨论】:

【参考方案1】:

您可以在 GCP 项目中向 GCP 服务帐号授予权限,而无需重写整个项目政策!

为此使用gcloud projects add-iam-policy-binding ... 命令 (docs)。

例如,给定环境变量 GCP_PROJECT_IDGCP_SVC_ACC,以下命令会将 container.admin 角色中的所有权限授予所选服务帐户:

gcloud projects add-iam-policy-binding $GCP_PROJECT_ID \
    --member=serviceAccount:$GCP_SVC_ACC
    --role=roles/container.admin

回顾你所做的:

$ gcloud projects get-iam-policy $GCP_PROJECT_ID \
    --flatten="bindings[].members" \
    --format='table(bindings.role)' \
    --filter="bindings.members:$GCP_SVC_ACC"

输出:

ROLE
roles/container.admin

(或更多角色,如果之前已授予)

注意事项:

环境变量 GCP_SVC_ACC 应包含服务帐户的电子邮件符号。 感谢 this answer 提供格式精美的读数。

【讨论】:

【参考方案2】:

您似乎正在尝试在服务帐户(作为资源)上设置角色。那是为了设置谁可以使用服务帐户。

如果您想为服务帐户(作为身份)赋予项目及其资源的特定角色,请参阅此方法:https://cloud.google.com/resource-manager/reference/rest/v1/projects/setIamPolicy

【讨论】:

需要非常小心,页面开头如下: 为指定项目设置 IAM 访问控制策略。 覆盖任何现有政策。 是的,先获取现有策略,修改,再编写。 仍然不建议设置 serviceAccounts 来接收其他 serviceAccounts/用户(您回答的第一句话)?这种完全覆盖感觉很极端,一个错误可能会搞砸你的整个项目。老实说,我发现在 gcloud 上很难正确理解这两个。与 aws 相比,组/用户更容易理解。感觉更安全,您可以从组中切换用户。请问 gcloud 上是否存在类似的模式? @ben 你能以更安全的方式做到这一点吗? 不;放弃并在 aws 上走得更远

以上是关于使用 REST API 向 Google Cloud Platform 上的服务帐户添加角色的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 创建 REST API [重复]

无法使用服务帐户访问 Google REST Api

GMail REST API:使用没有模拟的 Google 凭据

如何使用 python 发送 REST API(Google Vision 的 API)请求?

需要帮助使用 Google Oauth 和 Android 配置 Django Rest API

如何使用 REST API 使用 Google Ads API v0 获取经过身份验证的用户的 Google Ad Account ID?