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 控制台查看

优点:操作简单,适合快速查看。

操作步骤如下:

  1. 登录 GCP Console
  2. 进入左侧菜单的 IAM 和管理 > IAM
  3. 在 IAM 页面中,可以看到所有主体(用户、组、服务账号),每项都会列出其拥有的角色
  4. 可通过左侧菜单的 服务账号 查看所有服务账号列表,它们的邮箱通常以 @<project-id>.iam.gserviceaccount.com 结尾

⚠️ 注意:控制台默认只显示项目级别的 IAM 角色,如果服务账号在其他资源级别(如 Cloud Storage Bucket、Compute Engine 实例)有权限,则需要单独查看对应资源的 IAM 设置


2.2 使用 gcloud 命令行工具

优点:自动化程度高,适合脚本化操作。

前置条件

方法一:使用 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

优点:适用于程序化访问或自动化流程。

步骤如下:

  1. 确保已启用 Cloud Resource Manager API
  2. 获取访问 Token:
gcloud auth print-access-token
  1. 使用 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
  1. 使用 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/viewerresourcemanager.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:检查实例绑定的服务账号

6. 最佳实践

为了确保权限管理安全、清晰,建议遵循以下实践:

最小权限原则(Least Privilege):仅授予服务账号必要的权限,避免过度授权。

定期审计权限:周期性检查服务账号的角色分配,确保权限仍符合业务需求。

使用自定义角色:当预定义角色权限过重时,创建自定义角色以精确控制权限。

记录角色分配原因:为每个角色分配记录背景和用途,便于后续审计和维护。


7. 总结

本文介绍了三种主流方法(GCP Console、gcloud 命令行、REST API)来列出服务账号所关联的角色,并说明了如何查看资源级别的权限信息。同时,也列举了常见问题及排查方法,并提出了权限管理的最佳实践。

掌握这些方法,有助于更好地进行 GCP 权限管理,避免权限滥用和安全风险。


原始标题:How to List the Roles Associated with a GCP Service Account?