我们有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
:
- 获取每个可访问(!)项目的策略
- 使结果变平以
serviceAccount
s 过滤 - 只输出(服务帐户)成员
{foo}@{bar}.iam.gserviceaccount.com
过滤器(- 过滤器(
grep
)由那些不是谷歌管理的(service-[0-9]{14}
) - 当前项目不拥有的过滤器(
grep
)
grep
)注意
[a-z][-a-z0-9]{4,28}[a-z0-9]
匹配谷歌项目和服务帐户id(我认为!)
结果包括谷歌管理的帐户(*.iam.gserviceaccount.com
)。排除这些的一种方法是只使用包括在域({project}.iam.gserviceaccount.com
)中包含您的一个项目的服务帐户。