GCP Cloud Run中如何实现服务账号的API级细粒度访问控制?
GCP实现Cloud Run服务API级细粒度访问控制方案
针对你的需求,GCP没有和Azure API范围完全对等的直接实现,但可以通过以下几种方式达成相同的API级细粒度访问控制目标:
1. 基于自定义IAM角色的原生方案(推荐)
这是最贴合GCP IAM模型的做法,利用服务账号的角色声明完成权限判断:
- 为服务X定义自定义权限:分别创建
custom.googleapis.com/serviceX.read(对应READ端点)和custom.googleapis.com/serviceX.write(对应WRITE端点)两个权限。 - 创建两个自定义IAM角色:
- 只读角色:仅包含
serviceX.read权限 - 读写角色:包含
serviceX.read和serviceX.write权限
- 只读角色:仅包含
- 分配角色:将只读角色授予服务A的服务账号,读写角色授予服务B的服务账号。
- 服务X校验逻辑:验证访问令牌时,解析令牌payload中的
roles字段(GCP会自动将账号拥有的角色注入令牌),根据当前请求的端点匹配对应权限,决定是否允许访问。
2. 利用Identity-Aware Proxy (IAP) 做路由级控制
如果服务X部署在IAP保护之下,可以直接在IAP中配置路由规则:
- 针对服务X的
/read端点,设置仅允许服务A的服务账号访问 - 针对
/write端点,设置允许服务B的服务账号访问
这种方式无需修改服务X代码,由IAP在请求到达服务前完成权限校验。
3. 自定义JWT声明(灵活但需自行管理)
如果需要更灵活的自定义声明(类似Azure的范围),可以让服务A、B使用服务账号密钥签名自定义JWT,在payload中加入自定义范围字段(比如scope: "serviceX.read"):
- 服务A生成的JWT包含只读范围,服务B包含读写范围
- 服务X验证JWT合法性(通过GCP公钥)后,解析自定义范围字段进行权限判断
注意:这种方式需要自行管理服务账号的签名密钥,安全性和便捷性不如GCP自动生成的访问令牌,仅适合特殊场景。
与Azure方案的差异
Azure的API范围是直接绑定到API的权限集合,而GCP的IAM模型以角色为权限载体,令牌会自动携带账号的角色信息。二者本质都是通过令牌中的声明做权限校验,只是实现载体不同。
内容的提问来源于stack exchange,提问作者ESG
相关产品推荐
相关产品推荐

