有没有办法在 gcp 中列出跨项目服务帐户

Is there a way to list cross project service accounts in gcp

我们有 600 多个手动创建的项目,我想获取这些项目中的跨项目服务帐户列表, gcloud iam 服务帐户列表 --project=myproject 命令只显示所有服务帐户,我相信某些服务帐户有几个 projects.I 的权限已经检查了 gcloud alpha 和 gcloud beta,似乎没有这样的功能。 任何帮助将不胜感激!

有更好的方法来做到这一点!

您想使用具有足够访问权限的帐户(所有项目及其 IAM 策略)。

枚举所有项目。为每个项目列举其 IAM 政策。确定具有 {anything}@{project}.iam.gserviceaacount.com 形式的电子邮件地址的服务帐户 (members:serviceAccount)。列出此项目的 {project} 的值。

由于固有的复杂性,我认为用 shell 以外的语言编写会有所帮助。但是,为方便起见,这里有一个(hacky)Bash 脚本:

PROJECTS=$(gcloud projects list --format="value(projectId)")

for PROJECT in ${PROJECTS}
do
  printf "\nProject: ${PROJECT}"
  gcloud projects get-iam-policy ${PROJECT} \
  --flatten="bindings[].members[]" \
  --filter="bindings.members:serviceAccount*" \
  --format="value(bindings.members)" \
  | grep -E -o "[a-z][-a-z0-9]{4,28}[a-z0-9]@[a-z][-a-z0-9]{4,28}[a-z0-9].iam.gserviceaccount.com" \
  | grep -E -wv "service-[0-9]{12}@[a-z0-9][a-z0-9-]{4,28}[a-z0-9].iam.gserviceaccount.com"   \
  | grep -E -wv "@${PROJECT}.iam.gserviceaccount.com"
done

这个:

  1. 获取每个可访问 (!) 项目的策略
  2. 将结果展平以按 serviceAccount
  3. 进行过滤
  4. 仅输出(服务帐户)成员
  5. 过滤 (grep) 的 {foo}@{bar}.iam.gserviceaccount.com
  6. 过滤 (grep) 那些不是 Google-managed (service-[0-9]{14})
  7. 按不属于当前项目的项目过滤 (grep)

NOTE [a-z][-a-z0-9]{4,28}[a-z0-9] matches Google Project and Service Account IDs (I think!)

结果包括 Google-managed 个帐户(*.iam.gserviceaccount.com)。排除这些的一种方法是 包括在域 ({project}.iam.gserviceaccount.com) 中有您的项目之一的服务帐户。