如何为服务账号仅授予其自身创建的Pub/Sub订阅的编辑角色
可行,用条件IAM政策就能实现
你要的效果完全可以通过条件IAM绑定来达成,核心是利用Pub/Sub订阅资源的createdBy元数据属性限制权限范围:
保留你已配置好的权限:
- 项目级的
pubsub.subscriptions.create权限,允许服务账号创建订阅 - 指定主题的
pubsub.topics.attachSubscription权限,允许订阅关联目标主题
- 项目级的
添加带条件的项目级IAM绑定,授予服务账号对自身创建的订阅的管理/消费权限:
你可以直接用roles/pubsub.editor角色(包含订阅的获取、更新、删除、消费全权限),也可以拆分更细的角色(比如roles/pubsub.subscriber负责消费,roles/pubsub.subscriptionAdmin负责管理),关键是给绑定加上条件,限定仅当订阅是该服务账号创建的时,权限才生效。
示例gcloud命令
如果使用完整的editor角色:
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:your-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/pubsub.editor" \ --condition="expression=resource.metadata.createdBy == 'serviceAccount:your-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com',title=EditOwnSubscriptions,description=Restrict service account to only edit subscriptions it created"
如果拆分细粒度权限(更安全):
# 授予消费自身创建的订阅的权限 gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:your-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/pubsub.subscriber" \ --condition="expression=resource.metadata.createdBy == 'serviceAccount:your-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com',title=ConsumeOwnSubscriptions" # 授予管理自身创建的订阅的权限(获取、更新、删除) gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:your-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/pubsub.subscriptionAdmin" \ --condition="expression=resource.metadata.createdBy == 'serviceAccount:your-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com',title=ManageOwnSubscriptions"
原理说明
条件IAM绑定会在权限检查时验证订阅资源的createdBy属性是否匹配服务账号的身份,只有当服务账号操作自己创建的订阅时,这些权限才会被触发。这样既不用提前给不存在的订阅单独授权,也不会让服务账号获得所有订阅的权限,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Dolf Andringa
相关产品推荐
相关产品推荐

