如何使用 "gcloud" CLI 列出所有服务帐户(包括由 GCP 创建的帐户)?



当使用gcloud iam service-accounts list时,我只看到那些由我创建的服务帐户。但由于脚本原因,我希望也获得GCP创建的那些帐户。

特别是我在找815330817453@cloudbuild.gserviceaccount.com。由于我使用terraform创建GCP基础设施,因此我可以而不是依赖815330817453作为标识符,因此需要通过gcloud手动查找服务帐户。

然而,gcloud iam service-accounts list没有列出cloudbuild.gserviceaccount.com服务帐户(也没有任何其他类似的compute.gserviceaccount.com`

检查您的IAM角色,首先将角色IAM admin/Viewer添加到您的用户中,不要忘记将命令与筛选器一起使用--项目gcloud iam service-accounts list --project=PROJECTID。还检查IAM&管理员界面->服务帐户如果你可以看到所有的服务帐户,这意味着你可以使用gcloud命令列出它们,如果不是,你的用户正在扰乱角色

您的问题有几个重要的限定条件。

服务帐户在谷歌云平台中具有双重作用。服务帐户是(两者(资源可以用作标识。

1.资源

服务帐户是在谷歌云平台项目中创建(拥有(的资源。

注意服务帐户也可以应用于非项目资源,以下内容不包括(不包括(这些绑定。

项目foo拥有零个或多个服务帐户。对于项目(PROJECT(,可以列举以下内容:

gcloud iam service-accounts list 
--project=${PROJECT}
2.身份

项目foo包括IAM策略,该策略可能引用零个或多个服务帐户。这些服务帐户可以在任何谷歌云平台项目中创建(归其所有((而不仅仅是引用它们的项目策略(。这些服务帐户包括谷歌管理的服务帐户,例如域gserviceaccount.com中的服务帐户。

要枚举这些服务帐户,需要一个不同的命令。对于项目(PROJECT(,可以列举以下内容:

gcloud projects get-iam-policy ${PROJECT} 
--flatten="bindings[].members[]" 
--filter="bindings.members~"serviceAccount:"" 
--format="value(bindings.members.split(sep=":").slice(1))"

这有点粗糙

  • --flattenbindings切片分解为更易于使用的块
  • --filter筛选组块以仅包括服务帐户
  • --formatserviceAccount:foo解析为foo

gcloud提供了不错的过滤和格式化,但是,如果您更喜欢像jq这样的通用工具,那么:

FILTER='
.bindings[].members[]
|select(. | startswith("serviceAccount:"))
|.[15:]
'
gcloud projects get-iam-policy ${PROJECT} 
--format="json" 
| jq -r "${FILTER}"

说明:

  • 这些对象的.binding[].members[]
  • select(. | startswith("serviceAccount:"))选择serviceAccount:
  • .[15:]剥离serviceAccount:(15(离开账户电子邮件

最新更新