使用 IAM 限制 Cloud Deploy 访问权限

与所有 Google Cloud 产品一样,Identity and Access Management 通过控制哪些经过身份验证的用户和服务账号可以执行哪些 操作来保护 Cloud Deploy 。

本文档介绍了 IAM 的一些功能,并说明了如何保护使用 Cloud Deploy 管理的应用交付。以下是您可以限制对 Cloud Deploy 中操作和资源的访问权限的一些特定方法:

准备工作

IAM 高级功能简介

除了 角色和权限 之外, Cloud Deploy 使用 IAM 的以下功能 来提供这些控制:

IAM 政策简介

IAM 政策是角色绑定和元数据的集合。角色绑定会向单个主账号(用户、群组或服务账号)授予单个角色,以及控制绑定是否生效的任何上下文特定条件

如需详细了解 IAM 政策,请参阅了解政策

IAM 条件简介

借助 IAM 条件,您可以 根据在运行时计算的 条件控制对 Cloud Deploy 资源和操作的访问权限。例如,您可以限制提升 至给定目标,以便仅在指定时间段内允许。

API 特性简介

构建 IAM 条件时,您可以引用 API 特性来获取关于请求的运行时信息。例如,您可以使用 API 特性来获取对其发出请求的资源的名称。然后,您可以将其与主账号有权访问的一个或多个资源进行比较。

使用高级 IAM 功能授予精细访问权限

这些高级 IAM 功能允许您控制在特定条件下对特定资源和资源类型的访问权限。

本部分中的过程授予对特定资源(目标、交付流水线)的访问权限。您还可以在项目级授予访问权限,这会影响该项目中的所有交付流水线或所有目标。如需为项目设置 IAM 政策,请使用 gcloud projects set-iam-policy 命令:

gcloud projects set-iam-policy PROJECT_ID POLICY_FILE

授予对特定交付流水线的访问权限

您只需授予适当的角色,即可为主账号授予创建、修改和删除所有交付流水线的权限。但有时您可能想向主账号授予一个或多个特定流水线的此访问权限。

为此,可使用角色绑定roles/clouddeploy.developer 角色绑定到该主账号,然后在应用政策(使用 setIamPolicy)时指定授予对哪个交付流水线的访问权限。

如需授予对特定交付流水线的访问权限,请执行以下操作:

  1. 创建政策文件(具有以下绑定):

    bindings:
    - role: roles/clouddeploy.developer
      members:
      - user:fatima@example.com
    

    上面的示例向用户授予角色,但您也可以将角色授予群组或服务账号。

  2. 调用以下命令,将政策文件应用于特定的交付流水线:

    gcloud deploy delivery-pipelines set-iam-policy --delivery-pipeline=PIPELINE_NAME --region=REGION POLICY_FILE
    

授予配置特定目标的访问权限

如需授予主账号对特定目标的访问权限,您可以使用角色绑定。为此,可将 roles/clouddeploy.operator 角色绑定到该主账号,然后在应用政策(使用 setIamPolicy)时指定授予对哪个目标的访问权限。

对特定目标的访问权限可让主账号更新和删除该目标。

  1. 创建政策文件(具有以下绑定):

    bindings:
    - role: roles/clouddeploy.operator
      members:
      - group:cd_operators@example.com
    

    上面的示例向群组授予角色,但您也可以将角色授予用户或服务账号。

  2. 调用以下命令,将政策文件应用于特定目标:

    gcloud deploy targets set-iam-policy TARGET --region=REGION POLICY_FILE
    

授予权限以将版本提升到特定目标

此过程假定已有政策将角色绑定到主账号。在这里,我们添加了指定目标的条件:

  1. 创建具有以下绑定的政策文件:

    bindings:
    - role: roles/clouddeploy.operator
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: api.getAttribute("clouddeploy.googleapis.com/rolloutTarget", "") == "prod"
        title: Deploy to prod
    

    在此角色绑定中,condition 采用键值对形式,其中键为 expression,值为 CEL 表达式。此表达式引用一组关于该请求的上下文特性,计算结果为布尔值。

    在此示例中,当主账号尝试提升版本时,系统会对表达式进行求值,以确认提升目标与表达式中的目标相匹配。

    表达式使用 API 特性 clouddeploy.googleapis.com/rolloutTarget,这是主账号尝试提升到的目标。表达式将其与主帐号获得提升访问权限的目标进行比较。

  2. 为特定交付流水线设置绑定:

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    如果要为所有交付流水线设置此绑定,可以在项目级设置此绑定:

    gcloud projects set-iam-policy PROJECT POLICY_FILE
    

