是否有办法在gcp中列出跨项目服务帐户?



我们有600多个手工创建的项目,我想获得这些项目中的跨项目服务帐户列表,Gcloud iam服务帐户列表——project=myproject命令只显示所有的服务帐户,而且我相信一些服务帐户在几个项目中具有权限。我检查了gcloud alpha和gcloud beta,似乎没有这样的功能。任何帮助将不胜感激!

有更好的方法!

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

列举所有项目。为每个项目列举其IAM策略。识别电子邮件地址为{anything}@{project}.iam.gserviceaacount.com的服务帐户(members:serviceAccount)。请列出本工程{project}的取值

由于固有的复杂性,我认为用shell以外的语言编写将会受益。但是,为了方便起见,这里有一个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. 使结果变平以serviceAccounts
  3. 过滤
  4. 只输出(服务帐户)成员
  5. {foo}@{bar}.iam.gserviceaccount.com
  6. 过滤器(grep)
  7. 过滤器(grep)由那些不是谷歌管理的(service-[0-9]{14})
  8. 当前项目不拥有的过滤器(grep)

注意[a-z][-a-z0-9]{4,28}[a-z0-9]匹配谷歌项目和服务帐户id(我认为!)

结果包括谷歌管理的帐户(*.iam.gserviceaccount.com)。排除这些的一种方法是只使用包括在域({project}.iam.gserviceaccount.com)中包含您的一个项目的服务帐户。

最新更新