本文档介绍 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
|
使用指定名称创建指定主题。 | 对所属云项目拥有 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
|
列出所有主题。 | 针对所请求云项目的 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_ids 相关联的消息。 | 针对所请求订阅的 pubsub.subscriptions.consume
权限 |
projects.subscriptions.create
|
创建对指定主题的订阅。 | 针对所属云项目的 pubsub.subscriptions.create 权限以及针对所请求主题的 pubsub.topics.attachSubscription 权限。要在项目 A 中创建附加到项目 B 中主题 T 的订阅 S,必须同时对项目 A 和主题 T 授予适当的权限。在这种情况下,可以在项目 B 的审核日志中捕获用户身份信息。 |
projects.subscriptions.delete
|
删除现有订阅。 | 针对所请求订阅的 pubsub.subscriptions.delete
权限 |
projects.subscriptions.detach
|
将订阅与主题分离。 | 订阅所附加到的主题的 pubsub.topics.detachSubscription 权限。 |
projects.subscriptions.get
|
获取订阅的配置详细信息。 | 针对所请求订阅的 pubsub.subscriptions.get
权限 |
projects.subscriptions.getIamPolicy
|
获取订阅的 IAM 访问权限控制政策。 | 针对所请求订阅的 pubsub.subscriptions.getIamPolicy
权限 |
projects.subscriptions.list
|
列出匹配的订阅。 | 针对所请求云项目的 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
|
创建架构。 | 对所属云项目拥有 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
|
列出项目中的架构。 | 针对所请求云项目的 pubsub.schemas.list 权限 |
projects.schemas.listRevisions
|
列出命名架构的所有架构修订版本。 | 针对所请求架构的 pubsub.schemas.listRevisions
权限 |
projects.schemas.rollback
|
根据之前的修订版本创建新的架构修订版本。 | 针对所请求架构的 pubsub.schemas.rollback
权限 |
projects.schemas.validate
|
验证架构定义。 | 对所属云项目拥有 pubsub.schemas.validate 权限 |
projects.schemas.validateMessage
|
根据架构验证消息。 | 对所属云项目拥有 pubsub.schemas.validate 权限 |
拍摄快照所需的权限
下表概括了与快照相关的每个 Pub/Sub API 方法所需的权限。 其中显示了调用每种方法所需的 IAM 权限,以及对相应方法的功能说明。
| REST 方法 | 说明 | 所需权限 |
|---|---|---|
projects.snapshots.create
|
根据所请求的订阅创建快照。 | 针对所属云项目的 pubsub.snapshots.create 权限以及针对源订阅的 pubsub.subscriptions.consume 权限。 |
projects.snapshots.delete
|
移除现有快照。 | 针对所请求快照的 pubsub.snapshots.delete
权限 |
projects.snapshots.getIamPolicy
|
获取快照的 IAM 访问权限控制政策。 | 针对所请求快照的 pubsub.snapshots.getIamPolicy
权限 |
projects.snapshots.list
|
列出现有快照。 | 针对所请求云项目的 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:
|
|
Service agent roles
Service agent roles should only be granted to service agents.
| Role | Permissions |
|---|---|
Cloud Pub/Sub Service Agent( Grants Cloud Pub/Sub Service Account access to manage resources. |
|
通过 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#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
获取订阅政策:
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@", "user:user-3@gmail.com" ] } ] }
Go
以下示例使用 Go Pub/Sub 客户端库的主要版本 (v2)。如果您仍在使用 v1 库,请参阅迁移到 v2 的指南。如需查看 v1 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
以下示例使用 Ruby Pub/Sub 客户端库 v3。如果您仍在使用 v2 库,请参阅 迁移到 v3 的指南。如需查看 Ruby v2 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
以下一些示例代码演示了如何获取主题政策:C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
获取主题政策
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
以下示例使用 Go Pub/Sub 客户端库的主要版本 (v2)。如果您仍在使用 v1 库,请参阅迁移到 v2 的指南。如需查看 v1 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Go API 参考文档。