授予批准发布到特定目标的权限

本部分中的绑定为主账号授予批准流水线发布的权限,并包括针对 prod 目标应用权限的条件。

  1. 创建具有以下绑定的政策文件:

    bindings:
    - role: roles/clouddeploy.approver
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: api.getAttribute("clouddeploy.googleapis.com/rolloutTarget", "") == "prod"
        title: Deploy to prod
    

    在此角色绑定中,condition 采用键值对形式,其中键为 expression,值为 CEL 表达式。该表达式引用一组关于该请求的上下文特性,计算结果为布尔值。

    在此示例中,当正文尝试批准发布时,系统会对表达式进行求值,以确认目标与表达式中的目标相匹配。

    表达式使用 API 属性 clouddeploy.googleapis.com/rolloutTarget(其为发布的目标),并将其与正文获得批准访问权限的目标进行比较。clouddeploy.googleapis.com/rolloutTarget 特性是 Cloud Deploy 唯一支持的 API 特性。

  2. 为特定交付流水线设置绑定:

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    如果要为所有交付流水线设置此绑定,可以在项目级设置此绑定:

    gcloud projects set-iam-policy PROJECT POLICY_FILE
    

授予在特定时间段内提升版本的权限

本部分中的绑定为主账号授予提升流水线版本的权限,并包含指定时间段(绑定在该时间段生效)的条件。

  1. 创建具有以下绑定的政策文件:

    bindings:
    - role: roles/clouddeploy.operator
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: request.time.getDayOfWeek("America/Los_Angeles") > 0 && request.time.getDayOfWeek("America/Los_Angeles") < 6
        title: Promote during safe window
    

    在此角色绑定中,condition 采用键值对形式,其中键为 expression,值为 CEL 表达式。 该表达式引用一组关于该请求的上下文特性 ,计算结果为布尔值。此表达式会检查请求时间是否在周一到周五之间。

    在此示例中,当正文尝试提升版本时,系统会对表达式进行求值,以确认提升目标与表达式中的目标相匹配。

  2. 为特定交付流水线设置绑定:

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    如果要为所有交付流水线设置此绑定,可以在项目级设置此绑定:

    gcloud projects set-iam-policy PROJECT POLICY_FILE
    

授予在特定时间段内批准发布的权限

本部分中的绑定为主账号授予批准发布的权限,并包含指定时间段(绑定在该时间段内生效)的条件。

  1. 创建具有以下绑定的政策文件:

    bindings:
    - role: roles/clouddeploy.approver
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: request.time.getDayOfWeek("America/Los_Angeles") > 0 && request.time.getDayOfWeek("America/Los_Angeles") < 6
        title: Approve during safe window
    

    在此角色绑定中,condition 采用键值对形式,其中键为 expression,值为 CEL 表达式 ,其引用一组关于请求的上下文相关 特性 ,并且计算结果为布尔值。此表达式会检查请求时间是否在周一到周五之间。

    在此示例中,当正文尝试批准发布时,系统会对表达式进行求值,以确认发布目标与表达式中的目标相匹配。

  2. 为特定交付流水线设置绑定:

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    如果要为所有交付流水线设置此绑定,可以在项目级设置此绑定:

    gcloud projects set-iam-policy PROJECT POLICY_FILE
    

根据服务类型授予重试作业的权限

本部分中的绑定为主账号授予重试 Cloud Deploy 作业的权限,具体取决于作业类型

  1. 创建具有以下绑定的政策文件:

    bindings:
    - role: roles/clouddeploy.operator
      members:
      - serviceAccount:prod_operator@project-12345.iam.gserviceaccount.com
      condition:
        expression: api.getAttribute("clouddeploy.googleapis.com/jobType", "") == "deploy"
        title: Retry deploy job
    

    在此角色绑定中,condition 采用键值对形式,其中键为 expression,值为 CEL 表达式。该表达式引用一组关于该请求的上下文特性 ,计算结果为布尔值。

    在此示例中,当正文尝试重试作业时,系统会对表达式进行求值,以确认服务类型与表达式中的服务类型相匹配。

    表达式使用 API 特性 clouddeploy.googleapis.com/jobType,该特性 可以是 deployverify

  2. 为特定交付流水线设置绑定:

    gcloud deploy delivery-pipelines set-iam-policy PIPELINE_NAME --region=REGION POLICY_FILE
    

    如果要为所有交付流水线设置此绑定,可以在项目级设置此绑定:

    gcloud projects set-iam-policy PROJECT POLICY_FILE