GCP 服务帐号角色无法正常工作

GCP 服务帐号角色无法正常工作

当向我的服务帐户授予角色时,这些角色并没有授予我他们所说的权限。

我正在使用 Terraform。我创建了一个新的服务帐户,如下所示:

gcloud iam service-accounts create terraform \ --display-name "Terraform admin account"

我为该帐户创建了一个新的 JSON 凭证:

gcloud iam service-accounts keys create service account.json \ --iam-account terraform@PROJECT_ID.iam.gserviceaccount.com

我已授予Compute Instance Admin此服务帐户如下所述的角色:https://cloud.google.com/iam/docs/understanding-roles#role_types

gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:terraform@PROJECT_ID.iam.gserviceaccount.com \ --role roles/compute.instanceAdmin

我可以看到服务帐户具有正确的权限:

gcloud projects get-iam-policy PROJECT_ID  \
--flatten="bindings[].members" \
--format='table(bindings.role)' \
--filter="bindings.members:terraform"
ROLE
roles/compute.instanceAdmin

即使我授予ownereditor扮演角色,我仍然会一遍又一遍地收到以下错误。

Error: Error reading ComputeNetwork "network-2pal-network": googleapi: Error 403: Required 'compute.networks.get' permission for 'projects/PROJECT_ID/global/networks/mars-production-network-2pal-network', forbidden
Error: Error reading ComputeGlobalAddress "mars-production-lb-ip": googleapi: Error 403: Required 'compute.globalAddresses.get' permission for 'projects/PROJECT_ID/global/addresses/production-lb-ip', forbidden

我完全被困住了。有人知道如何解决这个问题吗?GCP 好像根本不检查凭证。这太疯狂了。

谢谢

答案1

您是否曾删除过 Terraform 服务帐户,后来又重新创建了它?重新创建的同名服务帐户会出现意外行为。这是 GCP IAM 中的一个已知问题 -删除并重新创建服务账户

根据上面链接的文档 -

为了避免混淆,我们建议使用唯一的服务帐户名称。
如果这不可能,您可以通过以下方式向新服务帐户授予角色:

1.明确删除授予旧服务帐户该角色的所有绑定。
2. 将这些角色重新授予新的服务帐户。

答案2

如果用户将管理配置为以服务帐户运行的虚拟机实例,您还必须授予角色/iam.serviceAccountUser 角色。被授予服务帐户服务帐户用户角色的用户可以使用该角色间接访问服务帐户有权访问的所有资源。

例如,如果某个服务帐户已被授予计算管理员角色 (roles/compute.admin),则被授予服务帐户用户角色的用户(角色/iam.serviceAccountUser)该服务帐号上的用户可充当服务帐号来启动 Compute Engine 实例。在此流程中,用户将模拟服务帐号,使用其授予的角色和权限执行任何任务。

相关内容