安全队列配置

本页面提供了有关保护队列创建和配置的建议。关键在于限制仅允许一小部分人或实体才可使用队列管理方法。对于大型组织,可能需要使用服务账号来运行强制执行适当的队列配置的软件。

本建议的总体思路是将用户和其他实体分为三类:

  1. 队列管理员 - 该组中的用户有权调用 Cloud Tasks 队列管理方法或上传 queue.yaml 文件。此组仅限于小部分用户,以便降低因无意中混合使用了 queue.yaml 和 Cloud Tasks 队列管理方法而导致损坏队列配置的风险。
  2. Cloud Tasks 工作者 - 该组中的用户有权与 Cloud Tasks 进行常见交互,例如将任务排入队列和排出队列。 他们可以调用 Cloud Tasks 队列管理方法。
  3. App Engine 部署者 - 对于拥有 App Engine 应用的项目,该组中的用户有权部署该应用。但这些用户允许上传 queue.yaml 文件或进行任何 Cloud Tasks API 调用,这有助于队列管理员强制执行适当的政策。

在此方案中,队列管理员不应该同时是 Cloud Tasks 工作者,因为这有悖于分离的目的。

如果您的项目专门使用 Cloud Tasks 队列管理方法,那么队列管理员也不应该同时是 App Engine 部署者,否则可能会上传错误的 queue.yaml 文件。

小型项目和组织

小型项目和组织可以直接将 Identity and Access Management (IAM) 角色分配给用户,以将其置于上述组中。这种方案适合喜欢简化配置或者手动进行队列配置更改或 App Engine 应用部署的团队。

将用户添加到这些组,如下所示:

队列管理员

  1. 作为项目管理员,将 cloudtasks.queueAdmin 角色授予有权进行 Cloud Tasks 队列管理 API 调用或上传 queue.yaml 文件的用户。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member user:EMAIL \
    --role roles/cloudtasks.queueAdmin
    

    替换以下内容:

    • PROJECT_ID:您的项目的 ID
    • EMAIL:成员用户的电子邮件地址
  2. 作为具有 cloudtasks.queueAdmin 角色的用户,在完成上述最佳做法之后,选择下列方法中的一种来更改队列配置。

    1. 使用 Cloud Tasks API 更改队列配置。

    2. 使用 gcloud 上传 queue.yaml

      gcloud app deploy queue.yaml
      

Cloud Tasks 工作者

由于通常允许多个用户与 Cloud Tasks 进行交互,因此您可以将角色分配给服务账号而不是具体用户。这种用法在生产中很常见。如需了解详情,请参阅大型项目和组织

  1. 作为项目管理员,将角色授予允许与 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 部署者

  1. 作为项目管理员,将角色授予允许部署 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:您的项目的 ID
    • EMAIL:成员用户的电子邮件地址
  2. 作为具有上述角色的用户,部署 App Engine 应用。

    gcloud app deploy app.yaml
    

大型项目和组织

大型项目和组织可以使用服务账号来分离职责。这种方案适合通过复杂基础架构来更改队列配置以及部署 App Engine 应用的团队。

为了遵循最小权限原则并简化访问管理,这些说明使用服务帐号模拟。如需详细了解此模式,请参阅 Google Cloud 身份验证文档中的使用服务帐号模拟

下面是设置这些服务账号的说明。

队列管理员

  1. 作为项目管理员,创建服务账号。

    gcloud iam service-accounts create queue-admin \
    --display-name "Queue Admin"
    
  2. 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。

  3. 选择性地允许模拟您创建的“队列管理员”服务帐号。

    通常,这应该包括一小部分充当队列管理员的主账号。向这些主帐号授予您创建的“Queue Admin”服务帐号的 iam.serviceAccountTokenCreator 角色。如需了解具体操作方法,请参阅 IAM 文档中的授予或撤消单个角色

  4. 按照使用队列管理或 queue.yaml 中所述的最佳实践,选择以下方法之一来更改队列配置:

    • 使用 Cloud Tasks 更改队列配置。

    • 使用 gcloud CLI 上传 queue.yaml

Cloud Tasks 工作者

  1. 作为项目管理员,创建服务账号。

    gcloud iam service-accounts create cloud-tasks-worker \
    --display-name "Cloud Tasks Worker"
    
  2. 将角色授予服务账号,以便它可以与 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。

  3. 选择性地允许模拟您创建的“Cloud Tasks Worker”服务帐号。

    对于与 Cloud Tasks 交互的主帐号,请对您创建的“Cloud Tasks Worker”服务帐号授予 iam.serviceAccountTokenCreator 角色。如需了解具体操作方法,请参阅 IAM 文档中的授予或撤消单个角色

App Engine Deployer

  1. 作为项目管理员,创建服务账号。

    gcloud iam service-accounts create app-engine-deployer \
    --display-name "App Engine Deployer"
    
  2. 将角色授予服务账号,以便它可以部署 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。

  3. 选择性地允许模拟您创建的“App Engine Deployer”服务帐号。

    对于部署 App Engine 服务的主帐号,请对您创建的“App Engine Deployer”服务帐号授予 iam.serviceAccountTokenCreator 角色。如需了解具体操作方法,请参阅 IAM 文档中的授予或撤消单个角色

限制对单个队列的访问权限

如果项目中有多个队列,并希望限制对各个队列的访问权限,则可以在队列级别(而非项目级别)使用 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

后续步骤