如何自动获取GCP中服务账号的名称、角色及密钥?
GCP全项目服务账号信息批量获取方案
前提要求
- 已安装并完成
gcloudCLI初始化,拥有全项目/组织级IAM权限(至少包含roles/iam.serviceAccountViewer、roles/iam.securityReviewer、roles/cloudasset.viewer) - 若按组织范围获取项目,需提前准备组织ID
批量获取脚本(Bash)
以下脚本会遍历指定范围的所有项目,输出每个服务账号的项目ID、邮箱、名称、绑定角色、密钥创建时间、密钥状态,结果为CSV格式便于后续分析:
#!/bin/bash # 配置:替换为你的组织ID,无需组织则注释此行并启用下一行 ORG_ID="your-organization-id" PROJECTS=$(gcloud projects list --filter="parent.type=organization" --organization=$ORG_ID --format="value(projectId)") # PROJECTS=$(gcloud projects list --format="value(projectId)") # 无组织时,获取所有有权限的项目 # 输出CSV表头 echo "项目ID,服务账号邮箱,服务账号名称,绑定角色,密钥创建时间,密钥状态" # 遍历每个项目 for PROJECT in $PROJECTS; do echo "处理项目: $PROJECT" # 获取当前项目下所有服务账号的邮箱和显示名称 SERVICE_ACCOUNTS=$(gcloud iam service-accounts list --project=$PROJECT --format="value(email,displayName)") # 遍历每个服务账号 while read -r SA_EMAIL SA_NAME; do # 获取该服务账号绑定的所有项目级角色(多角色用逗号分隔) ROLES=$(gcloud projects get-iam-policy $PROJECT --filter="bindings.members:serviceAccount:$SA_EMAIL" --format="value(bindings.role)" | tr '\n' ',' | sed 's/,$//') # 获取服务账号的密钥信息 KEY_INFO=$(gcloud iam service-accounts keys list --iam-account=$SA_EMAIL --project=$PROJECT --format="value(validAfterTime,keyState)") if [ -z "$KEY_INFO" ]; then # 无密钥时输出基础信息 echo "$PROJECT,$SA_EMAIL,$SA_NAME,$ROLES,,无密钥" else # 有密钥时逐行输出密钥详情 while read -r CREATE_TIME STATE; do echo "$PROJECT,$SA_EMAIL,$SA_NAME,$ROLES,$CREATE_TIME,$STATE" done <<< "$KEY_INFO" fi done <<< "$SERVICE_ACCOUNTS" done
关键说明
- 解决重复问题:脚本直接从每个项目的服务账号列表拉取信息,每个服务账号归属于唯一项目,不会出现Asset Inventory中因跨层级引用导致的重复条目
- 角色获取逻辑:默认获取项目级绑定的角色,若需包含组织/文件夹级的继承角色,可将角色获取命令替换为:
该命令会返回所有层级绑定的唯一角色,避免重复角色条目ROLES=$(gcloud asset search-all-iam-policies --query="policy:bindings.members:serviceAccount:$SA_EMAIL" --format="value(bindings.role)" | sort -u | tr '\n' ',' | sed 's/,$//') - 权限兼容:若部分项目权限不足,脚本会跳过对应项目的信息获取,可通过控制台补充权限后重新运行
使用建议
- 大组织下项目较多时,建议后台运行并输出到文件:
./sa-scan.sh > sa-info.csv & - 可通过
gcloud config set project PROJECT_ID单独测试单个项目的信息获取,验证脚本有效性
内容的提问来源于stack exchange,提问作者jweckl
相关产品推荐
相关产品推荐

