本文档介绍 Pub/Sub 中可用的访问权限控制选项。
概览
Pub/Sub 使用 Identity and Access Management (IAM) 进行访问权限控制。
在 Pub/Sub 中,既可以在项目级别配置访问权限控制,也可以在个别资源级别配置。例如:
按主题或订阅授予访问权限,而不是授予对整个 Cloud 项目的访问权限。
如果您对某个主题或订阅只有查看权限,则无法使用 Google Cloud 控制台查看该主题或订阅。您可以改用 Google Cloud CLI。
授予对有限功能的访问权限,例如只能向某主题发布消息,或者只能处理来自某订阅的消息,而不能删除该主题或订阅。
向一组开发者授予对某项目中的所有 Pub/Sub 资源的访问权限。
如需详细了解 IAM 及其功能,请参阅 IAM 文档。尤其是授予、更改和撤消对资源的访问权限部分。
每种 Pub/Sub 方法都需要具备必要的权限。如需查看 Pub/Sub IAM 支持的权限和角色列表,请参阅下面的角色部分。
权限和角色
本部分汇总了 Pub/Sub IAM 支持的权限和角色。
所需权限
下表列出了调用每个方法所需的权限:
REST 方法 | 所需权限 |
---|---|
projects.snapshots.create |
针对所属 Cloud 项目的 pubsub.snapshots.create 权限以及针对源订阅的 pubsub.subscriptions.consume 权限。 |
projects.snapshots.delete |
针对所请求快照的 pubsub.snapshots.delete 权限。 |
projects.snapshots.getIamPolicy |
针对所请求快照的 pubsub.snapshots.getIamPolicy 权限。 |
projects.snapshots.list |
针对所请求 Cloud 项目的 pubsub.snapshots.list 权限。 |
projects.snapshots.patch |
针对所请求快照的 pubsub.snapshots.update 权限。 |
projects.snapshots.setIamPolicy |
针对所请求快照的 pubsub.snapshots.setIamPolicy 权限。 |
projects.snapshots.testIamPermissions |
无。 |
projects.subscriptions.acknowledge |
针对所请求订阅的 pubsub.subscriptions.consume 权限。 |
projects.subscriptions.create |
针对所属 Cloud 项目的 pubsub.subscriptions.create 权限以及针对所请求主题的 pubsub.topics.attachSubscription 权限。请注意,要在项目 A 中创建对项目 B 中主题 T 的订阅,必须同时对项目 A 和主题 T 授予适当的权限。在这种情况下,可以在项目 B 的审核日志中捕获用户身份信息。 |
projects.subscriptions.delete |
针对所请求订阅的 pubsub.subscriptions.delete 权限。 |
projects.subscriptions.get |
针对所请求订阅的 pubsub.subscriptions.get 权限。 |
projects.subscriptions.getIamPolicy |
针对所请求订阅的 pubsub.subscriptions.getIamPolicy 权限。 |
projects.subscriptions.list |
针对所请求 Cloud 项目的 pubsub.subscriptions.list 权限。 |
projects.subscriptions.modifyAckDeadline |
针对所请求订阅的 pubsub.subscriptions.consume 权限。 |
projects.subscriptions.modifyPushConfig |
针对所请求订阅的 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 |
针对所请求订阅的 pubsub.subscriptions.setIamPolicy 权限。 |
projects.subscriptions.testIamPermissions |
无。 |
projects.topics.create |
针对所属 Cloud 项目的 pubsub.topics.create 权限。 |
projects.topics.delete |
针对所请求主题的 pubsub.topics.delete 权限。 |
projects.topics.detachSubscription |
针对所请求主题的 pubsub.topics.detachSubscription 权限。 |
projects.topics.get |
针对所请求主题的 pubsub.topics.get 权限。 |
projects.topics.getIamPolicy |
针对所请求主题的 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 |
针对所请求主题的 pubsub.topics.setIamPolicy 权限。 |
projects.topics.subscriptions.list |
针对所请求主题的 pubsub.topics.get 权限。 |
projects.topics.testIamPermissions |
无。 |
角色
下表列出了所有 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#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 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@appspot.gserviceaccount.com", "user:user-3@gmail.com" } ] }
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 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 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 Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java 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 Ruby API 参考文档。
设置政策
借助 setIamPolicy()
方法,您可以将政策附加到资源。setIamPolicy()
方法接受一个 SetIamPolicyRequest
,它包含要设置的政策和该政策要附加到的资源。该方法将返回生成的政策。
以下一些示例代码演示了如何为订阅设置政策:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
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
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
以下一些示例代码演示了如何为主题设置政策:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
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
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
测试权限
您可以使用 testIamPermissions()
方法来检查可以为给定资源添加或移除哪些指定权限。该方法接受以参数形式传递的资源名称和一组权限,并返回部分权限。
以下一些示例代码演示了如何测试订阅的权限:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
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
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java 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 Ruby API 参考文档。
以下一些示例代码演示了如何测试主题的权限:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
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
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java 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 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 topic topic-b. bindings: - members: - serviceAccount:foobar@project-a.iam.gserviceaccount.com role: roles/pubsub.publisher etag: BwWGrQYX6R4=
部分可用性行为
授权检查取决于 IAM 子系统。为了持续对数据操作提供低延迟的响应(发布和消息处理),系统可能会依赖于缓存的 IAM 政策。如需了解更改何时生效,请参阅 IAM 文档。