本页面提供了一些建议,旨在帮助您适当地创建和配置队列,以确保安全。关键在于限制仅允许一小部分人或实体才可使用队列管理方法。对于大型组织,可能需要使用服务账号来运行强制执行适当的队列配置的软件。
本建议的总体思路是将用户和其他实体分为三类:
- 队列管理员 - 该组中的用户有权调用 Cloud Tasks 队列管理方法或上传
queue.yaml
文件。此组仅限于小部分用户,以便降低因无意中混合使用了queue.yaml
和 Cloud Tasks 队列管理方法而导致损坏队列配置的风险。 - Cloud Tasks 工作者 - 该组中的用户有权与 Cloud Tasks 进行常见交互,例如将任务排入队列和排出队列。 他们不可以调用 Cloud Tasks 队列管理方法。
- App Engine 部署者 - 对于拥有 App Engine 应用的项目,该组中的用户有权部署该应用。但这些用户不允许上传
queue.yaml
文件或进行任何 Cloud Tasks API 调用,这有助于队列管理员强制执行适当的政策。
在此方案中,队列管理员不应该同时是 Cloud Tasks 工作者,因为这有悖于分离的目的。
如果您的项目专门使用 Cloud Tasks 队列管理方法,那么队列管理员也不应该同时是 App Engine 部署者,否则可能会上传错误的 queue.yaml
文件。
小型项目和组织
小型项目和组织可以直接将 Identity and Access Management (IAM) 角色分配给用户,以将其置于上述组中。这种方案适合喜欢简化配置或者手动进行队列配置更改或 App Engine 应用部署的团队。
将用户添加到这些组,如下所示:
队列管理员
作为项目管理员,将
cloudtasks.queueAdmin
角色授予有权进行 Cloud Tasks 队列管理 API 调用或上传queue.yaml
文件的用户。gcloud projects add-iam-policy-binding PROJECT_ID \ --member user:EMAIL \ --role roles/cloudtasks.queueAdmin
替换以下内容:
PROJECT_ID
:您的项目的 IDEMAIL
:会员用户的电子邮件地址
作为具有
cloudtasks.queueAdmin
角色的用户,在完成上述最佳做法之后,选择下列方法中的一种来更改队列配置。使用 Cloud Tasks API 更改队列配置。
使用
gcloud
上传queue.yaml
:gcloud app deploy queue.yaml
Cloud Tasks 工作者
由于通常允许多个用户与 Cloud Tasks 进行交互,因此您可以将角色分配给服务账号而不是具体用户。这种用法在生产中很常见。如需了解详情,请参阅大型项目和组织。
作为项目管理员,将角色授予允许与 Cloud Tasks 交互但不更改队列配置的用户:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.viewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.enqueuer gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.dequeuer gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.taskRunner gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.taskDeleter
将
PROJECT_ID
替换为您的项目 ID。
作为具有上述一个或多个角色的用户,您可以与 Cloud Tasks API 进行交互。
App Engine 部署者
作为项目管理员,将角色授予允许部署 App Engine 应用但不允许修改队列配置或与任务交互的用户:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member user:EMAIL \ --role roles/appengine.deployer gcloud projects add-iam-policy-binding PROJECT_ID \ --member user:EMAIL \ --role roles/appengine.serviceAdmin gcloud projects add-iam-policy-binding PROJECT_ID \ --member user:EMAIL \ --role roles/storage.admin
替换以下内容:
PROJECT_ID
:您的项目的 IDEMAIL
:会员用户的电子邮件地址
作为具有上述角色的用户,部署 App Engine 应用。
gcloud app deploy app.yaml
大型项目和组织
大型项目和组织可以使用服务账号来分离职责。这种方案适合通过复杂基础架构来更改队列配置以及部署 App Engine 应用的团队。
为遵循最小权限原则并简化访问权限管理,这些说明使用了服务账号模拟。如需详细了解此模式,请参阅 Google Cloud 身份验证文档中的使用服务账号模拟部分。
下面是设置这些服务账号的说明。
队列管理员
作为项目管理员,创建服务账号。
gcloud iam service-accounts create queue-admin \ --display-name "Queue Admin"
将
cloudtasks.queueAdmin
角色授予服务账号,以便上传queue.yaml
文件并发出 Cloud Tasks 队列管理 API 调用。gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:queue-admin@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.queueAdmin
将
PROJECT_ID
替换为您的项目 ID。选择性地允许冒充您创建的“队列管理员”服务账号。
这通常是一小群充当队列管理员的主体。向这些主账号授予您创建的“队列管理员”服务账号上的
iam.serviceAccountTokenCreator
角色。要了解具体方法,请参阅 授予或撤消单个角色 。遵循 使用队列管理或任务队列.yaml,从下列选项中选择一项 更改队列配置的方法:
使用 Cloud Tasks 更改队列配置。
使用 gcloud CLI 上传
queue.yaml
Cloud Tasks 工作者
作为项目管理员,创建服务账号。
gcloud iam service-accounts create cloud-tasks-worker \ --display-name "Cloud Tasks Worker"
将角色授予服务账号,以便它可以与 Cloud Tasks 交互,但不能更改队列配置。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.viewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.enqueuer gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.dequeuer gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.taskRunner gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudtasks.taskDeleter
将
PROJECT_ID
替换为您的项目 ID。选择性地允许冒充您创建的“Cloud Tasks Worker”服务账号。
对于与 Cloud Tasks 交互的主账号,向其授予
iam.serviceAccountTokenCreator
“Cloud Tasks Worker”服务账号。要了解如何操作, 请参阅 授予或撤消单个角色 。
App Engine Deployer
作为项目管理员,创建服务账号。
gcloud iam service-accounts create app-engine-deployer \ --display-name "App Engine Deployer"
将角色授予服务账号,以便它可以部署 App Engine 应用,但不能部署
queue.yaml
。gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/appengine.deployer gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/appengine.serviceAdmin gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:app-engine-deployer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/storage.admin
将
PROJECT_ID
替换为您的项目 ID。选择性地允许模拟“App Engine Deployer”服务账号 您创建的项目
对于部署 App Engine 服务的主账号,向其授予
iam.serviceAccountTokenCreator
“App Engine Deployer”角色服务账号学习内容 方法,参见 授予或撤消单个角色 。
限制对单个队列的访问权限
如果一个项目中有多个队列,并且您希望仅限
队列,您可以在队列级别使用 IAM 政策,而不是
项目级别如需按队列限制访问权限,请使用 gcloud tasks queues add-iam-policy-binding
命令。例如:
gcloud tasks queues add-iam-policy-binding QUEUE_NAME --location=LOCATION \ --member=serviceAccount:cloud-tasks-worker@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/cloudtasks.enqueuer
替换以下内容:
QUEUE_NAME
:队列的名称LOCATION
:队列的位置PROJECT_ID
:您的项目的 ID