GCP如何无需密钥文件以服务账号身份运行Python应用
当然有无需下载服务账号密钥文件、让Python程序以服务账号身份运行的方案,和gcloud、gsutil自带的--impersonate-service-account参数逻辑完全一致,谷歌云官方Python客户端原生支持该能力,全程不需要落地静态密钥文件,安全风险极低。
服务账号密钥若被泄露会带来安全风险,我们建议您避免下载服务账号密钥。
前置权限要求
不管用下面哪种实现方式,首先要给当前运行程序所使用的身份(本地开发时的个人谷歌云账号、GCE/GKE/Cloud Run/Cloud Function等GCP托管环境绑定的默认服务账号),绑定目标服务账号的roles/iam.serviceAccountTokenCreator角色,否则模拟请求会直接被IAM权限拦截。
具体实现方案
客户端初始化时直接指定模拟目标
所有官方Google Cloud Python客户端都自带impersonate_service_account初始化参数,传入目标服务账号的邮箱即可生效,不需要额外安装依赖或做其他配置,示例代码:from google.cloud import storage # 初始化存储客户端时直接指定要模拟的服务账号 storage_client = storage.Client( impersonate_service_account="target-sa@your-project-id.iam.gserviceaccount.com" ) # 后续所有接口调用都会以目标服务账号的身份执行 buckets = list(storage_client.list_buckets())这个参数是所有GCP服务官方客户端的通用配置项,BigQuery、Pub/Sub、Vertex AI等服务的客户端初始化时都可以直接传入使用。
配置环境变量全局生效
如果不想在每个客户端初始化代码里重复加参数,可以设置全局环境变量GOOGLE_IMPERSONATE_SERVICE_ACCOUNT,值填目标服务账号邮箱,之后所有初始化的官方客户端都会自动走服务账号模拟逻辑,完全不需要修改业务代码:# 执行Python程序前先设置环境变量 export GOOGLE_IMPERSONATE_SERVICE_ACCOUNT=target-sa@your-project-id.iam.gserviceaccount.com python your_app.py本地开发场景通过gcloud配置默认凭证模拟
本地开发调试时,还可以直接通过gcloud命令给应用默认凭证(ADC)配置默认模拟规则,配置完成后本地跑程序不需要改代码、也不需要额外设置环境变量,自动以目标服务账号身份运行:# 配置默认模拟的服务账号 gcloud config set auth/impersonate_service_account target-sa@your-project-id.iam.gserviceaccount.com # 需要取消配置时执行下面的命令即可 gcloud config unset auth/impersonate_service_account
以上几种方案全程都不会生成或下载持久化的服务账号密钥文件,身份凭证都是运行时动态申请的短期有效令牌,不存在静态密钥泄露的风险,完全符合安全规范要求。
内容的提问来源于stack exchange,提问作者mon。

