1. 理解 GCP 中的服务账号与角色
在 Google Cloud Platform(GCP)中,服务账号(Service Account)是一种特殊的 Google 账号,代表非人类用户用于访问 GCP API。它通常用于运行在 Compute Engine 实例、Kubernetes Engine Pod 或其他服务中的应用程序。
角色(Role)是权限的集合,用于定义某个账号对资源的操作权限。GCP 中的角色分为三类:
- 原始角色(Primitive):如 Owner、Editor、Viewer
- 预定义角色(Predefined):特定于某项服务,如
roles/storage.admin
- 自定义角色(Custom):根据需求自定义权限组合
服务账号通过 IAM 策略(IAM Policy)获得角色授权,从而获得访问资源的权限。
2. 列出服务账号关联角色的方法
目前,有三种主流方式可以列出服务账号所拥有的角色:
- 使用 GCP 控制台(Console)
- 使用 gcloud 命令行工具
- 使用 REST API
以下分别介绍这几种方式的使用方法和注意事项。
2.1 通过 GCP 控制台查看
✅ 优点:操作简单,适合快速查看。
操作步骤如下:
- 登录 GCP Console
- 进入左侧菜单的 IAM 和管理 > IAM
- 在 IAM 页面中,可以看到所有主体(用户、组、服务账号),每项都会列出其拥有的角色
- 可通过左侧菜单的 服务账号 查看所有服务账号列表,它们的邮箱通常以
@<project-id>.iam.gserviceaccount.com
结尾
⚠️ 注意:控制台默认只显示项目级别的 IAM 角色,如果服务账号在其他资源级别(如 Cloud Storage Bucket、Compute Engine 实例)有权限,则需要单独查看对应资源的 IAM 设置。
2.2 使用 gcloud 命令行工具
✅ 优点:自动化程度高,适合脚本化操作。
前置条件:
- 已安装 Google Cloud SDK
- 已执行
gcloud auth login
登录
方法一:使用 gcloud + jq 提取角色
gcloud projects get-iam-policy <PROJECT_ID> --format=json > policy.json
jq '.bindings[] | select(.members[] | contains("serviceAccount:<SERVICE_ACCOUNT_EMAIL>")) | .role' policy.json
方法二:直接使用 gcloud 命令过滤
gcloud projects get-iam-policy <PROJECT_ID> \
--flatten="bindings[].members" \
--format='table(bindings.role)' \
--filter="bindings.members:serviceAccount:<SERVICE_ACCOUNT_EMAIL>"
输出示例:
ROLE
roles/viewer
roles/storage.objectViewer
roles/logging.logWriter
⚠️ 注意:该方法仅能获取项目级别的角色,如需查看特定资源(如 Bucket)的权限,需使用对应命令(如 gsutil iam get
)。
2.3 使用 GCP REST API
✅ 优点:适用于程序化访问或自动化流程。
步骤如下:
- 确保已启用 Cloud Resource Manager API
- 获取访问 Token:
gcloud auth print-access-token
- 使用 curl 获取 IAM 策略:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://cloudresourcemanager.googleapis.com/v1/projects/<PROJECT_ID>:getIamPolicy > policy.json
- 使用 jq 提取角色信息:
jq '.bindings[] | select(.members[] | contains("serviceAccount:<SERVICE_ACCOUNT_EMAIL>")) | .role' policy.json
⚠️ 注意:REST API 同样仅获取项目级别的 IAM 角色,如需资源级别的权限信息,需调用特定资源的 API。
3. 查看其他资源级别的角色
服务账号可能在特定资源上拥有权限,如 Cloud Storage Bucket、Compute Engine 实例等。以下是两个常见资源的查看方法:
3.1 Cloud Storage Bucket
gsutil iam get gs://<BUCKET_NAME> > bucket_policy.json
jq '.bindings[] | select(.members[] | contains("serviceAccount:<SERVICE_ACCOUNT_EMAIL>")) | .role' bucket_policy.json
3.2 Compute Engine 实例
Compute Engine 实例本身不直接配置 IAM 角色,而是通过绑定的服务账号继承权限。
查看实例绑定的服务账号:
gcloud compute instances describe <INSTANCE_NAME> --format="get(serviceAccounts)"
4. 常见角色示例
你可能会看到如下角色:
roles/viewer
roles/editor
roles/storage.admin
roles/compute.instanceAdmin
这些是 GCP 预定义角色的标识符。具体权限说明可参考官方文档:GCP IAM Roles Reference
5. 常见问题与排查
5.1 权限不足导致无法获取 IAM 策略
错误信息:PERMISSION_DENIED
解决方法:
- 确认当前账号拥有
roles/viewer
或resourcemanager.projects.getIamPolicy
权限 - 请项目 Owner 或管理员授予相应权限
- 检查 Token 是否过期或认证失败
5.2 服务账号未出现在 IAM 策略中
可能原因:该服务账号在当前项目级别没有被分配任何角色。
排查方法:
- 使用
gcloud iam service-accounts list
确认服务账号存在 - 检查资源级别(如 Bucket、Topic)的 IAM 策略
5.3 资源级别的角色未被识别
问题描述:项目级别未查到角色,但服务账号实际有访问权限。
解决方法:
- 检查具体资源的 IAM 策略:
- Bucket:
gsutil iam get
- Pub/Sub Topic:
gcloud pubsub topics get-iam-policy
- Compute Engine:检查实例绑定的服务账号
- Bucket:
6. 最佳实践
为了确保权限管理安全、清晰,建议遵循以下实践:
✅ 最小权限原则(Least Privilege):仅授予服务账号必要的权限,避免过度授权。
✅ 定期审计权限:周期性检查服务账号的角色分配,确保权限仍符合业务需求。
✅ 使用自定义角色:当预定义角色权限过重时,创建自定义角色以精确控制权限。
✅ 记录角色分配原因:为每个角色分配记录背景和用途,便于后续审计和维护。
7. 总结
本文介绍了三种主流方法(GCP Console、gcloud 命令行、REST API)来列出服务账号所关联的角色,并说明了如何查看资源级别的权限信息。同时,也列举了常见问题及排查方法,并提出了权限管理的最佳实践。
掌握这些方法,有助于更好地进行 GCP 权限管理,避免权限滥用和安全风险。