配置GCP IAM实现服务账号仅访问指定Pub/Sub订阅及403排查
问题分析
你遇到的403错误根源在于list_subscriptions是项目级API调用,仅在订阅层面配置Pub/Sub Admin角色,无法让服务账号发起项目范围的订阅列表查询。要实现「仅能访问指定订阅+列表查询仅返回该订阅」的最小权限需求,需要搭配项目级权限、订阅级权限,并通过IAM条件做过滤。
解决方案
1. 配置最小权限组合
给目标服务账号添加以下两组权限:
- 项目级别:授予
pubsub.subscriptions.list权限(推荐创建自定义角色来封装这个单一权限,比预定义的Pub/Sub Viewer更贴合最小权限要求) - 订阅级别:授予
pubsub.subscriptions.consume权限(仅用于拉取订阅消息,替代权限过大的Pub/Sub Admin)
2. 绑定IAM过滤条件(核心步骤)
在项目级的权限绑定上添加IAM条件,限制服务账号仅能查看指定订阅:
resource.name == "projects/[你的项目ID]/subscriptions/[目标订阅ID]"
添加该条件后,服务账号调用list_subscriptions时,只会返回符合条件的订阅,其他订阅会被自动过滤。
3. 代码验证
你提供的测试代码无需修改,权限配置完成后重新执行,即可正常输出指定订阅的名称,不会再触发403错误。
4. Splunk场景适配
针对Splunk的使用场景,确保权限完全匹配需求:
- Splunk拉取Pub/Sub消息仅依赖
pubsub.subscriptions.consume权限 - 若Splunk需要通过列表查询配置数据源,上述IAM条件会确保它只能看到指定的专属订阅,完全满足最小权限开放要求
内容的提问来源于stack exchange,提问作者Tom K.
相关产品推荐
相关产品推荐

