You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Cloud支持链式服务账户Impersonation吗?如何实现?

Google Cloud 链式服务账户模拟支持与实现方案

核心结论

Google Cloud支持链式(多重)服务账户模拟,即可以从已被模拟的服务账户身份,再次模拟另一个服务账户,类似AWS STS的双重角色扮演能力。

问题诊断(你的Python代码错误)

你之前的实现失败主要有两个原因:

  1. target_scopes为空:Google Cloud的身份凭证必须指定具体的API作用域,否则无法获得有效的操作授权。
  2. target_principal参数错误:该参数需要传入目标服务账户的完整邮箱地址(如service-account-b@your-project.iam.gserviceaccount.com),而不是凭证对象。

正确Python SDK实现

前置条件

  • 服务账户A已被授予服务账户B的roles/iam.serviceAccountTokenCreator角色
  • 服务账户B已被授予服务账户C的roles/iam.serviceAccountTokenCreator角色
  • 源凭证(source_credentials_a)是服务账户A的有效凭证(可以是密钥文件、工作负载身份凭证等)

修正后的代码

from google.auth import impersonated_credentials
from googleapiclient.discovery import build

# 1. 模拟服务账户B
service_account_b_email = "service-account-b@your-project.iam.gserviceaccount.com"
service_account_b_creds = impersonated_credentials.Credentials(
    source_credentials=source_credentials_a,
    target_principal=service_account_b_email,
    # 指定需要的API作用域,cloud-platform是通用全作用域,也可以按需缩小
    target_scopes=["https://www.googleapis.com/auth/cloud-platform"],
    lifetime=3600,  # 最大有效期3600秒,不能超过上一级凭证的剩余有效期
)

# 2. 基于B的凭证模拟服务账户C
service_account_c_email = "service-account-c@your-project.iam.gserviceaccount.com"
service_account_c_creds = impersonated_credentials.Credentials(
    source_credentials=service_account_b_creds,
    target_principal=service_account_c_email,
    target_scopes=["https://www.googleapis.com/auth/cloud-platform"],
    lifetime=3600,
)

# 验证:使用C的凭证调用API(比如列出Compute Engine实例)
compute = build("compute", "v1", credentials=service_account_c_creds)
response = compute.instances().list(project="your-project-id", zone="us-central1-a").execute()
print(response)

CLI下的链式模拟实现

Google Cloud CLI没有类似AWS STS的全局模拟命令,但可以通过以下两种方式实现链式模拟:

方式一:生成多级访问令牌并全局使用

  1. 先模拟服务账户B,获取其访问令牌:
gcloud auth print-access-token --impersonate-service-account service-account-b@your-project.iam.gserviceaccount.com
  1. 使用B的令牌模拟服务账户C,获取C的访问令牌并设置为全局环境变量:
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token --impersonate-service-account service-account-c@your-project.iam.gserviceaccount.com --access-token $(gcloud auth print-access-token --impersonate-service-account service-account-b@your-project.iam.gserviceaccount.com))
  1. 后续所有gcloud命令都会自动使用这个令牌,以服务账户C的身份执行。

方式二:使用中间凭证文件

  1. 生成服务账户B的应用默认凭证:
gcloud auth application-default login --impersonate-service-account service-account-b@your-project.iam.gserviceaccount.com
  1. 使用该凭证模拟服务账户C:
gcloud config set auth/impersonate_service_account service-account-c@your-project.iam.gserviceaccount.com
# 此时所有gcloud命令会以C的身份执行,基于B的模拟凭证

关键注意事项

  • 有效期限制:每一级模拟的凭证有效期不能超过上一级凭证的剩余有效期,且单级最大有效期为1小时(3600秒)。
  • 权限验证:确保TokenCreator角色是直接授予给上级服务账户的(在目标服务账户的IAM页面中添加授权,而非项目级IAM)。
  • 作用域最小化:建议按需指定target_scopes,避免使用过于宽泛的cloud-platform作用域,提升安全性。

内容的提问来源于stack exchange,提问作者genericname

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:35:20