如何在Cloud Run多服务架构中遵循PoLP并解耦部署与权限配置
解除Cloud Run后端与服务账号的部署耦合方案(无需开放allAuthenticatedUsers权限)
场景回顾
我们的GCP Cloud Run后端已启用认证,Ingress配置为「Internal + Load Balancing」,依赖服务通过专属服务账号以REST方式访问,需被授予roles/run.invoker角色。当前痛点是必须先部署后端应用才能分配角色,导致两者强耦合,需寻找替代方案。
可行解决方案
1. 自定义IAM角色+资源条件绑定
通过创建等价于roles/run.invoker的自定义角色,提前在项目/文件夹层级绑定到目标服务账号,并通过条件表达式限制权限仅作用于待部署的Cloud Run服务,无需等待后端部署完成。
- 创建自定义角色(包含
run.services.invoke核心权限):gcloud iam roles create CustomRunInvoker \ --project=YOUR_PROJECT_ID \ --title="Custom Cloud Run Invoker" \ --description="Limited invoker access to specific Cloud Run services" \ --permissions=run.services.invoke - 绑定权限到服务账号(带条件限制目标服务):
后端部署后,权限会自动匹配生效。gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:YOUR_CLIENT_SA@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ --role="projects/YOUR_PROJECT_ID/roles/CustomRunInvoker" \ --condition="expression=resource.name.startsWith('projects/YOUR_PROJECT_ID/locations/YOUR_REGION/services/TARGET_BACKEND_SERVICE_NAME'),title=RestrictToTargetBackend"
2. 服务账号组批量管理
将所有需要调用后端的服务账号加入一个Google Groups组,提前给该组绑定带条件的roles/run.invoker权限,后续新增服务账号只需加入组即可,无需重复配置权限。
- 创建Google Groups组(如
run-backend-invokers@yourdomain.com),并添加目标服务账号 - 绑定组权限:
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="group:run-backend-invokers@yourdomain.com" \ --role="roles/run.invoker" \ --condition="expression=resource.name.startsWith('projects/YOUR_PROJECT_ID/locations/YOUR_REGION/services/TARGET_BACKEND_SERVICE_NAME'),title=RestrictToBackendService"
3. 基础设施即代码(IaC)统一编排
用Terraform、Deployment Manager等IaC工具,同时定义Cloud Run服务和对应的IAM绑定规则,工具会自动处理依赖关系,实现权限配置与后端部署同步完成,彻底消除手动操作的耦合。
示例Terraform片段:
# 定义Cloud Run后端服务 resource "google_cloud_run_service" "backend" { name = "backend-service" location = "us-central1" template { spec { containers { image = "gcr.io/your-project/backend-image:latest" } } } } # 绑定调用者权限到客户端服务账号 resource "google_project_iam_member" "run_invoker" { project = var.project_id role = "roles/run.invoker" member = "serviceAccount:client-service-account@${var.project_id}.iam.gserviceaccount.com" condition { title = "RestrictToBackendService" description = "Only allow access to the defined Cloud Run backend" expression = "resource.name == '${google_cloud_run_service.backend.id}'" } }
方案优势
所有方案均严格限制权限范围,不会将roles/run.invoker开放给allAuthenticatedUsers,同时实现后端部署与权限配置的解耦,可提前完成权限规划。
内容的提问来源于stack exchange,提问作者Mowee
相关产品推荐
相关产品推荐

