如何列出与GCP服务帐户相关的角色?

123
在Google Cloud Gui控制台中,我访问了"IAM和管理员" > "服务帐户"并创建了一个名为"my-service-account"的服务帐户,并将其赋予了查看者角色。然后我运行了这个命令:
gcloud iam service-accounts get-iam-policy my-service-account@mydomain.iam.gserviceaccount.com

并看到了这个输出:

etag: ACAB
根据文档,这意味着该服务帐户没有与之关联的策略。因此我给它分配了一个在其“策略”中未包含的“角色”。
如何列出与服务帐户关联的角色?
编辑:感谢对这个问题的精彩回答,我现在可以循环遍历所有项目并获得我想要的结果。所以,根据您所使用的这些 cmd 工具的版本,这应该会列出跨所有项目的单个服务帐户的所有角色绑定。
gcloud projects list | \
  awk '{print $1}' | \
  xargs -I % sh -c "echo ""; echo project:% && \
  gcloud projects get-iam-policy % \
  --flatten='bindings[].members' \
  --format='table(bindings.role)' \
  --filter='bindings.members:YOU-SERVICE-ACCOUNT@blah.com' \
  ;" 

我认为您在答案的第一行错过了一个小标志。更完美的第一行应该是:“gcloud projects list --format='value(projectId)' | \”。 “--format”标志可以去掉不必要的标题行。此外,我个人认为foreach更易读。因此,另一种解决方案是foreach PROJECT in $(gcloud projects list --format='value(projectId)'); do echo "${PROJECT}:"; gcloud projects get-iam-policy ${PROJECT} --flatten='bindings[].members' --format='table(bindings.role)' --filter='bindings.members:YOU-SERVICE-ACCOUNT@blah.com'; done - Vincent Yin
4个回答

203

要筛选特定的服务账号,可以使用以下gcloud命令:

gcloud projects get-iam-policy <YOUR GCLOUD PROJECT>  \
--flatten="bindings[].members" \
--format='table(bindings.role)' \
--filter="bindings.members:<YOUR SERVICE ACCOUNT>"

产生良好的输出:

ROLE
roles/cloudtrace.agent
roles/servicemanagement.serviceController
roles/viewer

当然,format参数可以根据您的具体需求进行调整。


11
非常有帮助!我将其修改为列出具有特定角色的服务帐号:gcloud projects get-iam-policy $PROJECT --flatten="bindings[].members" --format="table(bindings.members)" --filter="bindings.role:$ROLE" - Nicolai S
1
这太棒了! - llompalles
1
有没有用于过滤的REST API? - CriticalRebel
1
把下面的程序相关内容从英语翻译成中文。仅返回翻译后的文本:我将其标记为答案,因为这正是我想要的。 - red888
1
FYI:Windows在命令标志中需要使用双引号。 - undefined
显示剩余5条评论

45

在Google Cloud中,您可以为项目和服务账户设置IAM策略。

使用项目的IAM策略,您可以定义谁可以对Google Cloud项目中的资源执行特定操作。通过将“查看者”角色添加到您的服务账户中,您修改了项目策略(即您的服务账户在项目内可以执行的操作)。

另一方面,服务账户的IAM策略用于控制谁拥有和谁可以访问服务账户及其设置。这就是您使用发布的命令检索的内容,但您没有获得任何内容,因为您获取的是服务账户的策略,而不是项目的策略。

为了获取包含成员及其相应角色的项目的IAM策略,您可以运行以下命令

gcloud projects get-iam-policy PROJECT_ID

你可以在以下链接中找到有关服务帐号的更多信息:

https://cloud.google.com/iam/docs/service-accounts

https://cloud.google.com/iam/docs/granting-roles-to-service-accounts


服务账户可以跨项目吗?是否有一些功能可以让我查询服务账户并查看其访问权限(而不是像您的命令示例中那样反过来)? - red888
你的意思是说使用 span 项目创建新项目吗?要创建一个项目,仅拥有一个项目的所有权是不够的。所以我不确定,明天我会测试一下。第二个答案是肯定的,可以参考 https://cloud.google.com/sdk/gcloud/reference/iam/service-accounts/get-iam-policy gcloud iam service-accounts get-iam-policy SERVICE_ACCOUNT @red888 - GalloCedrone
是的,我相信使用 permission resourcemanager.projects.create 是可能的。请参考 https://cloud.google.com/resource-manager/docs/access-control-proj。 - GalloCedrone
1
"gcloud project" 现在被命名为 "gcloud projects"。 - Nicolai S

10
您可以使用此命令列出分配给服务账户的资源和角色:

示例代码:

gcloud beta asset search-all-iam-policies --scope=organizations/123 --query="policy:456@cloudservices.gserviceaccount.com" | egrep "role:|resource:|gserviceaccount"

只要您在范围上拥有 cloudasset.assets.searchAllIamPolicies 权限,就可以将范围更改为文件夹或项目。
更多详细信息: 如何在 Google Cloud 平台(GCP)中列出、查找或搜索跨服务(API)、资源类型和项目的 iam 策略?

5
在控制台中查看每个服务帐户的角色:
  1. 复制您的服务帐户的电子邮件(从IAM和管理 -> 服务帐户 - 详细信息);
  2. 转到:IAM和管理 ->策略分析器 ->自定义查询;
  3. 将参数1设置为Principal。将电子邮件粘贴到主体字段中;
  4. 单击“继续”,然后单击“运行查询”。
您将获得给定服务帐户的角色列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接