本文档介绍 Pub/Sub 中可用的访问权限控制选项。
概览
Pub/Sub 使用 Identity and Access Management (IAM) 进行访问权限控制。
借助 IAM,您可以向用户、群组和服务账号授予特定角色,为其提供执行任务所需的权限。您可以使用 Google Cloud 控制台或 IAM API 授予这些 IAM 角色。
在 Pub/Sub 中,既可以在项目级别配置访问权限控制,也可以在个别资源级别配置。以下是使用 Pub/Sub 访问权限控制的一些示例:
按资源授予访问权限,而不是授予对整个 Cloud 项目的访问权限。
授予对有限功能的访问权限,例如只能向某主题发布消息,或者只能处理来自某订阅的消息,而不能删除该主题或订阅。
向一组开发者授予对某项目中的所有 Pub/Sub 资源的访问权限。
如果您对某个资源(例如主题或订阅)仅有查看权限,则无法使用 Google Cloud 控制台查看该资源。不过,您可以使用 Google Cloud CLI 查看该资源。
如需详细了解 IAM 及其功能,请参阅 IAM 文档。尤其是授予、更改和撤消对资源的访问权限部分。
Pub/Sub 中的角色类型
与其他 Google Cloud 产品一样,Pub/Sub 支持三种类型的角色:
基本角色:基本角色是在引入 IAM 之前就已存在的高度宽松角色。如需详细了解基本角色,请参阅基本角色。
预定义角色:预定义角色可授予对特定Google Cloud 资源的精细访问权限。如需详细了解预定义角色,请参阅预定义角色。本部分后面部分将介绍 Pub/Sub 预定义角色。
自定义角色:自定义角色有助于您实施最小权限原则。如需详细了解自定义角色,请参阅自定义角色。
所需的 Pub/Sub 权限
以下部分列出了访问不同 Pub/Sub 资源所需的 Pub/Sub 权限。
主题的必要权限
下表概述了与主题相关的每个 Pub/Sub API 方法所需的权限。该表会显示调用每种方法所需的 IAM 权限,以及该方法的用途说明。
方法 | 说明 | 所需权限 |
---|---|---|
projects.topics.create
|
使用指定名称创建指定主题。 | 对所属 Cloud 项目拥有 pubsub.topics.create 权限 |
projects.topics.delete
|
删除具有指定名称的主题。 | pubsub.topics.delete
针对所请求主题 |
projects.topics.get
|
获取主题的配置。 | pubsub.topics.get
针对所请求主题 |
projects.topics.getIamPolicy
|
获取主题的 IAM 访问权限控制政策。 | pubsub.topics.getIamPolicy
针对所请求主题 |
projects.topics.list
|
列出所有主题。 | 针对所请求 Cloud 项目的 pubsub.topics.list 权限 |
projects.topics.patch
|
更新现有主题。 | pubsub.topics.update
针对所请求主题 |
projects.topics.publish
|
向主题添加一条或多条消息。 | pubsub.topics.publish
针对所请求主题 |
projects.topics.setIamPolicy
|
为主题设置 IAM 访问权限控制政策。 | pubsub.topics.setIamPolicy
针对所请求主题 |
projects.topics.testIamPermissions
|
返回调用者对指定资源拥有的权限。 | 无 |
订阅所需的权限
下表概述了与订阅相关的每个 Pub/Sub API 方法所需的权限。该页面会显示调用每种方法所需的 IAM 权限,以及该方法的用途说明。
方法 | 说明 | 所需权限 |
---|---|---|
projects.subscriptions.acknowledge
|
确认与 AcknowledgeRequest 中的 ack_id 相关联的消息。 | 针对所请求订阅的 pubsub.subscriptions.consume 权限 |
projects.subscriptions.create
|
创建对给定主题的订阅。 | 针对所属 Cloud 项目的 pubsub.subscriptions.create 权限以及针对所请求主题的 pubsub.topics.attachSubscription 权限。如需在项目 A 中创建订阅 S 并将其附加到项目 B 中的主题 T,则必须对项目 A 和主题 T 授予适当的权限。在这种情况下,可以在项目 B 的审核日志中捕获用户身份信息。 |
projects.subscriptions.delete
|
删除现有订阅。 | 针对所请求订阅的 pubsub.subscriptions.delete 权限 |
projects.subscriptions.detach
|
将订阅与此主题分离。 | 针对订阅的 pubsub.subscriptions.detach 权限 |
projects.subscriptions.get
|
获取订阅的配置详细信息。 | 针对所请求订阅的 pubsub.subscriptions.get 权限 |
projects.subscriptions.getIamPolicy
|
获取订阅的 IAM 访问权限控制政策。 | 针对所请求订阅的 pubsub.subscriptions.getIamPolicy 权限 |
projects.subscriptions.list
|
列出匹配的订阅。 | 针对所请求 Cloud 项目的 pubsub.subscriptions.list 权限 |
projects.subscriptions.modifyAckDeadline
|
修改特定消息的确认期限。 | 针对所请求订阅的 pubsub.subscriptions.consume 权限 |
projects.subscriptions.modifyPushConfig
|
修改指定订阅的 pushConfig。 | 针对所请求订阅的 pubsub.subscriptions.update 权限 |
projects.subscriptions.patch
|
更新现有订阅。 | 针对所请求订阅的 pubsub.subscriptions.update 权限 |
projects.subscriptions.pull
|
从服务器拉取消息。 | 针对所请求订阅的 pubsub.subscriptions.consume 权限 |
projects.subscriptions.seek
|
将现有订阅跳转到某个时间点或快照。 | 针对所请求订阅的 pubsub.subscriptions.consume 权限,针对所请求快照的 pubsub.snapshots.seek 权限(如果有)。 |
projects.subscriptions.setIamPolicy
|
为订阅设置 IAM 访问权限控制政策。 | 针对所请求订阅的 pubsub.subscriptions.setIamPolicy 权限 |
projects.subscriptions.testIamPermissions
|
返回调用者对指定资源拥有的权限。 | 无 |
架构所需的权限
下表概述了与架构相关的每个 Pub/Sub API 方法所需的权限。该页面会显示调用每种方法所需的 IAM 权限,以及该方法的用途说明。
方法 | 说明 | 所需权限 |
---|---|---|
projects.schemas.commit
|
提交新的架构修订版本。 | 针对所请求架构的 pubsub.schemas.commit 权限 |
projects.schemas.create
|
创建架构。 | 对所属 Cloud 项目拥有 pubsub.schemas.create 权限 |
projects.schemas.delete
|
删除架构。 | 针对所请求架构的 pubsub.schemas.delete 权限 |
projects.schemas.deleteRevision
|
删除特定的架构修订版本。 | 针对所请求架构的 pubsub.schemas.delete 权限 |
projects.schemas.get
|
获取架构。 | 针对所请求架构的 pubsub.schemas.get 权限 |
projects.schemas.getIamPolicy
|
获取架构的 IAM 访问权限控制政策。 | 请求架构上的 pubsub.schemas.getIamPolicy 权限 |
projects.schemas.list
|
列出项目中的架构。 | 针对所请求 Cloud 项目的 pubsub.schemas.list 权限 |
projects.schemas.listRevisions
|
列出指定架构的所有架构修订版本。 | 针对所请求架构的 pubsub.schemas.listRevisions 权限 |
projects.schemas.rollback
|
根据上一个修订版本创建新的架构修订版本。 | 针对所请求架构的 pubsub.schemas.rollback 权限 |
projects.schemas.validate
|
验证架构定义。 | 对所属 Cloud 项目拥有 pubsub.schemas.validate 权限 |
projects.schemas.validateMessage
|
根据架构验证消息。 | 对所属 Cloud 项目拥有 pubsub.schemas.validate 权限 |
快照所需的权限
下表概述了与快照相关的每个 Pub/Sub API 方法所需的权限。该页面会显示调用每种方法所需的 IAM 权限,以及该方法的用途说明。
REST 方法 | 说明 | 所需权限 |
---|---|---|
projects.snapshots.create
|
根据请求的订阅创建快照。 | 针对所属 Cloud 项目的 pubsub.snapshots.create 权限以及针对源订阅的 pubsub.subscriptions.consume 权限。 |
projects.snapshots.delete
|
移除现有快照。 | 针对所请求快照的 pubsub.snapshots.delete 权限 |
projects.snapshots.getIamPolicy
|
获取快照的 IAM 访问权限控制政策。 | 针对所请求快照的 pubsub.snapshots.getIamPolicy 权限 |
projects.snapshots.list
|
列出现有快照。 | 针对所请求 Cloud 项目的 pubsub.snapshots.list 权限 |
projects.snapshots.patch
|
更新现有快照。 | 针对所请求快照的 pubsub.snapshots.update 权限 |
projects.snapshots.setIamPolicy
|
为快照设置 IAM 访问权限控制政策。 | 针对所请求快照的 pubsub.snapshots.setIamPolicy 权限 |
projects.snapshots.testIamPermissions
|
返回调用者对指定资源拥有的权限。 | 无 |
可用的 Pub/Sub 角色
下表列出了所有 Pub/Sub 角色以及与每个角色关联的权限:
Role | Permissions |
---|---|
Pub/Sub Admin( Provides full access to topics and subscriptions. Lowest-level resources where you can grant this role:
|
|
Pub/Sub Editor( Provides access to modify topics and subscriptions, and access to publish and consume messages. Lowest-level resources where you can grant this role:
|
|
Pub/Sub Publisher( Provides access to publish messages to a topic. Lowest-level resources where you can grant this role:
|
|
Pub/Sub Subscriber( Provides access to consume messages from a subscription and to attach subscriptions to a topic. Lowest-level resources where you can grant this role:
|
|
Pub/Sub Viewer( Provides access to view topics and subscriptions. Lowest-level resources where you can grant this role:
|
|
通过 Google Cloud 控制台控制访问权限
您可以使用 Google Cloud 控制台来管理主题和项目的访问权限控制。
如需在项目级层设置访问权限控制,请按以下步骤操作:
在 Google Cloud 控制台中,前往 IAM 页面。
选择您的项目。
点击
Add。输入一个或多个主账号名称。
在选择角色列表中,选择要授予的角色。
点击保存。
验证该主账号是否拥有您授予的角色。
如需为主题和订阅设置访问权限控制,请按以下步骤操作:
在 Google Cloud 控制台中,前往 Pub/Sub 主题列表。
如有必要,请选择启用了 Pub/Sub 的项目。
执行以下步骤之一:
如需为一个或多个主题设置角色,请选择相应主题。
如需为附加到主题的订阅设置角色,请点击主题 ID。在主题详情页面中,点击订阅 ID。系统随即会显示订阅详情页面。
如果信息面板处于隐藏状态,请点击显示信息面板。
在权限标签页中,点击
添加主账号。输入一个或多个主账号名称。
在选择角色列表中,选择要授予的角色。
点击保存。
通过 IAM API 控制访问权限
借助 Pub/Sub IAM API,您可以为项目中的个别主题和订阅设置和获取政策,以及测试用户对给定资源所具有的权限。与常规的 Pub/Sub 方法一样,您可以通过客户端库或 API Explorer 或者直接通过 HTTP 调用 IAM API 方法。
请注意,不能使用 Pub/Sub IAM API 在 Google Cloud 项目级别管理政策。
以下部分举例说明了如何设置和获取政策,以及如何测试调用者对给定资源具有什么权限。
购买保单
借助 getIamPolicy()
方法,您可以获取现有政策。此方法将返回包含与资源关联的政策的 JSON 对象。
以下一些示例代码演示了如何获取订阅政策:
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
获取订阅政策:
gcloud pubsub subscriptions get-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json
输出:
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.admin", "members": [ "user:user-1@gmail.com" ] }, { "role": "roles/pubsub.editor", "members": [ "serviceAccount:service-account-2@appspot.gserviceaccount.com", "user:user-3@gmail.com" } ] }
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
以下一些示例代码演示了如何获取主题政策:
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
获取主题政策
gcloud pubsub topics get-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ --format json
输出:
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role":" roles/pubsub.viewer", "members": [ "user:user-1@gmail.com" ] } ] }
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
设置政策
借助 setIamPolicy()
方法,您可以将政策附加到资源。setIamPolicy()
方法接受一个 SetIamPolicyRequest
,它包含要设置的政策和该政策要附加到的资源。该方法将返回生成的政策。
以下一些示例代码演示了如何为订阅设置政策:
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
1.保存订阅的政策。
gcloud pubsub subscriptions get-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json > subscription_policy.json
2.打开 subscription_policy.json
并通过向适当的主账号提供适当的角色来更新绑定。如需详细了解如何使用 subscription_policy.json
文件,请参阅 IAM 文档中的政策。
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.admin", "members": [ "user:user-1@gmail.com" ] }, { "role": "roles/pubsub.editor", "members": [ "serviceAccount:service-account-2@appspot.gserviceaccount.com" } ] }
3.应用新的订阅政策。
gcloud pubsub subscriptions set-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ subscription_policy.json
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
以下一些示例代码演示了如何为主题设置政策:
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
1.保存主题的政策。
gcloud pubsub topics get-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ --format json > topic_policy.json
2.打开 topic_policy.json
并通过向适当的主账号提供适当的角色来更新绑定。如需详细了解如何使用 subscription_policy.json
文件,请参阅 IAM 文档中的政策。
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.editor", "members": [ "user:user-1@gmail.com", "user:user-2@gmail.com" ] } ] }
3.应用新的主题政策。
gcloud pubsub topics set-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ topic_policy.json
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
测试权限
您可以使用 testIamPermissions()
方法来检查可以为给定资源添加或移除哪些指定权限。该方法接受以参数形式传递的资源名称和一组权限,并返回部分权限。
以下一些示例代码演示了如何测试订阅的权限:
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud iam list-testable-permissions \ https://pubsub.googleapis.com/v1/projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json
输出:
[ { "name": "pubsub.subscriptions.consume", "stage": "GA" }, { "name": "pubsub.subscriptions.delete", "stage": "GA" }, { "name": "pubsub.subscriptions.get", "stage": "GA" }, { "name": "pubsub.subscriptions.getIamPolicy", "stage": "GA" }, { "name": "pubsub.subscriptions.setIamPolicy", "stage": "GA" }, { "name": "pubsub.subscriptions.update", "stage": "GA" } ]
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
以下一些示例代码演示了如何测试主题的权限:
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud iam list-testable-permissions \ https://pubsub.googleapis.com/v1/projects/${PROJECT}/topics/${TOPIC} \ --format json
输出
[ { "name": "pubsub.topics.attachSubscription", "stage": "GA" }, { "name": "pubsub.topics.delete", "stage": "GA" }, { "name": "pubsub.topics.detachSubscription", "stage": "GA" }, { "name": "pubsub.topics.get", "stage": "GA" }, { "name": "pubsub.topics.getIamPolicy", "stage": "GA" }, { "name": "pubsub.topics.publish", "stage": "GA" }, { "name": "pubsub.topics.setIamPolicy", "stage": "GA" }, { "name": "pubsub.topics.update", "stage": "GA" } ]
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
跨项目通信
Pub/Sub IAM 对于在跨项目通信中微调访问控制很有用。
假设 Cloud 项目 A 中的服务账号想要将消息发布到 Cloud 项目 B 中的主题。首先,在项目 A 中启用 Pub/Sub API。
其次,在 Cloud 项目 B 中向服务账号授予修改权限。但是,这种方法通常过于粗糙。您可以使用 IAM API 实现更精细的访问权限级别。
例如,以下代码段使用 project-b 中的 setIamPolicy()
方法和一个准备好的 topic_policy.json
文件向 project-a 的服务账号 foobar@
project-a.iam.gserviceaccount.com
授予针对主题 projects/
project-b/topics/
topic-b 的 Publisher 角色:
gcloud pubsub topics set-iam-policy \ projects/project-b /topics/topic-b \ topic_policy.json
Updated IAM policy for topictopic-b . bindings: - members: - serviceAccount:foobar@project-a .iam.gserviceaccount.com role: roles/pubsub.publisher etag: BwWGrQYX6R4=
部分可用性行为
授权检查取决于 IAM 子系统。为了持续对数据操作提供低延迟的响应(发布和消息处理),系统可能会依赖于缓存的 IAM 政策。如需了解更改何时生效,请参阅 IAM 文档。