有没有办法在 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
这个:
- 获取每个可访问 (!) 项目的策略
- 将结果展平以按
serviceAccount
的 进行过滤
- 仅输出(服务帐户)成员
- 过滤 (
grep
) 的 {foo}@{bar}.iam.gserviceaccount.com
- 过滤 (
grep
) 那些不是 Google-managed (service-[0-9]{14}
)
- 按不属于当前项目的项目过滤 (
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
) 中有您的项目之一的服务帐户。
我们有 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
这个:
- 获取每个可访问 (!) 项目的策略
- 将结果展平以按
serviceAccount
的 进行过滤
- 仅输出(服务帐户)成员
- 过滤 (
grep
) 的{foo}@{bar}.iam.gserviceaccount.com
- 过滤 (
grep
) 那些不是 Google-managed (service-[0-9]{14}
) - 按不属于当前项目的项目过滤 (
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
) 中有您的项目之一的服务帐户。